Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file.
15 changes: 15 additions & 0 deletions feature_engine/_check_input_parameters/check_init_input_params.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@

def _check_param_missing_values(missing_values):
if missing_values not in ["raise", "ignore"]:
raise ValueError(
"missing_values takes only values 'raise' or 'ignore'. "
f"Got {missing_values} instead."
)


def _check_param_drop_original(drop_original):
if not isinstance(drop_original, bool):
raise TypeError(
"drop_original takes only boolean values True and False. "
f"Got {drop_original} instead."
)
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,13 @@ def _check_numerical_dict(dict_: Optional[dict]) -> Optional[dict]:

if isinstance(dict_, dict):
if not all([isinstance(x, (float, int)) for x in dict_.values()]):
raise ValueError("All values in the dictionary must be integer or float")
raise ValueError(
"All values in the dictionary must be integer or float. "
f"Got {dict_} instead."
)

elif dict_ is not None:
raise TypeError("The parameter can only take a dictionary or None")

raise TypeError(
f"The parameter can only take a dictionary or None. Got {dict_} instead."
)
return None
5 changes: 5 additions & 0 deletions feature_engine/_docstrings/methods.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,8 @@
_transform_encoders_docstring = """transform:
Encode the categories to numbers.
""".rstrip()

# used in creation module
_transform_creation_docstring = """transform:
Create new features.
""".rstrip()
21 changes: 6 additions & 15 deletions feature_engine/creation/base_creation.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.utils.validation import check_is_fitted

from feature_engine._check_input_parameters.check_init_input_params import (
_check_param_drop_original,
_check_param_missing_values,
)
from feature_engine._variable_handling.variable_type_selection import (
_find_or_check_numerical_variables,
)
Expand All @@ -19,27 +23,14 @@
class BaseCreation(BaseEstimator, TransformerMixin):
"""Shared set-up, checks and methods across creation transformers."""

_transform_docstring = """transform:
Create new features.
""".rstrip()

def __init__(
self,
missing_values: str = "raise",
drop_original: bool = False,
) -> None:

if missing_values not in ["raise", "ignore"]:
raise ValueError(
"missing_values takes only values 'raise' or 'ignore'. "
f"Got {missing_values} instead."
)

if not isinstance(drop_original, bool):
raise TypeError(
"drop_original takes only boolean values True and False. "
f"Got {drop_original} instead."
)
_check_param_missing_values(missing_values)
_check_param_drop_original(drop_original)

self.missing_values = missing_values
self.drop_original = drop_original
Expand Down
31 changes: 14 additions & 17 deletions feature_engine/creation/cyclical_features.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@

from feature_engine._base_transformers.base_numerical import BaseNumericalTransformer
from feature_engine._base_transformers.mixins import FitFromDictMixin
from feature_engine._check_input_parameters.check_init_input_params import (
_check_param_drop_original,
)
from feature_engine._check_input_parameters.check_input_dictionary import (
_check_numerical_dict,
)
from feature_engine._docstrings.fit_attributes import (
_feature_names_in_docstring,
_n_features_in_docstring,
Expand All @@ -15,7 +21,10 @@
_drop_original_docstring,
_variables_numerical_docstring,
)
from feature_engine._docstrings.methods import _fit_transform_docstring
from feature_engine._docstrings.methods import (
_fit_transform_docstring,
_transform_creation_docstring,
)
from feature_engine._docstrings.substitute import Substitution
from feature_engine._variable_handling.init_parameter_checks import (
_check_init_parameter_variables,
Expand All @@ -29,6 +38,7 @@
feature_names_in_=_feature_names_in_docstring,
n_features_in_=_n_features_in_docstring,
fit_transform=_fit_transform_docstring,
transform=_transform_creation_docstring,
)
class CyclicalFeatures(BaseNumericalTransformer, FitFromDictMixin):
"""
Expand Down Expand Up @@ -77,8 +87,7 @@ class CyclicalFeatures(BaseNumericalTransformer, FitFromDictMixin):

{fit_transform}

transform:
Adds new features.
{transform}

References
----------
Expand All @@ -94,20 +103,8 @@ def __init__(
drop_original: Optional[bool] = False,
) -> None:

if max_values:
if not isinstance(max_values, dict) or not all(
isinstance(var, (int, float)) for var in list(max_values.values())
):
raise TypeError(
"max_values takes a dictionary where the values are numerical. "
f"Got {max_values} instead."
)

if not isinstance(drop_original, bool):
raise TypeError(
"drop_original takes only boolean values True and False. "
f"Got {drop_original} instead."
)
_check_numerical_dict(max_values)
_check_param_drop_original(drop_original)

self.variables = _check_init_parameter_variables(variables)
self.max_values = max_values
Expand Down
3 changes: 2 additions & 1 deletion feature_engine/creation/math_features.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from feature_engine._docstrings.methods import (
_fit_not_learn_docstring,
_fit_transform_docstring,
_transform_creation_docstring,
)
from feature_engine._docstrings.substitute import Substitution
from feature_engine.creation.base_creation import BaseCreation
Expand All @@ -25,7 +26,7 @@
feature_names_in_=_feature_names_in_docstring,
n_features_in_=_n_features_in_docstring,
fit=_fit_not_learn_docstring,
transform=BaseCreation._transform_docstring,
transform=_transform_creation_docstring,
fit_transform=_fit_transform_docstring,
)
class MathFeatures(BaseCreation):
Expand Down
3 changes: 2 additions & 1 deletion feature_engine/creation/relative_features.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from feature_engine._docstrings.methods import (
_fit_not_learn_docstring,
_fit_transform_docstring,
_transform_creation_docstring,
)
from feature_engine._docstrings.substitute import Substitution
from feature_engine._variable_handling.variable_type_selection import (
Expand All @@ -41,7 +42,7 @@
feature_names_in_=_feature_names_in_docstring,
n_features_in_=_n_features_in_docstring,
fit=_fit_not_learn_docstring,
transform=BaseCreation._transform_docstring,
transform=_transform_creation_docstring,
fit_transform=_fit_transform_docstring,
)
class RelativeFeatures(BaseCreation):
Expand Down
4 changes: 3 additions & 1 deletion feature_engine/imputation/arbitrary_number.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@

import pandas as pd

from feature_engine._check_input_parameters.check_input_dictionary import (
_check_numerical_dict,
)
from feature_engine._docstrings.fit_attributes import (
_feature_names_in_docstring,
_n_features_in_docstring,
Expand All @@ -23,7 +26,6 @@
)
from feature_engine.dataframe_checks import check_X
from feature_engine.imputation.base_imputer import BaseImputer
from feature_engine.parameter_checks import _check_numerical_dict


@Substitution(
Expand Down
4 changes: 3 additions & 1 deletion feature_engine/outliers/artbitrary.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@

import pandas as pd

from feature_engine._check_input_parameters.check_input_dictionary import (
_check_numerical_dict,
)
from feature_engine._docstrings.fit_attributes import (
_feature_names_in_docstring,
_n_features_in_docstring,
Expand All @@ -26,7 +29,6 @@
check_X,
)
from feature_engine.outliers.base_outlier import BaseOutlier
from feature_engine.parameter_checks import _check_numerical_dict
from feature_engine.tags import _return_tags


Expand Down
2 changes: 1 addition & 1 deletion tests/test_creation/test_cyclical_features.py
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ def test_raises_error_when_init_parameters_not_permitted(df_cyclical):
# when max_values is not a dictionary
CyclicalFeatures(max_values=("dayi", 31))

with pytest.raises(TypeError):
with pytest.raises(ValueError):
# when max_values values are not integers or string
CyclicalFeatures(max_values={"day": "31"})

Expand Down
4 changes: 3 additions & 1 deletion tests/test_parameter_checks.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import pytest

from feature_engine.parameter_checks import _check_numerical_dict
from feature_engine._check_input_parameters.check_input_dictionary import (
_check_numerical_dict,
)


@pytest.mark.parametrize("input_dict", [{"a": 1, "b": "c"}, {1: 1, 2: "c"}])
Expand Down