Source code for skchange.utils.validation.parameters
"""Common validation functions for input parameters."""
from numbers import Number
import numpy as np
import pandas as pd
def check_none(value: Number, name: str, allow_none: bool = False) -> Number:
"""Check if value is None.
Parameters
----------
value : int, float
Value to check.
name : str
Name of the parameter to be shown in the error message.
allow_none : bool, optional (default=False)
Whether to allow None values.
Returns
-------
value : int, float
Input value.
Raises
------
ValueError
If value is None and allow_none is False.
"""
if not allow_none and value is None:
raise ValueError(f"{name} cannot be None.")
return value
[docs]
def check_larger_than(
min_value: Number, value: Number, name: str, allow_none: bool = False
) -> Number:
"""Check if value is non-negative.
Parameters
----------
min_value : int, float
Minimum allowed value.
value : int, float
Value to check.
name : str
Name of the parameter to be shown in the error message.
allow_none : bool, optional (default=False)
Whether to allow None values.
Returns
-------
value : int, float
Input value.
Raises
------
ValueError
If value is negative.
"""
check_none(value, name, allow_none)
if value is not None and value < min_value:
raise ValueError(f"{name} must be at least {min_value} ({name}={value}).")
return value
[docs]
def check_smaller_than(
max_value: Number, value: Number, name: str, allow_none: bool = False
) -> Number:
"""Check if value is non-negative.
Parameters
----------
max_value : int, float
Maximum allowed value.
value : int, float
Value to check.
name : str
Name of the parameter to be shown in the error message.
allow_none : bool, optional (default=False)
Whether to allow None values.
Returns
-------
value : int, float
Input value.
Raises
------
ValueError
If value is negative.
"""
check_none(value, name, allow_none)
if value is not None and value > max_value:
raise ValueError(f"{name} must be at most {max_value} ({name}={value}).")
return value
[docs]
def check_in_interval(
interval: pd.Interval,
value: Number,
name: str,
allow_none: bool = False,
) -> Number:
"""Check if value is non-negative.
Parameters
----------
interval : pd.Interval
Interval to check.
value : int, float
Value to check.
name : str
Name of the parameter to be shown in the error message.
allow_none : bool, optional (default=False)
Whether to allow None values.
Returns
-------
value : int, float
Input value.
Raises
------
ValueError
If value is negative.
"""
check_none(value, name, allow_none)
if value is not None and value not in interval:
raise ValueError(f"{name} must be in {interval} ({name}={value}).")
return value
def check_data_column(
data_column: int | str,
column_role: str,
X: np.ndarray,
X_columns: pd.Index | None,
) -> int:
"""Check that a data column name or index is valid.
Parameters
----------
data_column : int or str
Column index or name to check.
column_role : str
Role of the column (e.g., "Response").
X : np.ndarray
Data array.
X_columns : pd.Index or None
Column names of the data array.
Returns
-------
data_column : int
Column index.
"""
if isinstance(data_column, int):
if not 0 <= data_column < X.shape[1]:
raise ValueError(
f"{column_role} column index ({data_column}) must"
f" be between 0 and {X.shape[1] - 1}."
)
elif isinstance(data_column, str) and X_columns is not None:
if data_column not in X_columns:
raise ValueError(
f"{column_role} column ({data_column}) not found "
f"among the fit data columns: {X_columns}."
)
data_column = X_columns.get_loc(data_column)
else:
raise ValueError(
f"{column_role} column must be an integer in the range "
f"[0, {X.shape[1]}), or a valid column name. Got {data_column}."
)
return data_column