From 32f8c918ce1196c718fc1f3caad767df43ef8a5e Mon Sep 17 00:00:00 2001 From: methr0 Date: Fri, 26 May 2023 09:46:09 +0200 Subject: [PATCH 01/29] add Discretizer file --- .../tabular/transformation/_discretizer.py | 200 ++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 src/safeds/data/tabular/transformation/_discretizer.py diff --git a/src/safeds/data/tabular/transformation/_discretizer.py b/src/safeds/data/tabular/transformation/_discretizer.py new file mode 100644 index 000000000..f4fdbb5cd --- /dev/null +++ b/src/safeds/data/tabular/transformation/_discretizer.py @@ -0,0 +1,200 @@ +from __future__ import annotations + +import warnings + +from sklearn.preprocessing import KBinsDiscretizer as sk_KBinsDiscretizer + +from safeds.data.tabular.containers import Table +from safeds.data.tabular.transformation._table_transformer import TableTransformer +from safeds.exceptions import TransformerNotFittedError, UnknownColumnNameError + + +class Discretizer(TableTransformer): + """ + The Discretizer transforms replaces a continuous variable by a variable that only has a finite amount of values. + + Parameters + ---------- + number_of_bins: float + The number of bins to be created. + + Raises + ------ + ValueError + If the given number_of_bins is less than 2. + """ + + def __init__(self, number_of_bins: float = 5): + self._column_names: list[str] | None = None + self._wrapped_transformer: sk_KBinsDiscretizer | None = None + + if number_of_bins < 2: + raise ValueError("Parameter 'number_of_bins' must be >= 2.") + self.number_of_bins = number_of_bins + + def fit(self, table: Table, column_names: list[str] | None) -> Discretizer: + """ + Learn a transformation for a set of columns in a table. + + This transformer is not modified. + + Parameters + ---------- + table : Table + The table used to fit the transformer. + column_names : Optional[list[str]] + The list of columns from the table used to fit the transformer. If `None`, all columns are used. + + Returns + ------- + fitted_transformer : TableTransformer + The fitted transformer. + """ + if column_names is None: + column_names = table.column_names + else: + missing_columns = set(column_names) - set(table.column_names) + if len(missing_columns) > 0: + raise UnknownColumnNameError(list(missing_columns)) + + wrapped_transformer = sk_KBinsDiscretizer(n_bins=self.number_of_bins) + wrapped_transformer.fit(table._data[column_names]) + + result = Discretizer() + result._wrapped_transformer = wrapped_transformer + result._column_names = column_names + + return result + + def transform(self, table: Table) -> Table: + """ + Apply the learned transformation to a table. + + The table is not modified. + + Parameters + ---------- + table : Table + The table to which the learned transformation is applied. + + Returns + ------- + transformed_table : Table + The transformed table. + + Raises + ------ + TransformerNotFittedError + If the transformer has not been fitted yet. + """ + # Transformer has not been fitted yet + if self._wrapped_transformer is None or self._column_names is None: + raise TransformerNotFittedError + + # Input table does not contain all columns used to fit the transformer + missing_columns = set(self._column_names) - set(table.column_names) + if len(missing_columns) > 0: + raise UnknownColumnNameError(list(missing_columns)) + + data = table._data.copy() + data.columns = table.column_names + data[self._column_names] = self._wrapped_transformer.transform(data[self._column_names]) + return Table._from_pandas_dataframe(data) + + def inverse_transform(self, transformed_table: Table) -> Table: + """ + Undo the learned transformation. + + The table is not modified. + + Parameters + ---------- + transformed_table : Table + The table to be transformed back to the original version. + + Returns + ------- + table : Table + The original table. + + Raises + ------ + TransformerNotFittedError + If the transformer has not been fitted yet. + """ + # Transformer has not been fitted yet + if self._wrapped_transformer is None or self._column_names is None: + raise TransformerNotFittedError + + data = transformed_table._data.copy() + data.columns = transformed_table.column_names + data[self._column_names] = self._wrapped_transformer.inverse_transform(data[self._column_names]) + return Table._from_pandas_dataframe(data) + + def is_fitted(self) -> bool: + """ + Check if the transformer is fitted. + + Returns + ------- + is_fitted : bool + Whether the transformer is fitted. + """ + return self._wrapped_transformer is not None + + def get_names_of_added_columns(self) -> list[str]: + """ + Get the names of all new columns that have been added by the Discretizer. + + Returns + ------- + added_columns : list[str] + A list of names of the added columns, ordered as they will appear in the table. + + Raises + ------ + TransformerNotFittedError + If the transformer has not been fitted yet. + """ + warnings.warn("Discretizer only changes data within columns, but does not add any columns.", stacklevel=1) + if not self.is_fitted(): + raise TransformerNotFittedError + return [] + + # (Must implement abstract method, cannot instantiate class otherwise.) + def get_names_of_changed_columns(self) -> list[str]: + """ + Get the names of all columns that may have been changed by the Discretizer. + + Returns + ------- + changed_columns : list[str] + The list of (potentially) changed column names, as passed to fit. + + Raises + ------ + TransformerNotFittedError + If the transformer has not been fitted yet. + """ + if self._column_names is None: + raise TransformerNotFittedError + return self._column_names + + def get_names_of_removed_columns(self) -> list[str]: + """ + Get the names of all columns that have been removed by the Discretizer. + + Returns + ------- + removed_columns : list[str] + A list of names of the removed columns, ordered as they appear in the table the Discretizer was fitted on. + + Raises + ------ + TransformerNotFittedError + If the transformer has not been fitted yet. + """ + warnings.warn("Discretizer only changes data within columns, but does not remove any columns.", stacklevel=1) + if not self.is_fitted(): + raise TransformerNotFittedError + return [] From b2705e5bf666eaed8920929261e049aa053ab7e8 Mon Sep 17 00:00:00 2001 From: methr0 Date: Fri, 26 May 2023 13:06:09 +0200 Subject: [PATCH 02/29] add tests for Discretizer --- .../tabular/transformation/_discretizer.py | 3 +- .../transformation/test_discretizer.py | 290 ++++++++++++++++++ 2 files changed, 292 insertions(+), 1 deletion(-) create mode 100644 tests/safeds/data/tabular/transformation/test_discretizer.py diff --git a/src/safeds/data/tabular/transformation/_discretizer.py b/src/safeds/data/tabular/transformation/_discretizer.py index f4fdbb5cd..cf2a37119 100644 --- a/src/safeds/data/tabular/transformation/_discretizer.py +++ b/src/safeds/data/tabular/transformation/_discretizer.py @@ -103,8 +103,9 @@ def transform(self, table: Table) -> Table: def inverse_transform(self, transformed_table: Table) -> Table: """ - Undo the learned transformation. + Transform discretized data back to original feature space. + Note that this function does not regenerate the original data due to discretization rounding. The table is not modified. Parameters diff --git a/tests/safeds/data/tabular/transformation/test_discretizer.py b/tests/safeds/data/tabular/transformation/test_discretizer.py new file mode 100644 index 000000000..40600ce6c --- /dev/null +++ b/tests/safeds/data/tabular/transformation/test_discretizer.py @@ -0,0 +1,290 @@ +import pytest +from safeds.data.tabular.containers import Table +from safeds.data.tabular.transformation._discretizer import Discretizer +from safeds.exceptions import TransformerNotFittedError, UnknownColumnNameError + + +class TestInit: + def test_should_raise_value_error(self) -> None: + with pytest.raises(ValueError, match="Parameter 'number_of_bins' must be >= 2."): + _ = Discretizer(1) + + +class TestFit: + def test_should_raise_if_column_not_found(self) -> None: + table = Table( + { + "col1": [0.0, 5.0, 10.0], + }, + ) + + with pytest.raises(UnknownColumnNameError): + Discretizer().fit(table, ["col2"]) + + def test_should_not_change_original_transformer(self) -> None: + table = Table( + { + "col1": [0.0, 5.0, 10.0], + }, + ) + + transformer = Discretizer() + transformer.fit(table, None) + + assert transformer._wrapped_transformer is None + assert transformer._column_names is None + + +class TestTransform: + def test_should_raise_if_column_not_found(self) -> None: + table_to_fit = Table( + { + "col1": [0.0, 5.0, 10.0], + }, + ) + + transformer = Discretizer().fit(table_to_fit, None) + + table_to_transform = Table( + { + "col2": ["a", "b", "c"], + }, + ) + + with pytest.raises(UnknownColumnNameError): + transformer.transform(table_to_transform) + + def test_should_raise_if_not_fitted(self) -> None: + table = Table( + { + "col1": [0.0, 5.0, 10.0], + }, + ) + + transformer = Discretizer() + + with pytest.raises(TransformerNotFittedError): + transformer.transform(table) + + +class TestIsFitted: + def test_should_return_false_before_fitting(self) -> None: + transformer = Discretizer() + assert not transformer.is_fitted() + + def test_should_return_true_after_fitting(self) -> None: + table = Table( + { + "col1": [0.0, 5.0, 10.0], + }, + ) + + transformer = Discretizer() + fitted_transformer = transformer.fit(table, None) + assert fitted_transformer.is_fitted() + + +class TestFitAndTransform: + # the return value has a formate with "(0,int)\t1.0" and I don't understand how that happens and how the test should look like... + @pytest.mark.parametrize( + ("table", "column_names", "expected"), + [ + ( + Table( + { + "col1": [0.0, 5.0, 5.0, 10.0], + }, + ), + None, + Table( + { + "col1": [0.0, 5.0, 5.0, 10.0], + }, + ), + ), + ( + Table( + { + "col1": [0.0, 5.0, 5.0, 10.0], + "col2": [0.0, 5.0, 5.0, 10.0], + }, + ), + ["col1"], + Table( + { + "col1": ["(0, 0)\t1.0", "(0, 2)\t1.0","(0, 2)\t1.0", "(0, 3)\t1.0"], + "col2": [0.0, 5.0, 5.0, 10.0], + }, + ), + ), + ], + ids=["None", "col1"] + ) + def test_should_return_transformed_table( + self, + table: Table, + column_names: list[str] | None, + expected: Table, + ) -> None: + + assert Discretizer().fit_and_transform(table, column_names) == expected + + @pytest.mark.parametrize( + ("table", "number_of_bins", "expected"), + [ + ( + Table( + { + "col1": [0.0, 5.0, 5.0, 10.0], + }, + ), + 2, + Table( + { + "col1": [0, 1.0, 1.0, 1.0], + }, + ), + ), + ( + Table( + { + "col1": [0.0, 5.0, 5.0, 10.0], + }, + ), + 10, + Table( + { + "col1": [0.0, 4.0, 4.0, 7.0], + }, + ), + ), + ], + ids=["2", "10"] + ) + def test_should_return_transformed_table_with_correct_number_of_bins( + self, + table: Table, + number_of_bins: int, + expected: Table, + ) -> None: + print(Discretizer(number_of_bins).fit_and_transform(table, ["col1"])) + assert Discretizer(number_of_bins).fit_and_transform(table, ["col1"]) == expected + + def test_should_not_change_original_table(self) -> None: + table = Table( + { + "col1": [0.0, 5.0, 10.0], + }, + ) + + Discretizer().fit_and_transform(table) + + expected = Table( + { + "col1": [0.0, 5.0, 10.0], + }, + ) + + assert table == expected + + def test_get_names_of_added_columns(self) -> None: + transformer = Discretizer() + with pytest.warns( + UserWarning, + match="Discretizer only changes data within columns, but does not add any columns.", + ), pytest.raises(TransformerNotFittedError): + transformer.get_names_of_added_columns() + + table = Table( + { + "a": [0.0], + }, + ) + transformer = transformer.fit(table, None) + with pytest.warns( + UserWarning, + match="Discretizer only changes data within columns, but does not add any columns.", + ): + assert transformer.get_names_of_added_columns() == [] + + def test_get_names_of_changed_columns(self) -> None: + transformer = Discretizer() + with pytest.raises(TransformerNotFittedError): + transformer.get_names_of_changed_columns() + table = Table( + { + "a": [0.0], + }, + ) + transformer = transformer.fit(table, None) + assert transformer.get_names_of_changed_columns() == ["a"] + + def test_get_names_of_removed_columns(self) -> None: + transformer = Discretizer() + with pytest.warns( + UserWarning, + match="Discretizer only changes data within columns, but does not remove any columns.", + ), pytest.raises(TransformerNotFittedError): + transformer.get_names_of_removed_columns() + + table = Table( + { + "a": [0.0], + }, + ) + transformer = transformer.fit(table, None) + with pytest.warns( + UserWarning, + match="Discretizer only changes data within columns, but does not remove any columns.", + ): + assert transformer.get_names_of_removed_columns() == [] + + +class TestInverseTransform: + # inverse_transform doesn't regenerate the old table, it just transforms the discretized data back to original feature space + # need to test if the features are the same + @pytest.mark.parametrize( + "table", + [ + Table( + { + "col1": [0.0, 5.0, 5.0, 10.0], + }, + ), + ], + ) + def test_should_return_original_table(self, table: Table) -> None: + transformer = Discretizer().fit(table, None) + + assert transformer.inverse_transform(transformer.transform(table)) == table + + def test_should_not_change_transformed_table(self) -> None: + table = Table( + { + "col1": [0.0, 0.5, 1.0], + }, + ) + + transformer = Discretizer().fit(table, None) + transformed_table = transformer.transform(table) + transformer.inverse_transform(transformed_table) + + expected = Table( + { + "col1": [0.0, 0.5, 1.0], + }, + ) + + assert transformed_table == expected + + def test_should_raise_if_not_fitted(self) -> None: + table = Table( + { + "col1": [0.0, 5.0, 5.0, 10.0], + }, + ) + + transformer = Discretizer() + + with pytest.raises(TransformerNotFittedError): + transformer.inverse_transform(table) From d88cdec6e7fdd9c0366da1d4f6d13244a82d1e19 Mon Sep 17 00:00:00 2001 From: methr0 Date: Fri, 26 May 2023 17:16:24 +0200 Subject: [PATCH 03/29] added Discretizer to init file remove warnings remove inverse_transform bc the Discretizer isn't invertable --- .../data/tabular/transformation/__init__.py | 2 + .../tabular/transformation/_discretizer.py | 32 -------- .../transformation/test_discretizer.py | 74 ++----------------- 3 files changed, 7 insertions(+), 101 deletions(-) diff --git a/src/safeds/data/tabular/transformation/__init__.py b/src/safeds/data/tabular/transformation/__init__.py index e8af96cd7..07c4b7f38 100644 --- a/src/safeds/data/tabular/transformation/__init__.py +++ b/src/safeds/data/tabular/transformation/__init__.py @@ -1,5 +1,6 @@ """Classes for transforming tabular data.""" +from ._discretizer import Discretizer from ._imputer import Imputer from ._label_encoder import LabelEncoder from ._one_hot_encoder import OneHotEncoder @@ -13,4 +14,5 @@ "InvertibleTableTransformer", "TableTransformer", "RangeScaler", + "Discretizer" ] diff --git a/src/safeds/data/tabular/transformation/_discretizer.py b/src/safeds/data/tabular/transformation/_discretizer.py index cf2a37119..b4fb97d8a 100644 --- a/src/safeds/data/tabular/transformation/_discretizer.py +++ b/src/safeds/data/tabular/transformation/_discretizer.py @@ -101,36 +101,6 @@ def transform(self, table: Table) -> Table: data[self._column_names] = self._wrapped_transformer.transform(data[self._column_names]) return Table._from_pandas_dataframe(data) - def inverse_transform(self, transformed_table: Table) -> Table: - """ - Transform discretized data back to original feature space. - - Note that this function does not regenerate the original data due to discretization rounding. - The table is not modified. - - Parameters - ---------- - transformed_table : Table - The table to be transformed back to the original version. - - Returns - ------- - table : Table - The original table. - - Raises - ------ - TransformerNotFittedError - If the transformer has not been fitted yet. - """ - # Transformer has not been fitted yet - if self._wrapped_transformer is None or self._column_names is None: - raise TransformerNotFittedError - - data = transformed_table._data.copy() - data.columns = transformed_table.column_names - data[self._column_names] = self._wrapped_transformer.inverse_transform(data[self._column_names]) - return Table._from_pandas_dataframe(data) def is_fitted(self) -> bool: """ @@ -157,7 +127,6 @@ def get_names_of_added_columns(self) -> list[str]: TransformerNotFittedError If the transformer has not been fitted yet. """ - warnings.warn("Discretizer only changes data within columns, but does not add any columns.", stacklevel=1) if not self.is_fitted(): raise TransformerNotFittedError return [] @@ -195,7 +164,6 @@ def get_names_of_removed_columns(self) -> list[str]: TransformerNotFittedError If the transformer has not been fitted yet. """ - warnings.warn("Discretizer only changes data within columns, but does not remove any columns.", stacklevel=1) if not self.is_fitted(): raise TransformerNotFittedError return [] diff --git a/tests/safeds/data/tabular/transformation/test_discretizer.py b/tests/safeds/data/tabular/transformation/test_discretizer.py index 40600ce6c..c5701cd66 100644 --- a/tests/safeds/data/tabular/transformation/test_discretizer.py +++ b/tests/safeds/data/tabular/transformation/test_discretizer.py @@ -167,7 +167,7 @@ def test_should_return_transformed_table_with_correct_number_of_bins( number_of_bins: int, expected: Table, ) -> None: - print(Discretizer(number_of_bins).fit_and_transform(table, ["col1"])) + assert Discretizer(number_of_bins).fit_and_transform(table, ["col1"]) == expected def test_should_not_change_original_table(self) -> None: @@ -189,10 +189,7 @@ def test_should_not_change_original_table(self) -> None: def test_get_names_of_added_columns(self) -> None: transformer = Discretizer() - with pytest.warns( - UserWarning, - match="Discretizer only changes data within columns, but does not add any columns.", - ), pytest.raises(TransformerNotFittedError): + with pytest.raises(TransformerNotFittedError): transformer.get_names_of_added_columns() table = Table( @@ -201,11 +198,7 @@ def test_get_names_of_added_columns(self) -> None: }, ) transformer = transformer.fit(table, None) - with pytest.warns( - UserWarning, - match="Discretizer only changes data within columns, but does not add any columns.", - ): - assert transformer.get_names_of_added_columns() == [] + assert transformer.get_names_of_added_columns() == [] def test_get_names_of_changed_columns(self) -> None: transformer = Discretizer() @@ -221,10 +214,7 @@ def test_get_names_of_changed_columns(self) -> None: def test_get_names_of_removed_columns(self) -> None: transformer = Discretizer() - with pytest.warns( - UserWarning, - match="Discretizer only changes data within columns, but does not remove any columns.", - ), pytest.raises(TransformerNotFittedError): + with pytest.raises(TransformerNotFittedError): transformer.get_names_of_removed_columns() table = Table( @@ -233,58 +223,4 @@ def test_get_names_of_removed_columns(self) -> None: }, ) transformer = transformer.fit(table, None) - with pytest.warns( - UserWarning, - match="Discretizer only changes data within columns, but does not remove any columns.", - ): - assert transformer.get_names_of_removed_columns() == [] - - -class TestInverseTransform: - # inverse_transform doesn't regenerate the old table, it just transforms the discretized data back to original feature space - # need to test if the features are the same - @pytest.mark.parametrize( - "table", - [ - Table( - { - "col1": [0.0, 5.0, 5.0, 10.0], - }, - ), - ], - ) - def test_should_return_original_table(self, table: Table) -> None: - transformer = Discretizer().fit(table, None) - - assert transformer.inverse_transform(transformer.transform(table)) == table - - def test_should_not_change_transformed_table(self) -> None: - table = Table( - { - "col1": [0.0, 0.5, 1.0], - }, - ) - - transformer = Discretizer().fit(table, None) - transformed_table = transformer.transform(table) - transformer.inverse_transform(transformed_table) - - expected = Table( - { - "col1": [0.0, 0.5, 1.0], - }, - ) - - assert transformed_table == expected - - def test_should_raise_if_not_fitted(self) -> None: - table = Table( - { - "col1": [0.0, 5.0, 5.0, 10.0], - }, - ) - - transformer = Discretizer() - - with pytest.raises(TransformerNotFittedError): - transformer.inverse_transform(table) + assert transformer.get_names_of_removed_columns() == [] From 7a21a52f0d33833324c07a2e266e5414f7087eeb Mon Sep 17 00:00:00 2001 From: megalinter-bot <129584137+megalinter-bot@users.noreply.github.com> Date: Fri, 26 May 2023 15:18:32 +0000 Subject: [PATCH 04/29] style: apply automated linter fixes --- src/safeds/data/tabular/transformation/__init__.py | 2 +- src/safeds/data/tabular/transformation/_discretizer.py | 3 --- .../data/tabular/transformation/test_discretizer.py | 8 +++----- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/safeds/data/tabular/transformation/__init__.py b/src/safeds/data/tabular/transformation/__init__.py index 07c4b7f38..286219667 100644 --- a/src/safeds/data/tabular/transformation/__init__.py +++ b/src/safeds/data/tabular/transformation/__init__.py @@ -14,5 +14,5 @@ "InvertibleTableTransformer", "TableTransformer", "RangeScaler", - "Discretizer" + "Discretizer", ] diff --git a/src/safeds/data/tabular/transformation/_discretizer.py b/src/safeds/data/tabular/transformation/_discretizer.py index b4fb97d8a..89e44e259 100644 --- a/src/safeds/data/tabular/transformation/_discretizer.py +++ b/src/safeds/data/tabular/transformation/_discretizer.py @@ -1,7 +1,5 @@ from __future__ import annotations -import warnings - from sklearn.preprocessing import KBinsDiscretizer as sk_KBinsDiscretizer from safeds.data.tabular.containers import Table @@ -101,7 +99,6 @@ def transform(self, table: Table) -> Table: data[self._column_names] = self._wrapped_transformer.transform(data[self._column_names]) return Table._from_pandas_dataframe(data) - def is_fitted(self) -> bool: """ Check if the transformer is fitted. diff --git a/tests/safeds/data/tabular/transformation/test_discretizer.py b/tests/safeds/data/tabular/transformation/test_discretizer.py index c5701cd66..894b6f266 100644 --- a/tests/safeds/data/tabular/transformation/test_discretizer.py +++ b/tests/safeds/data/tabular/transformation/test_discretizer.py @@ -112,13 +112,13 @@ class TestFitAndTransform: ["col1"], Table( { - "col1": ["(0, 0)\t1.0", "(0, 2)\t1.0","(0, 2)\t1.0", "(0, 3)\t1.0"], + "col1": ["(0, 0)\t1.0", "(0, 2)\t1.0", "(0, 2)\t1.0", "(0, 3)\t1.0"], "col2": [0.0, 5.0, 5.0, 10.0], }, ), ), ], - ids=["None", "col1"] + ids=["None", "col1"], ) def test_should_return_transformed_table( self, @@ -126,7 +126,6 @@ def test_should_return_transformed_table( column_names: list[str] | None, expected: Table, ) -> None: - assert Discretizer().fit_and_transform(table, column_names) == expected @pytest.mark.parametrize( @@ -159,7 +158,7 @@ def test_should_return_transformed_table( ), ), ], - ids=["2", "10"] + ids=["2", "10"], ) def test_should_return_transformed_table_with_correct_number_of_bins( self, @@ -167,7 +166,6 @@ def test_should_return_transformed_table_with_correct_number_of_bins( number_of_bins: int, expected: Table, ) -> None: - assert Discretizer(number_of_bins).fit_and_transform(table, ["col1"]) == expected def test_should_not_change_original_table(self) -> None: From 432fde4318026cf1a3abbd9a48eddb43ef64edd4 Mon Sep 17 00:00:00 2001 From: methr0 Date: Fri, 26 May 2023 17:27:59 +0200 Subject: [PATCH 05/29] removed comment --- tests/safeds/data/tabular/transformation/test_discretizer.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/safeds/data/tabular/transformation/test_discretizer.py b/tests/safeds/data/tabular/transformation/test_discretizer.py index c5701cd66..27a8e0761 100644 --- a/tests/safeds/data/tabular/transformation/test_discretizer.py +++ b/tests/safeds/data/tabular/transformation/test_discretizer.py @@ -1,6 +1,6 @@ import pytest from safeds.data.tabular.containers import Table -from safeds.data.tabular.transformation._discretizer import Discretizer +from safeds.data.tabular.transformation import Discretizer from safeds.exceptions import TransformerNotFittedError, UnknownColumnNameError @@ -85,7 +85,6 @@ def test_should_return_true_after_fitting(self) -> None: class TestFitAndTransform: - # the return value has a formate with "(0,int)\t1.0" and I don't understand how that happens and how the test should look like... @pytest.mark.parametrize( ("table", "column_names", "expected"), [ From 8ff87bb22d31d462e28c24b3215db804519c59e4 Mon Sep 17 00:00:00 2001 From: methr0 Date: Fri, 9 Jun 2023 11:15:16 +0200 Subject: [PATCH 06/29] trying to fix the test but it doesn't work --- tests/safeds/data/tabular/transformation/test_discretizer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/safeds/data/tabular/transformation/test_discretizer.py b/tests/safeds/data/tabular/transformation/test_discretizer.py index bc58a425f..94ab2ef60 100644 --- a/tests/safeds/data/tabular/transformation/test_discretizer.py +++ b/tests/safeds/data/tabular/transformation/test_discretizer.py @@ -97,7 +97,7 @@ class TestFitAndTransform: None, Table( { - "col1": [0.0, 5.0, 5.0, 10.0], + "col1": [" (0, 0)\t1.0", " (0, 2)\t1.0", " (0, 2)\t1.0", " (0, 3)\t1.0"], }, ), ), @@ -111,7 +111,7 @@ class TestFitAndTransform: ["col1"], Table( { - "col1": ["(0, 0)\t1.0", "(0, 2)\t1.0", "(0, 2)\t1.0", "(0, 3)\t1.0"], + "col1": [" (0, 0)\t1.0", " (0, 2)\t1.0", " (0, 2)\t1.0", " (0, 3)\t1.0"], "col2": [0.0, 5.0, 5.0, 10.0], }, ), From 2e8cf275ad5f00a2a008a74dd0119cf9c9c48465 Mon Sep 17 00:00:00 2001 From: methr0 Date: Fri, 23 Jun 2023 09:30:20 +0200 Subject: [PATCH 07/29] requested changes --- src/safeds/data/tabular/transformation/_discretizer.py | 6 +++--- .../safeds/data/tabular/transformation/test_discretizer.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/safeds/data/tabular/transformation/_discretizer.py b/src/safeds/data/tabular/transformation/_discretizer.py index 89e44e259..b12e3bed2 100644 --- a/src/safeds/data/tabular/transformation/_discretizer.py +++ b/src/safeds/data/tabular/transformation/_discretizer.py @@ -28,7 +28,7 @@ def __init__(self, number_of_bins: float = 5): if number_of_bins < 2: raise ValueError("Parameter 'number_of_bins' must be >= 2.") - self.number_of_bins = number_of_bins + self._number_of_bins = number_of_bins def fit(self, table: Table, column_names: list[str] | None) -> Discretizer: """ @@ -55,10 +55,10 @@ def fit(self, table: Table, column_names: list[str] | None) -> Discretizer: if len(missing_columns) > 0: raise UnknownColumnNameError(list(missing_columns)) - wrapped_transformer = sk_KBinsDiscretizer(n_bins=self.number_of_bins) + wrapped_transformer = sk_KBinsDiscretizer(n_bins=self._number_of_bins, encode="ordinal") wrapped_transformer.fit(table._data[column_names]) - result = Discretizer() + result = Discretizer(self._number_of_bins) result._wrapped_transformer = wrapped_transformer result._column_names = column_names diff --git a/tests/safeds/data/tabular/transformation/test_discretizer.py b/tests/safeds/data/tabular/transformation/test_discretizer.py index 94ab2ef60..b62023a30 100644 --- a/tests/safeds/data/tabular/transformation/test_discretizer.py +++ b/tests/safeds/data/tabular/transformation/test_discretizer.py @@ -97,7 +97,7 @@ class TestFitAndTransform: None, Table( { - "col1": [" (0, 0)\t1.0", " (0, 2)\t1.0", " (0, 2)\t1.0", " (0, 3)\t1.0"], + "col1": [0.0, 2.0, 2.0, 3.0], }, ), ), @@ -111,7 +111,7 @@ class TestFitAndTransform: ["col1"], Table( { - "col1": [" (0, 0)\t1.0", " (0, 2)\t1.0", " (0, 2)\t1.0", " (0, 3)\t1.0"], + "col1": [0.0, 2.0, 2.0, 3.0], "col2": [0.0, 5.0, 5.0, 10.0], }, ), From a3e46bbb3f7480dc6cf456f50668b6492d50ff16 Mon Sep 17 00:00:00 2001 From: methr0 Date: Fri, 23 Jun 2023 11:04:41 +0200 Subject: [PATCH 08/29] requested changes --- src/safeds/data/tabular/transformation/_discretizer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/safeds/data/tabular/transformation/_discretizer.py b/src/safeds/data/tabular/transformation/_discretizer.py index b12e3bed2..c06816f9c 100644 --- a/src/safeds/data/tabular/transformation/_discretizer.py +++ b/src/safeds/data/tabular/transformation/_discretizer.py @@ -3,13 +3,13 @@ from sklearn.preprocessing import KBinsDiscretizer as sk_KBinsDiscretizer from safeds.data.tabular.containers import Table -from safeds.data.tabular.transformation._table_transformer import TableTransformer +from safeds.data.tabular.transformation import TableTransformer from safeds.exceptions import TransformerNotFittedError, UnknownColumnNameError class Discretizer(TableTransformer): """ - The Discretizer transforms replaces a continuous variable by a variable that only has a finite amount of values. + The Discretizer bins continuous data into intervals. Parameters ---------- From b33a95f433be1003f1ec238c9193bb5e52fbade5 Mon Sep 17 00:00:00 2001 From: methr0 Date: Fri, 23 Jun 2023 11:26:03 +0200 Subject: [PATCH 09/29] import changes --- src/safeds/data/tabular/transformation/_discretizer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/safeds/data/tabular/transformation/_discretizer.py b/src/safeds/data/tabular/transformation/_discretizer.py index c06816f9c..d5d71b3ee 100644 --- a/src/safeds/data/tabular/transformation/_discretizer.py +++ b/src/safeds/data/tabular/transformation/_discretizer.py @@ -3,7 +3,7 @@ from sklearn.preprocessing import KBinsDiscretizer as sk_KBinsDiscretizer from safeds.data.tabular.containers import Table -from safeds.data.tabular.transformation import TableTransformer +from safeds.data.tabular.transformation._table_transformer import TableTransformer from safeds.exceptions import TransformerNotFittedError, UnknownColumnNameError From b3d6baf65b1e6fb71907d061c7c8e9d8e11c1dc2 Mon Sep 17 00:00:00 2001 From: methr0 Date: Fri, 30 Jun 2023 10:53:23 +0200 Subject: [PATCH 10/29] add ValueError and NonNumericColumnError and test them --- .../tabular/transformation/_discretizer.py | 29 +++++++ .../transformation/test_discretizer.py | 81 +++++++++++++++---- 2 files changed, 94 insertions(+), 16 deletions(-) diff --git a/src/safeds/data/tabular/transformation/_discretizer.py b/src/safeds/data/tabular/transformation/_discretizer.py index d5d71b3ee..ab6d377e2 100644 --- a/src/safeds/data/tabular/transformation/_discretizer.py +++ b/src/safeds/data/tabular/transformation/_discretizer.py @@ -6,6 +6,8 @@ from safeds.data.tabular.transformation._table_transformer import TableTransformer from safeds.exceptions import TransformerNotFittedError, UnknownColumnNameError +from src.safeds.exceptions._data import NonNumericColumnError + class Discretizer(TableTransformer): """ @@ -47,10 +49,26 @@ def fit(self, table: Table, column_names: list[str] | None) -> Discretizer: ------- fitted_transformer : TableTransformer The fitted transformer. + + Raises + ------ + ValueError + If the table is empty. + NonNumericColumnError + If one of the columns, that should be fitted is not numeric. + UnknownColumnNameError + If one of the columns, that should be fitted is not in the table. """ + if table.number_of_rows == 0: + raise ValueError("The Discretizer cannot be fitted because the table contains 0 rows") + if column_names is None: column_names = table.column_names else: + for column in column_names: + if not table.get_column(column).type.is_numeric(): + raise NonNumericColumnError(f"{column} is of type {table.get_column(column).type}.") + missing_columns = set(column_names) - set(table.column_names) if len(missing_columns) > 0: raise UnknownColumnNameError(list(missing_columns)) @@ -84,11 +102,22 @@ def transform(self, table: Table) -> Table: ------ TransformerNotFittedError If the transformer has not been fitted yet. + ValueError + If the table is empty. + NonNumericColumnError + If one of the columns, that should be fitted is not numeric. """ # Transformer has not been fitted yet if self._wrapped_transformer is None or self._column_names is None: raise TransformerNotFittedError + if table.number_of_rows == 0: + raise ValueError("The table cannot be transformed because it contains 0 rows") + + for column in self._column_names: + if not table.get_column(column).type.is_numeric(): + raise NonNumericColumnError(f"{column} is of type {table.get_column(column).type}.") + # Input table does not contain all columns used to fit the transformer missing_columns = set(self._column_names) - set(table.column_names) if len(missing_columns) > 0: diff --git a/tests/safeds/data/tabular/transformation/test_discretizer.py b/tests/safeds/data/tabular/transformation/test_discretizer.py index b62023a30..15b4f2716 100644 --- a/tests/safeds/data/tabular/transformation/test_discretizer.py +++ b/tests/safeds/data/tabular/transformation/test_discretizer.py @@ -3,6 +3,8 @@ from safeds.data.tabular.transformation import Discretizer from safeds.exceptions import TransformerNotFittedError, UnknownColumnNameError +from src.safeds.exceptions._data import NonNumericColumnError + class TestInit: def test_should_raise_value_error(self) -> None: @@ -11,14 +13,38 @@ def test_should_raise_value_error(self) -> None: class TestFit: - def test_should_raise_if_column_not_found(self) -> None: - table = Table( - { - "col1": [0.0, 5.0, 10.0], - }, - ) - - with pytest.raises(UnknownColumnNameError): + @pytest.mark.parametrize( + ("table", "error", "error_message"), + [ + ( + Table( + { + "col1": [0.0, 5.0, 5.0, 10.0], + }, + ), + UnknownColumnNameError, + r"Could not find column\(s\) 'col2'" + ), + ( + Table(), + ValueError, + "The Discretizer cannot be fitted because the table contains 0 rows" + ), + ( + Table( + { + "col1": [0.0, 5.0, 5.0, 10.0], + "col2": ["a", "b", "c", "d"], + }, + ), + NonNumericColumnError, + f"Tried to do a numerical operation on one or multiple non-numerical columns: \ncol2 is of type String." + ), + ], + ids=["UnknownColumnNameError", "ValueError", "NonNumericColumnError"], + ) + def test_should_raise_errors(self, table: Table, error: type[Exception], error_message: str) -> None: + with pytest.raises(error, match=error_message): Discretizer().fit(table, ["col2"]) def test_should_not_change_original_transformer(self) -> None: @@ -36,7 +62,36 @@ def test_should_not_change_original_transformer(self) -> None: class TestTransform: - def test_should_raise_if_column_not_found(self) -> None: + @pytest.mark.parametrize( + ("table_to_transform", "error", "error_message"), + [ + ( + Table( + { + "col2": ["a", "b", "c"], + }, + ), + UnknownColumnNameError, + r"Could not find column\(s\) 'col1'" + ), + ( + Table(), + ValueError, + "The table cannot be transformed because it contains 0 rows" + ), + ( + Table( + { + "col1": ["a", "b", "c", "d"], + }, + ), + NonNumericColumnError, + f"Tried to do a numerical operation on one or multiple non-numerical columns: \ncol1 is of type String." + ), + ], + ids=["UnknownColumnNameError", "ValueError", "NonNumericColumnError"], + ) + def test_should_raise_errors(self, table_to_transform: Table, error: type[Exception], error_message: str) -> None: table_to_fit = Table( { "col1": [0.0, 5.0, 10.0], @@ -45,13 +100,7 @@ def test_should_raise_if_column_not_found(self) -> None: transformer = Discretizer().fit(table_to_fit, None) - table_to_transform = Table( - { - "col2": ["a", "b", "c"], - }, - ) - - with pytest.raises(UnknownColumnNameError): + with pytest.raises(error, match=error_message): transformer.transform(table_to_transform) def test_should_raise_if_not_fitted(self) -> None: From 0435b5592cea827087697be77eec9e51669c60f2 Mon Sep 17 00:00:00 2001 From: methr0 Date: Fri, 30 Jun 2023 10:58:34 +0200 Subject: [PATCH 11/29] fixed import --- src/safeds/data/tabular/transformation/_discretizer.py | 5 +---- tests/safeds/data/tabular/transformation/test_discretizer.py | 4 +--- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/safeds/data/tabular/transformation/_discretizer.py b/src/safeds/data/tabular/transformation/_discretizer.py index ab6d377e2..991636971 100644 --- a/src/safeds/data/tabular/transformation/_discretizer.py +++ b/src/safeds/data/tabular/transformation/_discretizer.py @@ -4,10 +4,7 @@ from safeds.data.tabular.containers import Table from safeds.data.tabular.transformation._table_transformer import TableTransformer -from safeds.exceptions import TransformerNotFittedError, UnknownColumnNameError - -from src.safeds.exceptions._data import NonNumericColumnError - +from safeds.exceptions import TransformerNotFittedError, UnknownColumnNameError, NonNumericColumnError class Discretizer(TableTransformer): """ diff --git a/tests/safeds/data/tabular/transformation/test_discretizer.py b/tests/safeds/data/tabular/transformation/test_discretizer.py index 15b4f2716..a4d360c2e 100644 --- a/tests/safeds/data/tabular/transformation/test_discretizer.py +++ b/tests/safeds/data/tabular/transformation/test_discretizer.py @@ -1,9 +1,7 @@ import pytest from safeds.data.tabular.containers import Table from safeds.data.tabular.transformation import Discretizer -from safeds.exceptions import TransformerNotFittedError, UnknownColumnNameError - -from src.safeds.exceptions._data import NonNumericColumnError +from safeds.exceptions import TransformerNotFittedError, UnknownColumnNameError, NonNumericColumnError class TestInit: From cf55a5e83a85ed4e6b57bbcf2d7008439ee1a6c0 Mon Sep 17 00:00:00 2001 From: megalinter-bot <129584137+megalinter-bot@users.noreply.github.com> Date: Fri, 30 Jun 2023 09:00:24 +0000 Subject: [PATCH 12/29] style: apply automated linter fixes --- .../tabular/transformation/_discretizer.py | 3 +- .../transformation/test_discretizer.py | 28 +++++++++---------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/safeds/data/tabular/transformation/_discretizer.py b/src/safeds/data/tabular/transformation/_discretizer.py index 991636971..41d6b06ad 100644 --- a/src/safeds/data/tabular/transformation/_discretizer.py +++ b/src/safeds/data/tabular/transformation/_discretizer.py @@ -4,7 +4,8 @@ from safeds.data.tabular.containers import Table from safeds.data.tabular.transformation._table_transformer import TableTransformer -from safeds.exceptions import TransformerNotFittedError, UnknownColumnNameError, NonNumericColumnError +from safeds.exceptions import NonNumericColumnError, TransformerNotFittedError, UnknownColumnNameError + class Discretizer(TableTransformer): """ diff --git a/tests/safeds/data/tabular/transformation/test_discretizer.py b/tests/safeds/data/tabular/transformation/test_discretizer.py index a4d360c2e..c59640cd4 100644 --- a/tests/safeds/data/tabular/transformation/test_discretizer.py +++ b/tests/safeds/data/tabular/transformation/test_discretizer.py @@ -1,7 +1,7 @@ import pytest from safeds.data.tabular.containers import Table from safeds.data.tabular.transformation import Discretizer -from safeds.exceptions import TransformerNotFittedError, UnknownColumnNameError, NonNumericColumnError +from safeds.exceptions import NonNumericColumnError, TransformerNotFittedError, UnknownColumnNameError class TestInit: @@ -21,13 +21,9 @@ class TestFit: }, ), UnknownColumnNameError, - r"Could not find column\(s\) 'col2'" - ), - ( - Table(), - ValueError, - "The Discretizer cannot be fitted because the table contains 0 rows" + r"Could not find column\(s\) 'col2'", ), + (Table(), ValueError, "The Discretizer cannot be fitted because the table contains 0 rows"), ( Table( { @@ -36,7 +32,10 @@ class TestFit: }, ), NonNumericColumnError, - f"Tried to do a numerical operation on one or multiple non-numerical columns: \ncol2 is of type String." + ( + "Tried to do a numerical operation on one or multiple non-numerical columns: \ncol2 is of type" + " String." + ), ), ], ids=["UnknownColumnNameError", "ValueError", "NonNumericColumnError"], @@ -70,13 +69,9 @@ class TestTransform: }, ), UnknownColumnNameError, - r"Could not find column\(s\) 'col1'" - ), - ( - Table(), - ValueError, - "The table cannot be transformed because it contains 0 rows" + r"Could not find column\(s\) 'col1'", ), + (Table(), ValueError, "The table cannot be transformed because it contains 0 rows"), ( Table( { @@ -84,7 +79,10 @@ class TestTransform: }, ), NonNumericColumnError, - f"Tried to do a numerical operation on one or multiple non-numerical columns: \ncol1 is of type String." + ( + "Tried to do a numerical operation on one or multiple non-numerical columns: \ncol1 is of type" + " String." + ), ), ], ids=["UnknownColumnNameError", "ValueError", "NonNumericColumnError"], From 4b58a0d625e1c7b553a8729351d8ae719fc3644f Mon Sep 17 00:00:00 2001 From: megalinter-bot <129584137+megalinter-bot@users.noreply.github.com> Date: Fri, 30 Jun 2023 09:02:08 +0000 Subject: [PATCH 13/29] style: apply automated linter fixes --- .../data/tabular/transformation/test_discretizer.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/tests/safeds/data/tabular/transformation/test_discretizer.py b/tests/safeds/data/tabular/transformation/test_discretizer.py index c59640cd4..3f449f6d5 100644 --- a/tests/safeds/data/tabular/transformation/test_discretizer.py +++ b/tests/safeds/data/tabular/transformation/test_discretizer.py @@ -32,10 +32,7 @@ class TestFit: }, ), NonNumericColumnError, - ( - "Tried to do a numerical operation on one or multiple non-numerical columns: \ncol2 is of type" - " String." - ), + "Tried to do a numerical operation on one or multiple non-numerical columns: \ncol2 is of type String.", ), ], ids=["UnknownColumnNameError", "ValueError", "NonNumericColumnError"], @@ -79,10 +76,7 @@ class TestTransform: }, ), NonNumericColumnError, - ( - "Tried to do a numerical operation on one or multiple non-numerical columns: \ncol1 is of type" - " String." - ), + "Tried to do a numerical operation on one or multiple non-numerical columns: \ncol1 is of type String.", ), ], ids=["UnknownColumnNameError", "ValueError", "NonNumericColumnError"], From 4a7520a2f70f113417018bed19d0e4d39298f588 Mon Sep 17 00:00:00 2001 From: methr0 Date: Fri, 30 Jun 2023 11:12:52 +0200 Subject: [PATCH 14/29] fixed import --- src/safeds/data/tabular/transformation/_discretizer.py | 3 ++- tests/safeds/data/tabular/transformation/test_discretizer.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/safeds/data/tabular/transformation/_discretizer.py b/src/safeds/data/tabular/transformation/_discretizer.py index 991636971..30b3bf271 100644 --- a/src/safeds/data/tabular/transformation/_discretizer.py +++ b/src/safeds/data/tabular/transformation/_discretizer.py @@ -4,7 +4,8 @@ from safeds.data.tabular.containers import Table from safeds.data.tabular.transformation._table_transformer import TableTransformer -from safeds.exceptions import TransformerNotFittedError, UnknownColumnNameError, NonNumericColumnError +from safeds.exceptions import TransformerNotFittedError, UnknownColumnNameError +from safeds.exceptions import NonNumericColumnError class Discretizer(TableTransformer): """ diff --git a/tests/safeds/data/tabular/transformation/test_discretizer.py b/tests/safeds/data/tabular/transformation/test_discretizer.py index a4d360c2e..99b82514e 100644 --- a/tests/safeds/data/tabular/transformation/test_discretizer.py +++ b/tests/safeds/data/tabular/transformation/test_discretizer.py @@ -1,7 +1,8 @@ import pytest from safeds.data.tabular.containers import Table from safeds.data.tabular.transformation import Discretizer -from safeds.exceptions import TransformerNotFittedError, UnknownColumnNameError, NonNumericColumnError +from safeds.exceptions import TransformerNotFittedError, UnknownColumnNameError +from safeds.exceptions import NonNumericColumnError class TestInit: From 99f139112d1d5792c9e8c1db9201cbf93442aa1f Mon Sep 17 00:00:00 2001 From: megalinter-bot <129584137+megalinter-bot@users.noreply.github.com> Date: Fri, 30 Jun 2023 09:24:26 +0000 Subject: [PATCH 15/29] style: apply automated linter fixes --- src/safeds/data/tabular/transformation/_discretizer.py | 4 ++-- tests/safeds/data/tabular/transformation/test_discretizer.py | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/safeds/data/tabular/transformation/_discretizer.py b/src/safeds/data/tabular/transformation/_discretizer.py index 30b3bf271..41d6b06ad 100644 --- a/src/safeds/data/tabular/transformation/_discretizer.py +++ b/src/safeds/data/tabular/transformation/_discretizer.py @@ -4,8 +4,8 @@ from safeds.data.tabular.containers import Table from safeds.data.tabular.transformation._table_transformer import TableTransformer -from safeds.exceptions import TransformerNotFittedError, UnknownColumnNameError -from safeds.exceptions import NonNumericColumnError +from safeds.exceptions import NonNumericColumnError, TransformerNotFittedError, UnknownColumnNameError + class Discretizer(TableTransformer): """ diff --git a/tests/safeds/data/tabular/transformation/test_discretizer.py b/tests/safeds/data/tabular/transformation/test_discretizer.py index 2024036c4..3f449f6d5 100644 --- a/tests/safeds/data/tabular/transformation/test_discretizer.py +++ b/tests/safeds/data/tabular/transformation/test_discretizer.py @@ -1,8 +1,7 @@ import pytest from safeds.data.tabular.containers import Table from safeds.data.tabular.transformation import Discretizer -from safeds.exceptions import TransformerNotFittedError, UnknownColumnNameError -from safeds.exceptions import NonNumericColumnError +from safeds.exceptions import NonNumericColumnError, TransformerNotFittedError, UnknownColumnNameError class TestInit: From 93fe3cc973cce031946b13a69aa1e006afaca832 Mon Sep 17 00:00:00 2001 From: methr0 Date: Fri, 30 Jun 2023 11:26:04 +0200 Subject: [PATCH 16/29] fixed import --- src/safeds/data/tabular/transformation/_discretizer.py | 3 +-- tests/safeds/data/tabular/transformation/test_discretizer.py | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/safeds/data/tabular/transformation/_discretizer.py b/src/safeds/data/tabular/transformation/_discretizer.py index 30b3bf271..991636971 100644 --- a/src/safeds/data/tabular/transformation/_discretizer.py +++ b/src/safeds/data/tabular/transformation/_discretizer.py @@ -4,8 +4,7 @@ from safeds.data.tabular.containers import Table from safeds.data.tabular.transformation._table_transformer import TableTransformer -from safeds.exceptions import TransformerNotFittedError, UnknownColumnNameError -from safeds.exceptions import NonNumericColumnError +from safeds.exceptions import TransformerNotFittedError, UnknownColumnNameError, NonNumericColumnError class Discretizer(TableTransformer): """ diff --git a/tests/safeds/data/tabular/transformation/test_discretizer.py b/tests/safeds/data/tabular/transformation/test_discretizer.py index 2024036c4..f800645c9 100644 --- a/tests/safeds/data/tabular/transformation/test_discretizer.py +++ b/tests/safeds/data/tabular/transformation/test_discretizer.py @@ -1,8 +1,7 @@ import pytest from safeds.data.tabular.containers import Table from safeds.data.tabular.transformation import Discretizer -from safeds.exceptions import TransformerNotFittedError, UnknownColumnNameError -from safeds.exceptions import NonNumericColumnError +from safeds.exceptions import TransformerNotFittedError, UnknownColumnNameError, NonNumericColumnError class TestInit: From 30b54821fc8852e85828af9520e037e96eb82d7d Mon Sep 17 00:00:00 2001 From: methr0 Date: Fri, 30 Jun 2023 11:47:53 +0200 Subject: [PATCH 17/29] change order of errors --- .../data/tabular/transformation/_discretizer.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/safeds/data/tabular/transformation/_discretizer.py b/src/safeds/data/tabular/transformation/_discretizer.py index 41d6b06ad..011cb8dd4 100644 --- a/src/safeds/data/tabular/transformation/_discretizer.py +++ b/src/safeds/data/tabular/transformation/_discretizer.py @@ -63,13 +63,14 @@ def fit(self, table: Table, column_names: list[str] | None) -> Discretizer: if column_names is None: column_names = table.column_names else: + missing_columns = set(column_names) - set(table.column_names) + if len(missing_columns) > 0: + raise UnknownColumnNameError(list(missing_columns)) + for column in column_names: if not table.get_column(column).type.is_numeric(): raise NonNumericColumnError(f"{column} is of type {table.get_column(column).type}.") - missing_columns = set(column_names) - set(table.column_names) - if len(missing_columns) > 0: - raise UnknownColumnNameError(list(missing_columns)) wrapped_transformer = sk_KBinsDiscretizer(n_bins=self._number_of_bins, encode="ordinal") wrapped_transformer.fit(table._data[column_names]) @@ -112,15 +113,16 @@ def transform(self, table: Table) -> Table: if table.number_of_rows == 0: raise ValueError("The table cannot be transformed because it contains 0 rows") - for column in self._column_names: - if not table.get_column(column).type.is_numeric(): - raise NonNumericColumnError(f"{column} is of type {table.get_column(column).type}.") - # Input table does not contain all columns used to fit the transformer missing_columns = set(self._column_names) - set(table.column_names) if len(missing_columns) > 0: raise UnknownColumnNameError(list(missing_columns)) + for column in self._column_names: + if not table.get_column(column).type.is_numeric(): + raise NonNumericColumnError(f"{column} is of type {table.get_column(column).type}.") + + data = table._data.copy() data.columns = table.column_names data[self._column_names] = self._wrapped_transformer.transform(data[self._column_names]) From 7214b6885d4ec3f913315d71ff723dcdc0db5c1f Mon Sep 17 00:00:00 2001 From: megalinter-bot <129584137+megalinter-bot@users.noreply.github.com> Date: Fri, 30 Jun 2023 09:49:38 +0000 Subject: [PATCH 18/29] style: apply automated linter fixes --- src/safeds/data/tabular/transformation/_discretizer.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/safeds/data/tabular/transformation/_discretizer.py b/src/safeds/data/tabular/transformation/_discretizer.py index 011cb8dd4..646e9ee91 100644 --- a/src/safeds/data/tabular/transformation/_discretizer.py +++ b/src/safeds/data/tabular/transformation/_discretizer.py @@ -71,7 +71,6 @@ def fit(self, table: Table, column_names: list[str] | None) -> Discretizer: if not table.get_column(column).type.is_numeric(): raise NonNumericColumnError(f"{column} is of type {table.get_column(column).type}.") - wrapped_transformer = sk_KBinsDiscretizer(n_bins=self._number_of_bins, encode="ordinal") wrapped_transformer.fit(table._data[column_names]) @@ -122,7 +121,6 @@ def transform(self, table: Table) -> Table: if not table.get_column(column).type.is_numeric(): raise NonNumericColumnError(f"{column} is of type {table.get_column(column).type}.") - data = table._data.copy() data.columns = table.column_names data[self._column_names] = self._wrapped_transformer.transform(data[self._column_names]) From cf38032b43d93226b8be2648dbaf548b0d234e58 Mon Sep 17 00:00:00 2001 From: methr0 Date: Fri, 30 Jun 2023 15:38:47 +0200 Subject: [PATCH 19/29] requested changes --- .../tabular/transformation/_discretizer.py | 6 +++-- .../transformation/test_discretizer.py | 24 +++++++++++++++---- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/safeds/data/tabular/transformation/_discretizer.py b/src/safeds/data/tabular/transformation/_discretizer.py index 011cb8dd4..2508a16ae 100644 --- a/src/safeds/data/tabular/transformation/_discretizer.py +++ b/src/safeds/data/tabular/transformation/_discretizer.py @@ -53,7 +53,7 @@ def fit(self, table: Table, column_names: list[str] | None) -> Discretizer: ValueError If the table is empty. NonNumericColumnError - If one of the columns, that should be fitted is not numeric. + If one of the columns, that should be fitted is non-numeric. UnknownColumnNameError If one of the columns, that should be fitted is not in the table. """ @@ -103,8 +103,10 @@ def transform(self, table: Table) -> Table: If the transformer has not been fitted yet. ValueError If the table is empty. + UnknownColumnNameError + If one of the columns, that should be transformed is not in the table. NonNumericColumnError - If one of the columns, that should be fitted is not numeric. + If one of the columns, that should be fitted is non-numeric. """ # Transformer has not been fitted yet if self._wrapped_transformer is None or self._column_names is None: diff --git a/tests/safeds/data/tabular/transformation/test_discretizer.py b/tests/safeds/data/tabular/transformation/test_discretizer.py index 3f449f6d5..52fd31cc4 100644 --- a/tests/safeds/data/tabular/transformation/test_discretizer.py +++ b/tests/safeds/data/tabular/transformation/test_discretizer.py @@ -12,7 +12,7 @@ def test_should_raise_value_error(self) -> None: class TestFit: @pytest.mark.parametrize( - ("table", "error", "error_message"), + ("table", "columns", "error", "error_message"), [ ( Table( @@ -20,10 +20,23 @@ class TestFit: "col1": [0.0, 5.0, 5.0, 10.0], }, ), + ["col2"], UnknownColumnNameError, r"Could not find column\(s\) 'col2'", ), - (Table(), ValueError, "The Discretizer cannot be fitted because the table contains 0 rows"), + ( + Table( + { + "col1": [0.0, 5.0, 5.0, 10.0], + "col2": [0.0, 5.0, 5.0, 10.0], + "col3": [0.0, 5.0, 5.0, 10.0], + }, + ), + ["col4", "col5"], + UnknownColumnNameError, + r"Could not find column\(s\) 'col5', 'col4", + ), + (Table(), ValueError, ["col2"], "The Discretizer cannot be fitted because the table contains 0 rows"), ( Table( { @@ -31,15 +44,16 @@ class TestFit: "col2": ["a", "b", "c", "d"], }, ), + ["col2"], NonNumericColumnError, "Tried to do a numerical operation on one or multiple non-numerical columns: \ncol2 is of type String.", ), ], - ids=["UnknownColumnNameError", "ValueError", "NonNumericColumnError"], + ids=["UnknownColumnNameError", "multiple missing columns", "ValueError", "NonNumericColumnError"], ) - def test_should_raise_errors(self, table: Table, error: type[Exception], error_message: str) -> None: + def test_should_raise_errors(self, table: Table, columns: list[str], error: type[Exception], error_message: str) -> None: with pytest.raises(error, match=error_message): - Discretizer().fit(table, ["col2"]) + Discretizer().fit(table, columns) def test_should_not_change_original_transformer(self) -> None: table = Table( From 2a5b687f7172151c7f974288473e94caaa7f71e8 Mon Sep 17 00:00:00 2001 From: methr0 Date: Fri, 30 Jun 2023 15:53:25 +0200 Subject: [PATCH 20/29] requested changes --- .../transformation/test_discretizer.py | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/tests/safeds/data/tabular/transformation/test_discretizer.py b/tests/safeds/data/tabular/transformation/test_discretizer.py index 52fd31cc4..8d3953680 100644 --- a/tests/safeds/data/tabular/transformation/test_discretizer.py +++ b/tests/safeds/data/tabular/transformation/test_discretizer.py @@ -34,9 +34,9 @@ class TestFit: ), ["col4", "col5"], UnknownColumnNameError, - r"Could not find column\(s\) 'col5', 'col4", + r"Could not find column\(s\) 'col4, col5'", ), - (Table(), ValueError, ["col2"], "The Discretizer cannot be fitted because the table contains 0 rows"), + (Table(), ["col2"], ValueError, "The Discretizer cannot be fitted because the table contains 0 rows"), ( Table( { @@ -52,6 +52,7 @@ class TestFit: ids=["UnknownColumnNameError", "multiple missing columns", "ValueError", "NonNumericColumnError"], ) def test_should_raise_errors(self, table: Table, columns: list[str], error: type[Exception], error_message: str) -> None: + print(type(error)) with pytest.raises(error, match=error_message): Discretizer().fit(table, columns) @@ -71,7 +72,7 @@ def test_should_not_change_original_transformer(self) -> None: class TestTransform: @pytest.mark.parametrize( - ("table_to_transform", "error", "error_message"), + ("table_to_transform", "columns", "error", "error_message"), [ ( Table( @@ -79,30 +80,43 @@ class TestTransform: "col2": ["a", "b", "c"], }, ), + ["col1"], UnknownColumnNameError, r"Could not find column\(s\) 'col1'", ), - (Table(), ValueError, "The table cannot be transformed because it contains 0 rows"), + ( + Table( + { + "col2": ["a", "b", "c"], + }, + ), + ["col1", "col3"], + UnknownColumnNameError, + r"Could not find column\(s\) 'col1, col3'", + ), + (Table(), ["col1", "col3"], ValueError, "The table cannot be transformed because it contains 0 rows"), ( Table( { "col1": ["a", "b", "c", "d"], }, ), + ["col1"], NonNumericColumnError, "Tried to do a numerical operation on one or multiple non-numerical columns: \ncol1 is of type String.", ), ], - ids=["UnknownColumnNameError", "ValueError", "NonNumericColumnError"], + ids=["UnknownColumnNameError", "multiple missing columns", "ValueError", "NonNumericColumnError"], ) - def test_should_raise_errors(self, table_to_transform: Table, error: type[Exception], error_message: str) -> None: + def test_should_raise_errors(self, table_to_transform: Table, columns: list[str], error: type[Exception], error_message: str) -> None: table_to_fit = Table( { "col1": [0.0, 5.0, 10.0], + "col3": [0.0, 5.0, 10.0], }, ) - transformer = Discretizer().fit(table_to_fit, None) + transformer = Discretizer().fit(table_to_fit, columns) with pytest.raises(error, match=error_message): transformer.transform(table_to_transform) From 135aa9edeaff106a2eda1f247c2ccf4724d74fc5 Mon Sep 17 00:00:00 2001 From: methr0 Date: Fri, 30 Jun 2023 15:59:13 +0200 Subject: [PATCH 21/29] make linter happy --- tests/safeds/data/tabular/transformation/test_discretizer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/safeds/data/tabular/transformation/test_discretizer.py b/tests/safeds/data/tabular/transformation/test_discretizer.py index 8d3953680..7b3b40848 100644 --- a/tests/safeds/data/tabular/transformation/test_discretizer.py +++ b/tests/safeds/data/tabular/transformation/test_discretizer.py @@ -92,7 +92,7 @@ class TestTransform: ), ["col1", "col3"], UnknownColumnNameError, - r"Could not find column\(s\) 'col1, col3'", + r"Could not find column\(s\) 'col3, col1'", ), (Table(), ["col1", "col3"], ValueError, "The table cannot be transformed because it contains 0 rows"), ( From 4e482008e729783d15fe50ff2c01ed60f48f10d6 Mon Sep 17 00:00:00 2001 From: methr0 Date: Fri, 30 Jun 2023 16:15:30 +0200 Subject: [PATCH 22/29] make linter happy --- src/safeds/data/tabular/transformation/_discretizer.py | 3 ++- tests/safeds/data/tabular/transformation/test_discretizer.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/safeds/data/tabular/transformation/_discretizer.py b/src/safeds/data/tabular/transformation/_discretizer.py index a1f28065c..75098f270 100644 --- a/src/safeds/data/tabular/transformation/_discretizer.py +++ b/src/safeds/data/tabular/transformation/_discretizer.py @@ -117,7 +117,8 @@ def transform(self, table: Table) -> Table: # Input table does not contain all columns used to fit the transformer missing_columns = set(self._column_names) - set(table.column_names) if len(missing_columns) > 0: - raise UnknownColumnNameError(list(missing_columns)) + raise UnknownColumnNameError(sorted(set(missing_columns).intersection(set(table.column_names)), + key={val: ix for ix, val in enumerate(missing_columns)}.__getitem__,)) for column in self._column_names: if not table.get_column(column).type.is_numeric(): diff --git a/tests/safeds/data/tabular/transformation/test_discretizer.py b/tests/safeds/data/tabular/transformation/test_discretizer.py index 7b3b40848..8d3953680 100644 --- a/tests/safeds/data/tabular/transformation/test_discretizer.py +++ b/tests/safeds/data/tabular/transformation/test_discretizer.py @@ -92,7 +92,7 @@ class TestTransform: ), ["col1", "col3"], UnknownColumnNameError, - r"Could not find column\(s\) 'col3, col1'", + r"Could not find column\(s\) 'col1, col3'", ), (Table(), ["col1", "col3"], ValueError, "The table cannot be transformed because it contains 0 rows"), ( From c113b59dab2a9f92967b0019c4df4a298fae9cf6 Mon Sep 17 00:00:00 2001 From: methr0 Date: Fri, 30 Jun 2023 16:21:47 +0200 Subject: [PATCH 23/29] make linter happy --- src/safeds/data/tabular/transformation/_discretizer.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/safeds/data/tabular/transformation/_discretizer.py b/src/safeds/data/tabular/transformation/_discretizer.py index 75098f270..81d6f03ea 100644 --- a/src/safeds/data/tabular/transformation/_discretizer.py +++ b/src/safeds/data/tabular/transformation/_discretizer.py @@ -117,8 +117,7 @@ def transform(self, table: Table) -> Table: # Input table does not contain all columns used to fit the transformer missing_columns = set(self._column_names) - set(table.column_names) if len(missing_columns) > 0: - raise UnknownColumnNameError(sorted(set(missing_columns).intersection(set(table.column_names)), - key={val: ix for ix, val in enumerate(missing_columns)}.__getitem__,)) + raise UnknownColumnNameError(sorted(missing_columns)) for column in self._column_names: if not table.get_column(column).type.is_numeric(): From 1f332aaaf12ded51d21a846c61c8deb2064f1d84 Mon Sep 17 00:00:00 2001 From: methr0 Date: Fri, 30 Jun 2023 16:29:42 +0200 Subject: [PATCH 24/29] make linter happy --- src/safeds/data/tabular/transformation/_discretizer.py | 6 ++++-- .../safeds/data/tabular/transformation/test_discretizer.py | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/safeds/data/tabular/transformation/_discretizer.py b/src/safeds/data/tabular/transformation/_discretizer.py index 81d6f03ea..5a77a089f 100644 --- a/src/safeds/data/tabular/transformation/_discretizer.py +++ b/src/safeds/data/tabular/transformation/_discretizer.py @@ -65,7 +65,8 @@ def fit(self, table: Table, column_names: list[str] | None) -> Discretizer: else: missing_columns = set(column_names) - set(table.column_names) if len(missing_columns) > 0: - raise UnknownColumnNameError(list(missing_columns)) + raise UnknownColumnNameError(sorted(missing_columns, + key={val: ix for ix, val in enumerate(column_names)}.__getitem__, )) for column in column_names: if not table.get_column(column).type.is_numeric(): @@ -117,7 +118,8 @@ def transform(self, table: Table) -> Table: # Input table does not contain all columns used to fit the transformer missing_columns = set(self._column_names) - set(table.column_names) if len(missing_columns) > 0: - raise UnknownColumnNameError(sorted(missing_columns)) + raise UnknownColumnNameError(sorted(missing_columns, + key={val: ix for ix, val in enumerate(self._column_names)}.__getitem__,)) for column in self._column_names: if not table.get_column(column).type.is_numeric(): diff --git a/tests/safeds/data/tabular/transformation/test_discretizer.py b/tests/safeds/data/tabular/transformation/test_discretizer.py index 8d3953680..2095c6173 100644 --- a/tests/safeds/data/tabular/transformation/test_discretizer.py +++ b/tests/safeds/data/tabular/transformation/test_discretizer.py @@ -90,9 +90,9 @@ class TestTransform: "col2": ["a", "b", "c"], }, ), - ["col1", "col3"], + ["col3", "col1"], UnknownColumnNameError, - r"Could not find column\(s\) 'col1, col3'", + r"Could not find column\(s\) 'col3, col1'", ), (Table(), ["col1", "col3"], ValueError, "The table cannot be transformed because it contains 0 rows"), ( From 7f0775ec49703b619299a8d411e37fcce46c8025 Mon Sep 17 00:00:00 2001 From: methr0 Date: Fri, 30 Jun 2023 16:32:09 +0200 Subject: [PATCH 25/29] make linter happy --- tests/safeds/data/tabular/transformation/test_discretizer.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/safeds/data/tabular/transformation/test_discretizer.py b/tests/safeds/data/tabular/transformation/test_discretizer.py index 2095c6173..629b788a9 100644 --- a/tests/safeds/data/tabular/transformation/test_discretizer.py +++ b/tests/safeds/data/tabular/transformation/test_discretizer.py @@ -52,7 +52,6 @@ class TestFit: ids=["UnknownColumnNameError", "multiple missing columns", "ValueError", "NonNumericColumnError"], ) def test_should_raise_errors(self, table: Table, columns: list[str], error: type[Exception], error_message: str) -> None: - print(type(error)) with pytest.raises(error, match=error_message): Discretizer().fit(table, columns) From 9b5edf030c6c8c3239c11d2d713fa429f57743a8 Mon Sep 17 00:00:00 2001 From: megalinter-bot <129584137+megalinter-bot@users.noreply.github.com> Date: Fri, 30 Jun 2023 14:33:59 +0000 Subject: [PATCH 26/29] style: apply automated linter fixes --- .../data/tabular/transformation/_discretizer.py | 16 ++++++++++++---- .../tabular/transformation/test_discretizer.py | 8 ++++++-- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/safeds/data/tabular/transformation/_discretizer.py b/src/safeds/data/tabular/transformation/_discretizer.py index 5a77a089f..9e9b6187a 100644 --- a/src/safeds/data/tabular/transformation/_discretizer.py +++ b/src/safeds/data/tabular/transformation/_discretizer.py @@ -65,8 +65,12 @@ def fit(self, table: Table, column_names: list[str] | None) -> Discretizer: else: missing_columns = set(column_names) - set(table.column_names) if len(missing_columns) > 0: - raise UnknownColumnNameError(sorted(missing_columns, - key={val: ix for ix, val in enumerate(column_names)}.__getitem__, )) + raise UnknownColumnNameError( + sorted( + missing_columns, + key={val: ix for ix, val in enumerate(column_names)}.__getitem__, + ), + ) for column in column_names: if not table.get_column(column).type.is_numeric(): @@ -118,8 +122,12 @@ def transform(self, table: Table) -> Table: # Input table does not contain all columns used to fit the transformer missing_columns = set(self._column_names) - set(table.column_names) if len(missing_columns) > 0: - raise UnknownColumnNameError(sorted(missing_columns, - key={val: ix for ix, val in enumerate(self._column_names)}.__getitem__,)) + raise UnknownColumnNameError( + sorted( + missing_columns, + key={val: ix for ix, val in enumerate(self._column_names)}.__getitem__, + ), + ) for column in self._column_names: if not table.get_column(column).type.is_numeric(): diff --git a/tests/safeds/data/tabular/transformation/test_discretizer.py b/tests/safeds/data/tabular/transformation/test_discretizer.py index 629b788a9..dbaa20c07 100644 --- a/tests/safeds/data/tabular/transformation/test_discretizer.py +++ b/tests/safeds/data/tabular/transformation/test_discretizer.py @@ -51,7 +51,9 @@ class TestFit: ], ids=["UnknownColumnNameError", "multiple missing columns", "ValueError", "NonNumericColumnError"], ) - def test_should_raise_errors(self, table: Table, columns: list[str], error: type[Exception], error_message: str) -> None: + def test_should_raise_errors( + self, table: Table, columns: list[str], error: type[Exception], error_message: str, + ) -> None: with pytest.raises(error, match=error_message): Discretizer().fit(table, columns) @@ -107,7 +109,9 @@ class TestTransform: ], ids=["UnknownColumnNameError", "multiple missing columns", "ValueError", "NonNumericColumnError"], ) - def test_should_raise_errors(self, table_to_transform: Table, columns: list[str], error: type[Exception], error_message: str) -> None: + def test_should_raise_errors( + self, table_to_transform: Table, columns: list[str], error: type[Exception], error_message: str, + ) -> None: table_to_fit = Table( { "col1": [0.0, 5.0, 10.0], From ed00f74a78a1dee2af5eab4abad0b873bb26aa49 Mon Sep 17 00:00:00 2001 From: megalinter-bot <129584137+megalinter-bot@users.noreply.github.com> Date: Fri, 30 Jun 2023 14:35:42 +0000 Subject: [PATCH 27/29] style: apply automated linter fixes --- .../data/tabular/transformation/test_discretizer.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/tests/safeds/data/tabular/transformation/test_discretizer.py b/tests/safeds/data/tabular/transformation/test_discretizer.py index dbaa20c07..7242d02d1 100644 --- a/tests/safeds/data/tabular/transformation/test_discretizer.py +++ b/tests/safeds/data/tabular/transformation/test_discretizer.py @@ -52,7 +52,11 @@ class TestFit: ids=["UnknownColumnNameError", "multiple missing columns", "ValueError", "NonNumericColumnError"], ) def test_should_raise_errors( - self, table: Table, columns: list[str], error: type[Exception], error_message: str, + self, + table: Table, + columns: list[str], + error: type[Exception], + error_message: str, ) -> None: with pytest.raises(error, match=error_message): Discretizer().fit(table, columns) @@ -110,7 +114,11 @@ class TestTransform: ids=["UnknownColumnNameError", "multiple missing columns", "ValueError", "NonNumericColumnError"], ) def test_should_raise_errors( - self, table_to_transform: Table, columns: list[str], error: type[Exception], error_message: str, + self, + table_to_transform: Table, + columns: list[str], + error: type[Exception], + error_message: str, ) -> None: table_to_fit = Table( { From be053052c050a6ac0e588d769001aa195b0e9495 Mon Sep 17 00:00:00 2001 From: methr0 Date: Fri, 7 Jul 2023 09:16:38 +0200 Subject: [PATCH 28/29] requested changes, match error message --- .../data/tabular/transformation/test_discretizer.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/safeds/data/tabular/transformation/test_discretizer.py b/tests/safeds/data/tabular/transformation/test_discretizer.py index 629b788a9..ce56d801d 100644 --- a/tests/safeds/data/tabular/transformation/test_discretizer.py +++ b/tests/safeds/data/tabular/transformation/test_discretizer.py @@ -129,7 +129,7 @@ def test_should_raise_if_not_fitted(self) -> None: transformer = Discretizer() - with pytest.raises(TransformerNotFittedError): + with pytest.raises(TransformerNotFittedError, match=r"The transformer has not been fitted yet."): transformer.transform(table) @@ -252,7 +252,7 @@ def test_should_not_change_original_table(self) -> None: def test_get_names_of_added_columns(self) -> None: transformer = Discretizer() - with pytest.raises(TransformerNotFittedError): + with pytest.raises(TransformerNotFittedError, match=r"The transformer has not been fitted yet."): transformer.get_names_of_added_columns() table = Table( @@ -265,7 +265,7 @@ def test_get_names_of_added_columns(self) -> None: def test_get_names_of_changed_columns(self) -> None: transformer = Discretizer() - with pytest.raises(TransformerNotFittedError): + with pytest.raises(TransformerNotFittedError, match=r"The transformer has not been fitted yet."): transformer.get_names_of_changed_columns() table = Table( { @@ -277,7 +277,7 @@ def test_get_names_of_changed_columns(self) -> None: def test_get_names_of_removed_columns(self) -> None: transformer = Discretizer() - with pytest.raises(TransformerNotFittedError): + with pytest.raises(TransformerNotFittedError, match=r"The transformer has not been fitted yet."): transformer.get_names_of_removed_columns() table = Table( From b2c1b299548cb22f18d4618d9b38061357a98b63 Mon Sep 17 00:00:00 2001 From: methr0 Date: Fri, 7 Jul 2023 09:24:39 +0200 Subject: [PATCH 29/29] requested changes --- src/safeds/data/tabular/transformation/_discretizer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/safeds/data/tabular/transformation/_discretizer.py b/src/safeds/data/tabular/transformation/_discretizer.py index 9e9b6187a..38a6cf0f0 100644 --- a/src/safeds/data/tabular/transformation/_discretizer.py +++ b/src/safeds/data/tabular/transformation/_discretizer.py @@ -40,7 +40,7 @@ def fit(self, table: Table, column_names: list[str] | None) -> Discretizer: ---------- table : Table The table used to fit the transformer. - column_names : Optional[list[str]] + column_names : list[str] | None The list of columns from the table used to fit the transformer. If `None`, all columns are used. Returns