From 760244e23ffc3daa01e63b5356573f196e3da6db Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Wed, 21 Feb 2024 11:40:47 +0100 Subject: [PATCH 01/24] added normal plot for time series --- .../data/tabular/containers/_time_series.py | 33 +++++++++++++++ .../_time_series/test_plot_time_series.py | 41 +++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index fee39fd94..baea61045 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -906,3 +906,36 @@ def plot_lagplot(self, lag: int) -> Image: plt.close() # Prevents the figure from being displayed directly buffer.seek(0) return Image.from_bytes(buffer.read()) + def plot_time_series(self) -> Image: + """ + Plot the time series, which is the target column. + + Parameters + ---------- + + Returns + ------- + plot: + The plot as an image. + + Raises + ------ + NonNumericColumnError + If the time series targets contains non-numerical values. + + Examples + -------- + >>> from safeds.data.tabular.containers import TimeSeries + >>> table = TimeSeries({"time":[1, 2], "target": [3, 4], "feature":[2,2]}, target_name= "target", time_name="time", feature_names=["feature"], ) + >>> image = table.plot_time_series() + + """ + if not self.target.type.is_numeric(): + raise NonNumericColumnError("This time series target contains non-numerical columns.") + ax = self.target._data.plot() + fig = ax.figure + buffer = io.BytesIO() + fig.savefig(buffer, format="png") + plt.close() # Prevents the figure from being displayed directly + buffer.seek(0) + return Image.from_bytes(buffer.read()) diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py new file mode 100644 index 000000000..a824be002 --- /dev/null +++ b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py @@ -0,0 +1,41 @@ +import pytest +from safeds.data.tabular.containers import TimeSeries +from safeds.exceptions import NonNumericColumnError +from syrupy import SnapshotAssertion + + +def test_should_return_table(snapshot_png: SnapshotAssertion) -> None: + table = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "target": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + lag_plot = table.plot_time_series() + assert lag_plot == snapshot_png + + +def test_should_raise_if_column_contains_non_numerical_values() -> None: + table = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "target": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + with pytest.raises( + NonNumericColumnError, + match=( + r"Tried to do a numerical operation on one or multiple non-numerical columns: \nThis time series target" + r" contains" + r" non-numerical columns." + ), + ): + table.plot_time_series() From 2b92135cdf7393b91075631008ad3c43f9602821 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Wed, 21 Feb 2024 13:06:20 +0100 Subject: [PATCH 02/24] added normal plot for time series --- .../data/tabular/containers/_time_series.py | 3 --- .../test_should_return_table.png | Bin 0 -> 15040 bytes 2 files changed, 3 deletions(-) create mode 100644 tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series/test_should_return_table.png diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index baea61045..3aecbca6d 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -910,9 +910,6 @@ def plot_time_series(self) -> Image: """ Plot the time series, which is the target column. - Parameters - ---------- - Returns ------- plot: diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series/test_should_return_table.png b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series/test_should_return_table.png new file mode 100644 index 0000000000000000000000000000000000000000..0d1cbc4a685e3d5b433c2aa90af87cd683d5634c GIT binary patch literal 15040 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 Date: Wed, 21 Feb 2024 12:07:59 +0000 Subject: [PATCH 03/24] style: apply automated linter fixes --- src/safeds/data/tabular/containers/_time_series.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 3aecbca6d..c18ca15ab 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -906,6 +906,7 @@ def plot_lagplot(self, lag: int) -> Image: plt.close() # Prevents the figure from being displayed directly buffer.seek(0) return Image.from_bytes(buffer.read()) + def plot_time_series(self) -> Image: """ Plot the time series, which is the target column. From daf77099bdacebd7ceea3cf108a16cea4abfd611 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Tue, 27 Feb 2024 12:05:48 +0100 Subject: [PATCH 04/24] -added labels - added optional parameter --- .../data/tabular/containers/_time_series.py | 17 +++- .../test_should_plot_feature.png | Bin 0 -> 17343 bytes .../test_should_return_table.png | Bin 15040 -> 16227 bytes .../_time_series/test_plot_time_series.py | 73 ++++++++++++++++-- 4 files changed, 81 insertions(+), 9 deletions(-) create mode 100644 tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series/test_should_plot_feature.png diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index c18ca15ab..65163c285 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -907,7 +907,7 @@ def plot_lagplot(self, lag: int) -> Image: buffer.seek(0) return Image.from_bytes(buffer.read()) - def plot_time_series(self) -> Image: + def plot_time_series(self, feature_name: str | None = None,) -> Image: """ Plot the time series, which is the target column. @@ -928,9 +928,18 @@ def plot_time_series(self) -> Image: >>> image = table.plot_time_series() """ - if not self.target.type.is_numeric(): - raise NonNumericColumnError("This time series target contains non-numerical columns.") - ax = self.target._data.plot() + if feature_name is None or feature_name == self.target.name: + series = self.target._data + feature_name = self.target.name + else: + if feature_name not in self.column_names: + raise UnknownColumnNameError([feature_name]) + series = self._data[feature_name] + if not self.get_column(feature_name).type.is_numeric(): + raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") + + ax = series.plot() + ax.legend(labels=[feature_name]) fig = ax.figure buffer = io.BytesIO() fig.savefig(buffer, format="png") diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series/test_should_plot_feature.png b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series/test_should_plot_feature.png new file mode 100644 index 0000000000000000000000000000000000000000..6e975f8e938155a4f4356604d8ff03f8190c77fc GIT binary patch literal 17343 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 O$lOx6nR(;>v;PHeHhZxE literal 0 HcmV?d00001 diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series/test_should_return_table.png b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series/test_should_return_table.png index 0d1cbc4a685e3d5b433c2aa90af87cd683d5634c..6befbff799f24be6f216e7477b07faee729dec87 100644 GIT binary patch literal 16227 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 F{|8aDNEHA8 literal 15040 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 None: time_name="time", feature_names=None, ) - lag_plot = table.plot_time_series() - assert lag_plot == snapshot_png - + plot = table.plot_time_series() + assert plot == snapshot_png +def test_should_plot_feature(snapshot_png: SnapshotAssertion) -> None: + table = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": [10, 9, 8, 7, 6, 5, 4, 3, 2, 1], + "target": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + plot = table.plot_time_series("feature_1") + assert plot == snapshot_png def test_should_raise_if_column_contains_non_numerical_values() -> None: table = TimeSeries( @@ -33,9 +45,60 @@ def test_should_raise_if_column_contains_non_numerical_values() -> None: with pytest.raises( NonNumericColumnError, match=( - r"Tried to do a numerical operation on one or multiple non-numerical columns: \nThis time series target" + r"Tried to do a numerical operation on one or multiple non-numerical columns: \nThe time series plotted column" r" contains" r" non-numerical columns." ), ): table.plot_time_series() + +@pytest.mark.parametrize( + ("time_series", "name", "error", "error_msg"), + [ + ( + TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"], + "target": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"], + }, + target_name="target", + time_name="time", + feature_names=None, + ), + "feature_1", + NonNumericColumnError, + r"Tried to do a numerical operation on one or multiple non-numerical columns: \nThe time series plotted" + r" column" + r" contains" + r" non-numerical columns.", + ), + ( + TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"], + "target": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"], + }, + target_name="target", + time_name="time", + feature_names=None, + ), + "feature_3", + UnknownColumnNameError, + r"Could not find column\(s\) 'feature_3'.", + ), + ], + ids=["feature_not_numerical", "feature_does_not_exist"], +) +def test_should_raise_error_optional_parameter( + time_series: TimeSeries, + name: str, + error: type[Exception], + error_msg: str, +) -> None: + with pytest.raises( + error, + match=error_msg, + ): + time_series.plot_time_series(feature_name=name) From 92d1c24b07dd63c7a1aab41536cc4fa318b1837e Mon Sep 17 00:00:00 2001 From: megalinter-bot <129584137+megalinter-bot@users.noreply.github.com> Date: Tue, 27 Feb 2024 11:07:24 +0000 Subject: [PATCH 05/24] style: apply automated linter fixes --- src/safeds/data/tabular/containers/_time_series.py | 5 ++++- .../_tagged_table/_time_series/test_plot_time_series.py | 7 ++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 65163c285..d14df927e 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -907,7 +907,10 @@ def plot_lagplot(self, lag: int) -> Image: buffer.seek(0) return Image.from_bytes(buffer.read()) - def plot_time_series(self, feature_name: str | None = None,) -> Image: + def plot_time_series( + self, + feature_name: str | None = None, + ) -> Image: """ Plot the time series, which is the target column. diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py index ebcea4e29..f4ea08c95 100644 --- a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py +++ b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py @@ -17,6 +17,8 @@ def test_should_return_table(snapshot_png: SnapshotAssertion) -> None: ) plot = table.plot_time_series() assert plot == snapshot_png + + def test_should_plot_feature(snapshot_png: SnapshotAssertion) -> None: table = TimeSeries( { @@ -31,6 +33,7 @@ def test_should_plot_feature(snapshot_png: SnapshotAssertion) -> None: plot = table.plot_time_series("feature_1") assert plot == snapshot_png + def test_should_raise_if_column_contains_non_numerical_values() -> None: table = TimeSeries( { @@ -45,13 +48,15 @@ def test_should_raise_if_column_contains_non_numerical_values() -> None: with pytest.raises( NonNumericColumnError, match=( - r"Tried to do a numerical operation on one or multiple non-numerical columns: \nThe time series plotted column" + r"Tried to do a numerical operation on one or multiple non-numerical columns: \nThe time series plotted" + r" column" r" contains" r" non-numerical columns." ), ): table.plot_time_series() + @pytest.mark.parametrize( ("time_series", "name", "error", "error_msg"), [ From 3480a159d64a196f18a83c2bd02c283ea39c2b0a Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Tue, 27 Feb 2024 13:24:38 +0100 Subject: [PATCH 06/24] - scatter and line plot functions - with one optional parameter --- .../data/tabular/containers/_time_series.py | 42 ++++++- .../test_should_plot_feature.png | Bin 0 -> 9793 bytes .../test_should_return_table.png | Bin 0 -> 9483 bytes .../_time_series/test_plot_time_series.py | 8 +- .../test_plot_time_series_scatter.py | 104 ++++++++++++++++++ 5 files changed, 149 insertions(+), 5 deletions(-) create mode 100644 tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series_scatter/test_should_plot_feature.png create mode 100644 tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series_scatter/test_should_return_table.png create mode 100644 tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index d14df927e..6d0782ad2 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -928,7 +928,7 @@ def plot_time_series( -------- >>> from safeds.data.tabular.containers import TimeSeries >>> table = TimeSeries({"time":[1, 2], "target": [3, 4], "feature":[2,2]}, target_name= "target", time_name="time", feature_names=["feature"], ) - >>> image = table.plot_time_series() + >>> image = table.plot_time_series_line_plot() """ if feature_name is None or feature_name == self.target.name: @@ -949,3 +949,43 @@ def plot_time_series( plt.close() # Prevents the figure from being displayed directly buffer.seek(0) return Image.from_bytes(buffer.read()) + def plot_time_series_scatter_plot(self, feature_name: str | None = None,) -> Image: + """ + Plots the time series target or the given column as scatter plot. + + Returns + ------- + plot: + The plot as an image. + + Raises + ------ + NonNumericColumnError + If the time series targets contains non-numerical values. + + Examples + -------- + >>> from safeds.data.tabular.containers import TimeSeries + >>> table = TimeSeries({"time":[1, 2], "target": [3, 4], "feature":[2,2]}, target_name= "target", time_name="time", feature_names=["feature"], ) + >>> image = table.plot_time_series_scatter_plot() + + """ + if feature_name is None or feature_name == self.target.name: + series = self.target._data + feature_name = self.target.name + else: + if feature_name not in self.column_names: + raise UnknownColumnNameError([feature_name]) + series = self._data[feature_name] + if not self.get_column(feature_name).type.is_numeric(): + raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") + + fig, ax = plt.subplots() + ax.scatter(series.index, series.values) + ax.legend(labels=[feature_name]) + fig = ax.figure + buffer = io.BytesIO() + fig.savefig(buffer, format="png") + plt.close() # Prevents the figure from being displayed directly + buffer.seek(0) + return Image.from_bytes(buffer.read()) diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series_scatter/test_should_plot_feature.png b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series_scatter/test_should_plot_feature.png new file mode 100644 index 0000000000000000000000000000000000000000..4ca09473d3beb770b569acfe9a27f46be12e6d38 GIT binary patch literal 9793 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 literal 0 HcmV?d00001 diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series_scatter/test_should_return_table.png b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series_scatter/test_should_return_table.png new file mode 100644 index 0000000000000000000000000000000000000000..3426558cc04481d29f78dd5f6e5a1d68f2694223 GIT binary patch literal 9483 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 Q2z;H;GuBNzYWv%N04@g(3;+NC literal 0 HcmV?d00001 diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py index f4ea08c95..ee3ae4fbd 100644 --- a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py +++ b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py @@ -15,7 +15,7 @@ def test_should_return_table(snapshot_png: SnapshotAssertion) -> None: time_name="time", feature_names=None, ) - plot = table.plot_time_series() + plot = table.plot_time_series_line_plot() assert plot == snapshot_png @@ -30,7 +30,7 @@ def test_should_plot_feature(snapshot_png: SnapshotAssertion) -> None: time_name="time", feature_names=None, ) - plot = table.plot_time_series("feature_1") + plot = table.plot_time_series_line_plot("feature_1") assert plot == snapshot_png @@ -54,7 +54,7 @@ def test_should_raise_if_column_contains_non_numerical_values() -> None: r" non-numerical columns." ), ): - table.plot_time_series() + table.plot_time_series_line_plot() @pytest.mark.parametrize( @@ -106,4 +106,4 @@ def test_should_raise_error_optional_parameter( error, match=error_msg, ): - time_series.plot_time_series(feature_name=name) + time_series.plot_time_series_line_plot(feature_name=name) diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py new file mode 100644 index 000000000..3bdde2d24 --- /dev/null +++ b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py @@ -0,0 +1,104 @@ +import pytest +from safeds.data.tabular.containers import TimeSeries +from safeds.exceptions import NonNumericColumnError, UnknownColumnNameError +from syrupy import SnapshotAssertion + + +def test_should_return_table(snapshot_png: SnapshotAssertion) -> None: + table = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "target": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + plot = table.plot_time_series_scatter_plot() + assert plot == snapshot_png +def test_should_plot_feature(snapshot_png: SnapshotAssertion) -> None: + table = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": [10, 9, 8, 7, 6, 5, 4, 3, 2, 1], + "target": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + plot = table.plot_time_series_scatter_plot("feature_1") + assert plot == snapshot_png + +def test_should_raise_if_column_contains_non_numerical_values() -> None: + table = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "target": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + with pytest.raises( + NonNumericColumnError, + match=( + r"Tried to do a numerical operation on one or multiple non-numerical columns: \nThe time series plotted column" + r" contains" + r" non-numerical columns." + ), + ): + table.plot_time_series_scatter_plot() + +@pytest.mark.parametrize( + ("time_series", "name", "error", "error_msg"), + [ + ( + TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"], + "target": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"], + }, + target_name="target", + time_name="time", + feature_names=None, + ), + "feature_1", + NonNumericColumnError, + r"Tried to do a numerical operation on one or multiple non-numerical columns: \nThe time series plotted" + r" column" + r" contains" + r" non-numerical columns.", + ), + ( + TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"], + "target": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"], + }, + target_name="target", + time_name="time", + feature_names=None, + ), + "feature_3", + UnknownColumnNameError, + r"Could not find column\(s\) 'feature_3'.", + ), + ], + ids=["feature_not_numerical", "feature_does_not_exist"], +) +def test_should_raise_error_optional_parameter( + time_series: TimeSeries, + name: str, + error: type[Exception], + error_msg: str, +) -> None: + with pytest.raises( + error, + match=error_msg, + ): + time_series.plot_time_series_scatter_plot(feature_name=name) From 3060bdb931ca9d2005bac431b2d5fb7a64652e98 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Tue, 27 Feb 2024 13:49:22 +0100 Subject: [PATCH 07/24] linter fixes --- src/safeds/data/tabular/containers/_time_series.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 6d0782ad2..a5902431a 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -907,12 +907,12 @@ def plot_lagplot(self, lag: int) -> Image: buffer.seek(0) return Image.from_bytes(buffer.read()) - def plot_time_series( + def plot_time_series_line_plot( self, feature_name: str | None = None, ) -> Image: """ - Plot the time series, which is the target column. + Plots the time series, which is the target column. Returns ------- From ae27d10f4c3a272b25b4032213a8f96f3b372eca Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Tue, 27 Feb 2024 13:52:12 +0100 Subject: [PATCH 08/24] linter fixes --- src/safeds/data/tabular/containers/_time_series.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index a5902431a..6254d7a3b 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -912,7 +912,7 @@ def plot_time_series_line_plot( feature_name: str | None = None, ) -> Image: """ - Plots the time series, which is the target column. + Plot the time series, which is the target column. Returns ------- @@ -951,7 +951,7 @@ def plot_time_series_line_plot( return Image.from_bytes(buffer.read()) def plot_time_series_scatter_plot(self, feature_name: str | None = None,) -> Image: """ - Plots the time series target or the given column as scatter plot. + Plot the time series target or the given column as scatter plot. Returns ------- From 8dd64adf8326051ea747b64eef65a3aed9f4de6a Mon Sep 17 00:00:00 2001 From: megalinter-bot <129584137+megalinter-bot@users.noreply.github.com> Date: Tue, 27 Feb 2024 12:53:43 +0000 Subject: [PATCH 09/24] style: apply automated linter fixes --- src/safeds/data/tabular/containers/_time_series.py | 6 +++++- .../_time_series/test_plot_time_series_scatter.py | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 6254d7a3b..f5eabfacf 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -949,7 +949,11 @@ def plot_time_series_line_plot( plt.close() # Prevents the figure from being displayed directly buffer.seek(0) return Image.from_bytes(buffer.read()) - def plot_time_series_scatter_plot(self, feature_name: str | None = None,) -> Image: + + def plot_time_series_scatter_plot( + self, + feature_name: str | None = None, + ) -> Image: """ Plot the time series target or the given column as scatter plot. diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py index 3bdde2d24..ce848b3cb 100644 --- a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py +++ b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py @@ -17,6 +17,8 @@ def test_should_return_table(snapshot_png: SnapshotAssertion) -> None: ) plot = table.plot_time_series_scatter_plot() assert plot == snapshot_png + + def test_should_plot_feature(snapshot_png: SnapshotAssertion) -> None: table = TimeSeries( { @@ -31,6 +33,7 @@ def test_should_plot_feature(snapshot_png: SnapshotAssertion) -> None: plot = table.plot_time_series_scatter_plot("feature_1") assert plot == snapshot_png + def test_should_raise_if_column_contains_non_numerical_values() -> None: table = TimeSeries( { @@ -45,13 +48,15 @@ def test_should_raise_if_column_contains_non_numerical_values() -> None: with pytest.raises( NonNumericColumnError, match=( - r"Tried to do a numerical operation on one or multiple non-numerical columns: \nThe time series plotted column" + r"Tried to do a numerical operation on one or multiple non-numerical columns: \nThe time series plotted" + r" column" r" contains" r" non-numerical columns." ), ): table.plot_time_series_scatter_plot() + @pytest.mark.parametrize( ("time_series", "name", "error", "error_msg"), [ From f44d3e416c047b57cdf35746a45a05c61b598557 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Tue, 27 Feb 2024 23:43:33 +0100 Subject: [PATCH 10/24] - added 2 parameters and the same function schema as in the table class - added tests for scatter and line plot with the additional parameters --- .../data/tabular/containers/_time_series.py | 143 +++++++++++++----- .../test_should_plot_feature.png | Bin 17343 -> 22754 bytes .../test_should_plot_feature_x.png | Bin 0 -> 12852 bytes .../test_should_plot_feature_y.png | Bin 0 -> 19374 bytes .../test_should_return_table.png | Bin 16227 -> 18627 bytes .../test_should_return_table_both.png | Bin 0 -> 12395 bytes .../test_should_plot_feature.png | Bin 9793 -> 11608 bytes .../test_should_plot_feature_both_set.png | Bin 0 -> 12902 bytes .../test_should_plot_feature_only_x.png | Bin 0 -> 11657 bytes ...st_should_plot_feature_only_y_optional.png | Bin 0 -> 11608 bytes .../test_should_return_table.png | Bin 9483 -> 11291 bytes .../_time_series/test_plot_time_series.py | 102 ++++++++++++- .../test_plot_time_series_scatter.py | 120 ++++++++++++++- 13 files changed, 320 insertions(+), 45 deletions(-) create mode 100644 tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series/test_should_plot_feature_x.png create mode 100644 tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series/test_should_plot_feature_y.png create mode 100644 tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series/test_should_return_table_both.png create mode 100644 tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series_scatter/test_should_plot_feature_both_set.png create mode 100644 tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series_scatter/test_should_plot_feature_only_x.png create mode 100644 tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series_scatter/test_should_plot_feature_only_y_optional.png diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 6254d7a3b..fc2300f7e 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -6,6 +6,7 @@ import matplotlib.pyplot as plt import pandas as pd +import seaborn as sns from safeds.data.image.containers import Image from safeds.data.tabular.containers import Column, Row, Table, TaggedTable @@ -36,7 +37,7 @@ def _from_tagged_table( Parameters ---------- - table : TaggedTable + tagged_table: TaggedTable The tagged table. time_name: str Name of the time column. @@ -751,8 +752,8 @@ def replace_column(self, old_column_name: str, new_columns: list[Column]) -> Tim self.features.column_names if old_column_name not in self.features.column_names else self.features.column_names[: self.features.column_names.index(old_column_name)] - + [col.name for col in new_columns] - + self.features.column_names[self.features.column_names.index(old_column_name) + 1 :] + + [col.name for col in new_columns] + + self.features.column_names[self.features.column_names.index(old_column_name) + 1:] ), ), time_name=self.time.name, @@ -800,7 +801,7 @@ def slice_rows( def sort_columns( self, comparator: Callable[[Column, Column], int] = lambda col1, col2: (col1.name > col2.name) - - (col1.name < col2.name), + - (col1.name < col2.name), ) -> TimeSeries: """ Sort the columns of a `TimeSeries` with the given comparator and return a new `TimeSeries`. @@ -907,12 +908,20 @@ def plot_lagplot(self, lag: int) -> Image: buffer.seek(0) return Image.from_bytes(buffer.read()) - def plot_time_series_line_plot( - self, - feature_name: str | None = None, - ) -> Image: + def plot_time_series_lineplot(self, y_column_name: str | None = None, + x_column_name: str | None = None) -> Image: """ - Plot the time series, which is the target column. + + Plot the time series target or the given column(s) as line plot. + The function will take the target column as the default value for x_column_name and a time dummy column as the + default value for y_column_name. + + Parameters + ---------- + x_column_name : str + The column name of the column to be plotted on the x-Axis. + y_column_name : str + The column name of the column to be plotted on the y-Axis. Returns ------- @@ -922,36 +931,73 @@ def plot_time_series_line_plot( Raises ------ NonNumericColumnError - If the time series targets contains non-numerical values. + If the time series given columns contain non-numerical values. + + UnknownColumnNameError + If one of the given names does not exist in the table Examples -------- >>> from safeds.data.tabular.containers import TimeSeries >>> table = TimeSeries({"time":[1, 2], "target": [3, 4], "feature":[2,2]}, target_name= "target", time_name="time", feature_names=["feature"], ) - >>> image = table.plot_time_series_line_plot() + >>> image = table.plot_time_series_lineplot() """ - if feature_name is None or feature_name == self.target.name: - series = self.target._data - feature_name = self.target.name + self._data.index.name = "index" + if y_column_name is None: + y_column_name = self.target.name + if x_column_name is None: + x_column_name = "index" else: - if feature_name not in self.column_names: - raise UnknownColumnNameError([feature_name]) - series = self._data[feature_name] - if not self.get_column(feature_name).type.is_numeric(): + if not self.get_column(x_column_name).type.is_numeric(): + raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") + if not self.has_column(x_column_name) or not self.has_column(y_column_name): + similar_columns_x = self._get_similar_columns(x_column_name) + similar_columns_y = self._get_similar_columns(y_column_name) + raise UnknownColumnNameError( + ([x_column_name] if not self.has_column(x_column_name) else []) + + ([y_column_name] if not self.has_column(y_column_name) else []), + (similar_columns_x if not self.has_column(x_column_name) else []) + + (similar_columns_y if not self.has_column(y_column_name) else []), + ) + if not self.get_column(y_column_name).type.is_numeric(): raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") - ax = series.plot() - ax.legend(labels=[feature_name]) - fig = ax.figure + fig = plt.figure() + ax = sns.lineplot( + data=self._data, + x=x_column_name, + y=y_column_name, + ) + ax.set(xlabel=x_column_name, ylabel=y_column_name) + ax.set_xticks(ax.get_xticks()) + ax.set_xticklabels( + ax.get_xticklabels(), + rotation=45, + horizontalalignment="right", + ) # rotate the labels of the x Axis to prevent the chance of overlapping of the labels + plt.tight_layout() + buffer = io.BytesIO() fig.savefig(buffer, format="png") plt.close() # Prevents the figure from being displayed directly buffer.seek(0) + self._data.reset_index(inplace=True) return Image.from_bytes(buffer.read()) - def plot_time_series_scatter_plot(self, feature_name: str | None = None,) -> Image: + + def plot_time_series_scatterplot(self, y_column_name: str | None = None, x_column_name: str | None = None) -> Image: + """ - Plot the time series target or the given column as scatter plot. + Plot the time series target or the given column(s) as scatter plot. + The function will take the target column as the default value for x_column_name and a time dummy column as the + default value for y_column_name. + + Parameters + ---------- + x_column_name : str + The column name of the column to be plotted on the x-Axis. + y_column_name : str + The column name of the column to be plotted on the y-Axis. Returns ------- @@ -961,31 +1007,56 @@ def plot_time_series_scatter_plot(self, feature_name: str | None = None,) -> Ima Raises ------ NonNumericColumnError - If the time series targets contains non-numerical values. + If the time series given columns contain non-numerical values. + + UnknownColumnNameError + If one of the given names does not exist in the table Examples -------- >>> from safeds.data.tabular.containers import TimeSeries >>> table = TimeSeries({"time":[1, 2], "target": [3, 4], "feature":[2,2]}, target_name= "target", time_name="time", feature_names=["feature"], ) - >>> image = table.plot_time_series_scatter_plot() + >>> image = table.plot_time_series_scatterplot() """ - if feature_name is None or feature_name == self.target.name: - series = self.target._data - feature_name = self.target.name + self._data.index.name = "index" + if y_column_name is None: + y_column_name = self.target.name + if x_column_name is None: + x_column_name = "index" else: - if feature_name not in self.column_names: - raise UnknownColumnNameError([feature_name]) - series = self._data[feature_name] - if not self.get_column(feature_name).type.is_numeric(): + if not self.get_column(x_column_name).type.is_numeric(): + raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") + if not self.has_column(x_column_name) or not self.has_column(y_column_name): + similar_columns_x = self._get_similar_columns(x_column_name) + similar_columns_y = self._get_similar_columns(y_column_name) + raise UnknownColumnNameError( + ([x_column_name] if not self.has_column(x_column_name) else []) + + ([y_column_name] if not self.has_column(y_column_name) else []), + (similar_columns_x if not self.has_column(x_column_name) else []) + + (similar_columns_y if not self.has_column(y_column_name) else []), + ) + if not self.get_column(y_column_name).type.is_numeric(): raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") - fig, ax = plt.subplots() - ax.scatter(series.index, series.values) - ax.legend(labels=[feature_name]) - fig = ax.figure + fig = plt.figure() + ax = sns.scatterplot( + data=self._data, + x=x_column_name, + y=y_column_name, + ) + ax.set(xlabel=x_column_name, ylabel=y_column_name) + ax.set_xticks(ax.get_xticks()) + ax.set_xticklabels( + ax.get_xticklabels(), + rotation=45, + horizontalalignment="right", + ) # rotate the labels of the x Axis to prevent the chance of overlapping of the labels + plt.tight_layout() + buffer = io.BytesIO() fig.savefig(buffer, format="png") plt.close() # Prevents the figure from being displayed directly buffer.seek(0) + self._data.reset_index(inplace=True) return Image.from_bytes(buffer.read()) diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series/test_should_plot_feature.png b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series/test_should_plot_feature.png index 6e975f8e938155a4f4356604d8ff03f8190c77fc..98dbeaa93ed2438e2db93412ee9a4d3b0847be54 100644 GIT binary patch literal 22754 zcmb?@by!v3*6yMaknUy!1|^{)A|X-|5>gVv%t38Tayz@j4<}`_suT%7Y&t%o!XmV4ujRYo8}* z=rPR9{7lcNdgHQc-&Vig?M%IXJx6;hQflr;oQl*Vot;dRlN>v9m$XYduKpC8DE#hL z>6W(l{P)hh^la)qUl~!ZV1x?(V>(WgL&}N4VA4OdBFgge@>W)iNJMyecr+OvCtQz@ zH%EBjvZyFo09=(<48?f}S35d{5o+}3OoXy<6~o>9fB&(KHUlR?sbNgD*J{(pkL03H z)t24hHsLqJDRC<+D_uN2Ln1n(R(r)hAl`p|np9L*tC|qP{k1AH-n?n*=~)R`z4ZjA z4}L1!d8TJ#;^vG!_UCHXu91(8kDq%wufSxD2uS^KaCYv+K8nwGYYppJ1Qbr_&kg@H4| zJcN+>g@xwcUWz>ZLciq|)g+Iesm6pGeCQh89H^8E zIN~{d`q-bJ<5w0wrk?9!Wo7MqXRZ2N>YiTH2QXFkJ8K5MqO~vlr?j&(gcMd6$JiVE z-Bu^05Lvk22Z2JZ*P-)eS@B(S54+}4(%jwL_}-u^n@g)d;3j--R$L*f_!NEb2{KxQ&B^s}^Ehi?teM`q~Kv!pHW2O5-UzO+gTNAwl1JqkvTh@oD zH4eQWUJrgXc^Ja+aSRuUUNzv5iS{MXbrj4HRMS`*lL)wb_ilyXLDl?1Mh1_(l2UVL z=P`D6cH(2l8uxd8PtVN}z&PEhk_-g}1&g1u;ye^+z!5_#z4>Wo&nwJaE?~WrXk#GV zM`7ao;{La|!_XaJrLe zhp|=!SATV`X;41&>3GfhO-T)K*&J0dMyy+Bh#l7WaBvyDj=!EEU&=?nZDY%6_}M+N zN+9U(R(^Cnk3f&TGBiP{00+Un#7cEufcPAncdWmH88#qXwPrX)`A(2TiH02)2`$eJ zs+3A;Xi_V*$@|2Q9f9X*mzSzxRi+hv!$3Da>E7`)BCNNS5xp4c~Y=ErWN^UwQR7Jb()J z0d!skQ*N&=85wMUr^_D1jj4s-)_(qQ~1_tj{3X8>?4;jUXymK@u^Z11G*T$ay#&vO>qp#zQ zP#Y&2hzU>@dSAS1LVqBG4VweZ35I5^91+{Qz2A|5dCy#n%_7;sqFbusCQaBNW*D!l z8GY60wJWALBXczTyr;$5L;lZeF7Fyq6T6lsRSE18VIOZpJ2JuEw@!wA+CLLPE}qYgr3=EHGP4wN zwcc>X-eEChyi2HQSe+_drSpLrq3>WP>EoM!9vm~OS|Y$sz=!LWvz6IQqH@LpUGu~T zGJYbWm#@pC2Ce%^v0jqCfC+B!I{CP0yH6K2vcrg_qYLNqh4-1y>i({yf5I7ki?6-K z7bu?*B8x1VEZ`_jUz>DhJ}g>eQ%t{1)w(c+<$1-auR)iRpLPhBE78<^sv?JH5c&HI zZ<^QttgUY`e(OwdDdx9Z8mbY3i;{mYK2Q-X+Aqg{D{%)8SyM4N=_@9H2;I58WJCPd zM$z5-77%YpP8Me3A&O;!c1t!+9}=BHA7DM;?2J=ViAVKgU1A6K>jHkG47CRiswVVy zOxWCrgOr&nw?3Cj(tNA)y5RlsA##cbUg~8YV)9t~DqbtlF`t;|8g{G8$TV7L6M~q* zK|TayXJf~X9v*)y7d=iJkv#Y)(dqg{@s{n_6^R2kPdZt2zRJ@ieR);z-dh%Se6N!%IjXN!u)bp@|LdEI+Bj8E zP|{BvWP;qI`9Yn!x%J0Hr?y~pZXL?T{tv_YS=LZg9E>O!%S72y9M<< zD}3^{OfC;4vR_fU*>=t$=NbcvH?sLWZ}3oIEsOU?Cue=m`Iv#%{t4t|W)@8y6La|T zokVJVMQsZ-LWpWI-E~tNqYe=h7e$cO^4~4dP7}hGs^YKPvG)(K(0(s`{t~X&`zSL@ z^GIH2@hciK`Z-+~wnprAv$E$Jjam0*wBBkrzfTbyI!+|R&FPE1jJRJZ5k%u92tmt5sA)U zxi_^cF*d>ovz{#*n0tQS;2aN9=%WkUW5671VILLZz@l04q8~1}gScz?D*;7QvK6}4 zs^Yu1{$4*-t{m9MCUSw*p92vts$`K~?MZan@Wrm}MtA96B_kVq;4_Nf=H~VfdVTiH zTu8mjJYFxfp|i_SB5!$PzWkAqmNrkbtC7UK@$#CN*Ap0A?C;HGbF?j&rt#m(XblYH ztKYxnE5(C+)Eyp(xyg$9UVN--?_WY-w%0Rf__+lp3d6tSgo+vRg zut(gJP$()DZheR2w>WR4y8KSL_wRL1F8uSUs*ShyW?pF?8_aWx+H4N$YX|}3?PH(c zLoHq|M55lf>0|gP65yonU}1M;Qv{1QK#esn+oO~l0maWSE=$+Q)vOvy3MLrG>)5lr zx$?1VKR|Von!{pX=#&-RsVOUmz``*6mySX9uy};wSmRsRmo}tWektDnBTtO8T`6Iv z?m}rVX{c(#%ybGnz_B^n)56w9WQP^n0|Sm7{6Du#vM7wIv_i1=f27=0YaD$nPFCAT zTA*8PO~ILi%zm27^M(~Z_VIa&&ddwFS&3G7B^UBFc8HjiTwY9E34Dti>svYzw0!62 zIcg$THF$B5ujjHub+6#Ub8@*_Td84hz}MMqEYap1+p?1Zdvo??UL5$(gPdbo-mm`R zWSwJ}M;zv3Z-~cw<6lQ+G9?~gyYl7DxlEy`Xj*iEvIQI*!eCv)xY58!@B=H$Y zULxMi(~qw@D{6sVW4eqYgOHKx*&_aBa^z*Tv!KArBw1PF{w}ZGIvx0k4vw}ciSWfs zxPZXS>@m&J1ry#!x*BC3+^G#%AF_tr%W36s_8lpmOIc}y_!YeVs=D`s)>L-b$Y~d0 zD7dzn_N916`Kqe8zn4-l0a1D)o>5i26E^k^Joq6;@aA?@TYMe`f;1cYOg(;~Zf4h( z=#+5}YlII=Du(23!AhJGuMv8i69#=*rwPw`!465kgALM1Qev(Qp%|zy!sRmCYHHWF zZ5_@61}JehVB0%UV!6#-`_k(kk|c2BK~a(L{`PF#+WLB9YZQZs+c)J47cQ6$WL(uw zQi4Kc>hd)zbcI5U;t+(!)H&ec$K$ZOH$o=}8pLjWeCf41u{cpHiM#|bJ^ap^^kbUL z8CPovY-BX^U9iKh%cglRFPdxZszme>VxE5&k(h)^MvG&Dii zv#z07ytgLKSV-yGwQEoP0ok9CBM#)acG7%pw|-4nKUVSFk0LJ%$xxXARiAPqm$qo8 zj?T`&@^W!Cb@f-;IYnlTxMVEne?0wjqr{d+J@<-fl2!YR7d`@*2e4Cm6NOH;G6LD|`-d^bPqGoG`5GMEWb4X1DbHv#mF+TBSvefbRbh19E>8;YyAFVCa9!~`RjT;8*y5oKtK*B+Z0dMvtoy(A z{4WSv3E)gAwPsE04yA(xUL{`b^UxIwja~yX z^4FMbYBDX9&7@x|unY5S4$^EN(OVt}=R1yu5T=+17QAncSi|m%@CuIaZdY4q)!P)6 z2`5yD{-an|gb9Dc9OdYuHNS|K{0_66L0tYr<(4o0H;IsvY$Lk7Fv2Ft0UaG^l8C?T^Taedu1sN8-r}li zIhEtG#hpKG!s3ttG1&QCNc#B%z|lcArQZArgRw%UUHn0)A26xd7)xl~-m25RGe`YR z<=paxQ8PyuO6D&XqZ;Y$e{cSfUw7Mg()#wrBwS?i+scDN!ky;Euf{VU!aXR^*)P?W z{E&-29w+Z%Pj4m4nQ{G!nr|(RQ5BUG9`yL=&>jYlMofbzKTStAp)Yt<`G3OuLnE!4yl(asXuwO&Bz)vBQH&59R(J@ zcO^Q>_hRdZjSn$lchM5+3&*#{Zuw9RpYx4tdY+Jg7YR`BiJ!ROvBWOt)xxP!5FC}t z+w=gBN+(QkJp3j${4ZSsWWNLG$o&T)GDW8WxbrL)cPeg(qHCj^Wj)U@`#N9i!d*c& zWDSb5?!|e45At)^(0-AB>kfTesM5?eJ+8Ms>ctuUVjI8Q6TrB&SnzbwZZw3pdz>cD zB9r;W=i9~SFA&Gre??dJGS<0LG5Wc}&d!$rLIE~%GR8AK{wt`K4yT*u}Ya!Ci`trc9note!CzppnD{gpFAb0zW1Qiwz%9 z%bATwJTvfF$AICZn#CI+C zUc}ZECClGR!;(vQN#aOov+XTo0UD*J>YoE_lHQJWEInebqWR(D0!M;4_Bh)^cVrD* zILC6|!QvF4#!YwY64aiWT@l${`E?&@csc)b`)xTOBdR4VaN-??yH3Yy^YcLPw<-0T2gbmDewOJ#-{(y&OrDO{=wRSEY1H;QRC#xU2} z&5gZze$LT04mHts5pKVF<}8R#jsfdAM*ynV+)r=&nqH#i3*7zeSPYB@a|Hy=zd<$K zUnfJ;eCwy`w#2XV$V;P7Dcf!V9JvO+_=A;A*T;cW>wN;qQ)HSdy#5&;4U=$fp1AaF zQwmXZ@s`A}Q^=i-pjhw!C-!s>#eb=e2ahO!GX8IU~zD=+st7~K8F9E{RO#Wn_<_7dni7h8fCi^`4=kf=?t$H){WmUxgl z%>`CUL2M0ILAL-?GK|Vd!yX7MqCv`2v&*KY5JVn>0SCBH0}_5q%9czn=BEdea4gpl zCn{y*+90n^g^86T$O?;I`-jVi*-+KXZ_uLGeSV_Q(J`{6^_vnB zaJ5jpK`E65HW-x@4Md-K_G*_rNa*0_Ki+n)r3D@?j%9>GVu_DMpM2no9Pz%(JUu;Y z1#YI{OReLQZ`s)Kd+p0m2l7Gph;lD2Ek8ZFR1lkHx%pG2PXLQSbR?Vf`eQJ2C4^TpvoUr zh++oxeY}XhS0`$1Cu$@J$rup^1_pe5{HamrdNdQIlc403mW**(T z>=(z`8=i?fV*~`quD?-he0$@)%XAZgTFTjD^z`&7Gn(eZQE5zGXenN;f%H{xL^SSUE8eJ$?V*t{9)?akB8 zqfa?&r)_g%wk;<9(W778d)?0^XhudxQv7prat!k!pBn*})_pKXEj>YnSE(Hn8{v1^%;ip=_7)tWZT(~8BWyxB%px+gc0P|N1lsXlOVDu9-D(36%`lvkG;{( zarrqWvAwsKl-E%I?9yFP;GKg)NEs}q8Uio)A6^zN*{>5SQE;z|2Q*kk2bN7D& zry#t({!s-e+B#$t_z^_~1)NhOc#I4TM5LsoJ&v$uYrlVAv9-0`;oE-(jK3MQ7?LI2 zPe>o_yLH;b2=+UEN=Viy82o>k&1SAS&|E zp8x)(5G>DPJ6R|7Ha|b@t`qFiVpWyi_Qe>6cyAdBn-iklEB*MZB?ZmBYS6MUJQncu z=~G5wGbEN>isY$UsKb|nS2t^YyjN@gXqMXR3YgXzvuIqAx1#imst=1RZ|Bqp5N84? zcit09$Z)OXdoTf3A*wE^mdDP$R#8|L*#+!=LcdLo(L*^i3=f;W0m-F>3mj*Hyhl^jIfAJt(`HW+Ia-^U6E%djZ z&mD{I`Lcw{U>-f!+d_m)s%XLGnxLlEGB%F3`}BrOTACf~b>aSQ3HHZ@9SMBCWvim+ z)A;SKk93X_0D24yDy?iuprW!njhuJu$r1n8{fZB%(llVK@Y5C zofZNtw_r7;WivNbsv(d!ZVREweZ?qrkN?>BLB4M{l;$#xmV$&kHye$(5*K$pBl*z0 zfygii8w)^4D!Zg>YWQp{EPI1$2t!9 zhBX(zU$_z&OpYBdvb(qEU{iQz{MGjM?XCIwdB(H0ltcMOMEv~xj+c00aOhu&+`lD2 z-jYz_@twhdg>)D45!I4VzA-_~y+2Ogckh}X>~4lfL|j%=BSZI$VhpqS@A;nX!@bq@ zg*1N)Xv2N=zKFr3y3U%j@4l6e!E?1k@oUtCw1IR(+;m*HM+$0TgCYdnyycm5UCxd9 z@83zq#l_L8b)h#cEI(gR`f%G)z^F`(MdPYGPvw=Q0m>?F`nztt_QOUHeL3+z=K#wp zFMp)Mk0UH3MDDpfc-P`CtQaNi$(P@RT@4LW&cBEaSJnoo*5#+#@^w}mK?J2z*LwP7 zb;@TeKgwrtpiyjelm*&SimtB3Hc#bVHO#a|O|PsRM=IPG$n6KSU&Ul`V;-p~zF=K- zx=?t`9|&6c?L9#>Vinq2LuvgvuRl-!Ohskos~hia5S1;GTphk2ll2^k%kO#hXcqBn zEE-DkJV0IxK$X@o{sS{?kZjR8+SB)`R~Mp5_|4>@d7SQ^p4K<&&mJZx6C<{R*;JwA zY$TGBl8%>Z^jz6xF+N&Gy;)O_rPfdB0tJ}YZ&-8 zt7G?ibBDh0iv!kBZ%@I38X1j>mal#-RYjwS&U7#(v7{ef7x_t9 z!GJfVD`>0i=QT9ygFe*Oa;`rpJI@{&t}I%qKoa~jym5Ma4++4z?6jS(aoynQ z`#d5lCi;B*hT|;fZD-BH!+G4HK$0F~#L~x3e9bjCr5Sf4m7dnk%gcw#@uMIkjV)Zg zxg=GjjP`!N4EkXxBkM05c&wOZvK4(8DtD{4E^X?oSAe7npo@a|g`OmPCA#dRK zH^#$*yXxC}MfatG>%Tk#pO1c^hdY&W&Y{Tfz{mGs^Gi`tQA3H{r?tJ+dP`vIIzE0J zYP$}DtLuE=-q_!z{W#Gb5EF7*kK%aC+j8dSZXJG(2v{u*{3QM?cD9}h4lz>_3G6=?L2e%@oDXBVaHnnHmh~P775JGyMqlcjyX=Z`qcrNE^(vk zfUn2a-ur{$gUlXY6di>tK zdpTWP=_DSQb*>YRF>-o=xVqqVn-676e&?P*_y3&sguv?r#Ma(EvZUl}MMcGv8!zJH zaR7v6>*W5D4$*^Bok<$lww~he28Z{cm`SOW;1sw(T*{W82@GrY*oS8*n%Ta=Bzooy z1q4#86&Dh(XEd~rTCVNQ!SV+gRao9U!+}DJUH>_f06=Uw2=s}4e|4TLD&8@D?*SaH z`@+Y@$;os4%!YL&5#cXB)g@Oamxky)8O%f%x!eELyc>xPPES;viQej1q1< zdIiRvzn8+5sYw!;qbP2+{>gd-wJ6I4%giM{pV)6IsD&TeWh}{M|NDF z(D9MaLE(!Ww!BbIT;+luF~I$X16GOKf@;OSFFC5tTkBH*TZ*>2eUzXit$(z>bJ(Ss zjlZm4-dZ)?)8CL8i87MdKIZ^G#2lNI*ye%`No+G@rVGa}+oCg043oals-cD%V99w( zfRaT?pHvL1)K`~dC`R8yYUz(ciNabJfoZf>iUGR)xg${W50Mf(6y3_734)#MkpeV* zPyhGrUJfV+|EnNHqsPVolv2vKK)3;&kh8JI_n{p9I)In9b^C8Qis7Sxf_LERe=9VK zgvAH9;o;!`Y`s$^KI$PwcVH5OHXRo^)fYQgc(&8n$oPt*RIU>&Vw#&@q}^$xrT<$?T*H z9L%|Vl+cscMytkre!X0gqXz4JkMm4O-z#&^x2!)XlvvPxH$VV2X@>3}_ef!==rNDr zm+C&XIMT~w4?6PQ=`V8X=^Xz~A(Pd;0Coz5YY zpsDo*I*Sbgn1xjN+XohEun}k?z|$2=a-wcHpR<9?jgdk(V(;8Q>TPK1HLNK8&ni%U z7i}6IeuiFTa&2`+=CiQJ$A<`sUPa{9qF&ywIM;#B(w5}=rP?J9Wh$FpH_wptTxORPls z3m!;p#xD9?y;mxqsi>(VP$M zX=OM<+e!G`IXaH}8&rVL@%i%>o_XJy?|zDA-+fhe_53Nmh>b4bv=`s+o`v2s%4zrd z>`dha`jJ6Hi%;*#j^ zD3sQFUXw_UFn%7Q5u5xKTA4GEN+$=A^zte$Csl&R*a{>yuXiNoj!u!S&U@+Q{*FLC z0%L4NiL*9bY^j|jo5Aq!R2wgdROPL1lVK3*ewoMoy2<5#M1efV0rLFEgE_ndP+)*8 zMqZu=)xF?(iRV#TiYs8|kBq9+m&Pb(CC{5dKEZH9EVOF)Xspp5EU4AdeI_)hR6>t@ ztKA`H7}8P4Fq*MBx$uWlDtYiyhI+~&Ig&IVlVEp?%@Va2*HvOQ8P)#AAH?ARPM4Y`w;f9;J;K z9vu;m$Kmj@3od3`M$-jVtuU;Bl*_W=#S=~uEw6D2a=#{9etwA5EbE$}Wrwl`Sb0g9 z3%@CLvf*9xF-_8j@-jSt$J2TVXe3&kL$7C#VF;jkGv%@m9D2jN({_zG)TdNhJLtui z4u9N5d@S*u-YhgX4dSP5ZZ$sCzm$R6j|?B|7b`*eEHp>bQd9G-oFEZDwAC9Y$FgE zzh+WlhYtbcJTkEQz#UB**HZf&Gi;b_F@nf={Lbe^!>m;U7?%echi`yFzm28PeSkvu z`v-*%{2?lRIR?U**YQC-78pU6 zJoK66_2`!%HSF^0NWchu{p&4Z(3huuM?&lJt`sGA`^qk(EsDQFU!7xv_JQZx3oLh5 zBPem#+}#_XjR11b#HzE<_LPJ5qZ7zd4m>?-vDTgd`|-+6*Y+%_`{?ct=YdGC6G;7Y z&O*%_|Iq-5V{9G(tzo7~iasF54(zY{@VAiVCb>c3Q_C zH9ig8F4DjJ9abS!;?`+gT63An`D|H&bPG8P8 zt;Iq@Dk(ZVPAv%(u-x-vy`wM=LE=w-2=BqOSCPDvh7gRaw*?h89{nfr2G9q<;crmK zp1362F=T7Sz&CXpRmc#&RKJh4!2vAN1}>Pm@Tex1P6-g@PPHUP-~weSE7pV?M0lM2 z?jM9S&3L`vvIn^}AO*N(_QNiSox&0U=M1(QnvA;`EGT zgTP`YcVutG z19DMFChrrA^KkJr`!`zi{dr~MicMlf_?0D|n%`?K)Qhn_$lYh8|UJv=0rNbh6rT0=NQBR4~yMlJgg?X#IsNR7|i9MD3Ld#*{!y@Qwbo zR(>Qel$)|$e-WX)&MQWw^HdHX!dT%0E?^cy_b;JHlEJrGY zNX=08MLn`#VXu#4P3Q`sIOxuqYE5mCOmxY`&kRV z`F*!zfV5F^6YYLGjQqVmfnMj*&t2Q8>l*eDB0&1E{N+YiPz;v8q*`KtCnU8SLEGOE zi-Q6kR4mXp0aUq{qktGJby?Q*LkR(dy_p6Iz?Vq(^>Cwp~#OEhgkM${CTX zw~leGt#m#!a65&=S1LPexMje=icfJ1#Fwb^I=~$sqvFd+rYIl?kpMrO(&CqeXWj~` z@uJS9e6%zkY!^i@CViDAe>m znB8hr`6ELl3_TTO>f1LSSKf_xfXhVeRB5l7Xb>ULB%~3mx{J-!S_J*yk!-y@Dr)Kn zWsaliz%=(7YX~J>5lV7EHA^|szZNB0CO$SnvwWJ~#J(ro5W6-8JoUPIr#asOO^P@Y$`ya&-R8&$FuO*2zi31~OPFg^tt+V(TpN9mFz*E8gzsJ zEwa}~K(`^p5Rop}GGJi^mG56qWm3FLoV=mr6pwq|t7S&hxAVoMlJG@I2{+i@*tiCO`vPsVO1FkcYa29suiC_hU5-OWC2>TnehfgeXc}qmNk@aPEUPZ!lXQO9D6Mp=t{l z0HUam9SRml+>ec(nSeOCbRC4g+l{f!y>#MG`{@60iHa+9}FtmqE3 z9MqMNO3(cGPl5}m3l>0?(5s$LkL7RuR0AjjoE?b(&^6`r{e1u$cmN>@1ym3~SZ`WK zfiMn^u>m5)qB)Ed{QQV--A}0Pc639}|3QgCX=;IF_?O6RVa2GIi%AN|^$ciO@j;A< zMN{c+W=KYscJ82o?;2m7WCA{7dwr70l;T)`I~{hB2fWAvHiE+{-9QZx;ePcg641}K zY;K>Vh;=zDPDUgr8kPEjlx0uC?VoTF)o5WbSHS!T#LkFuZK+Vjzp_Nm%7Mmr`Sq9e&m35k=p{c~BwKM2)%e27>f#d0az8f7 z1}gIPdV2y95&$|Cvzvt{iq3+{7)G~jL~P|Dw>KuoP*o&oA*5n7-K*oYct#c2Ku@JB z3O6W*<3=|7tYLB?B*1!7(X)ozIAIAzd3kCx!sv9M5w8A2MG@bI3$IaC8lC zi?f`V=Dfo6em>0qUuC{rfMjjR0tlC9^3~8ngs9R@r}%6$G#k7>Wxc`fj(8~7&I*GX zz0FIG6Sk}cB^x+=(crS5I3+R~-{k-rawh9kf{Aon0x+fkah+Tnx z%VaV#c{fFAR15X_UZpT7Efn>gYmRbH{=E)h^ms#m9>p5ez29h0PXkbN4kb+YynhSp zJ{Y!EB)c7uA{^2&hYmg`KIPPOIOJoku0ZS>EsiiEn>u#_ak)m*UCvH(A)FNnMDtr9 z@&^m=f^YfoNr-V|72d)g(b?Ti_kZ|okQbH*Ez<_C_l&Ww&jr{3@+H9vELh=JsL;pf zEm~Kra>AcdRv1qlu%^6DB>-nY2>*Z24We?5e>rrReAOg?Hkc9#c>bI zb8W5yCw82%-RbQtVYJtewu?>;-q=45lk9G8`xzEM1crheE7yl(lp-GxTRXc5XxP#w zCMIepY3D@45baLUmf}OMcx{q*EZM}(YOsIIaa60-{Mc+pr=F1%?M4BTII4INlt%=w z{PzbjmncgOO{ROzi*Wjqg`E607UKtbAL8rqB@FT^e@LE~jT3`WSS6Y2zJ0SA15tKn z^}QP6AmV^>=gBr`vJ_jklk=QBiHBH;-pJ&!%~4QLcx6~>A08R`sERh12cStucXu!t zY%o)&Dm@)TOG}HKx*Lbrw%*Ff!V;w+y@TIy)aEDkqcQiOM(Nfkdo2C^uFoIUb)-$JHF*=zVy_ z44SYPJr)B%^9-sJWs_@}D$2?Y&n4W2;j6cYi*Udw+DSU6Ei5ehDqJmt!@^WeR5GhQ zmZ&Fuz6%1hVHY$iYk|I$3mhm7IsoIN6OrWiKQdL4i2kLJi)681JsTePLyF4A`yZww*Dls8}7n&OKz%+Jz_&^N? zq&M|l53&7Pk^_`qwT)DQ3a@zr9k-CsH3K7~D6qAC;&{EkX-iuhNr)Vmxi#GxY3ZA& zW@qE)xRJ-tu^Zdl+r<9<{_CGKWUiVRhD1h2QiERJVs~Q+++@jVtb!|7FP~3(dkPQz zO2n%xVUZ0Dvi+}>C{XneSFm|q@9WpEL-O4ihBF)IJ?dIWyH5lny6RXG*`^q=BhFs%VOI-CWi+x3fD9-M*8-lyW&bkwD!= zm{i}17#=q0S(O_FFm~eP$*9odERmqDw@sXzpO1tVV-)nrBXIBtl?_ZU2`SVPy01_uX6?!@DWST@PX1b%%L1M^lbz61-P0#OC~XJ6!Ih0A3S23@@%ArY}! zw|8xZgkMok?g2_l`HEz z3u&*NC+pAyt$>?(3QA_a&Cg@FxNxAQnqm#|ujUHZSp-4F0oSg@UQRuUIy&KTW=<(7 zHn1If(wLm}LI9jt1(VWnad8>Ew>kdn_wP)hQaQ%i^F-iNq+FayU0Qj1f*Dy^c-xa9 zPO!7&Y;8}0S_VCvY&#^54^eJ=t(l@f=laRu&`{`rlG>Ltvz)&zYhi&oe|tCpdgAmf z;!gN4=Ug46wDr;!Jogb8-Tub-- zK7Xk2d8gDt+`*W^5Bse(yqUW+s#|s=2v$vzh#IqAW z&CSi5nwsQTrF{*EwYG$hARGm!rlxwYO$F-A=_Wrusezp@I%lxOlS;?+nbxNMel062 zE89(p&5H<$mYa|FnfvmkEa)*zSuc5Oy2r{c9YIyd z06S8=!`(_HXccyapqsmU*I3!z-!|qB4*ZWEJ<2#;fXfS;82l^>-ITC}5-J_Xt2~?9 z+7uxC>m_)m78e?#Fb?4iENbn?gvFrSD&S`}S>L zp{Wc67&yd?ho_ZwjjdzOEh2AF8WKCINrY2E3a}$^p0Hv>&YcU%%i~`j%)xVTaDeaB z4Tv1>elN5gdB+<{#`Ivd{)k;#S{ey>@BkOILa%IkQmFNFr9h-4M+_}_g* zQW8VJQI8X*MlaSUC054i{WD z7W+T&70NyFJ9bHWYha}g)S$rD@-#Ww_T#Z!{lXWtbGoN2N9K2Sc8W?%1%Hn? z-5xzyZ@B(pWQ1wbZ%+{3^&oQhmz7SAHi3|k5IkrTtO~i3l9FBI=k$S9@t3!^@9%rX zr=&!J-f^~_!@mW_D?K8r)BAH$FJODyTjchzFdC9XY`PhX{g3>59Q|c}JbnIL;Lgfd z-Vncrg+L z9Uo2=YfG(=Xh2d%lY4)ar-N4EO{xA|UH;mM`7`$Lwgih`-#VKb8!yW%C|otUR%u*) zNBy~s|Dov@u@*-^NZC}ZtODBCuctZOzcTU@e3=ej{y+oo7~uQ8v-LKwviG?JH&7T{ zfMPPfWNksPjskxQha6|0c<^cAo{r8F@0HRo!C6_iLL8k_$piEYZ_ zrrutSv(6L7!NI|{L-1}0IpXGLB%A)v*GoXaN`*#r*i6>f_We>i zI+Rgwf#mx7iz%_(6XOOk$FFBaELw<*L24>mINjcR-)H|^8i25Yfq@r$6g(y#u+!E- z42d3w3kQTC?U`EdU#6ZWZBpVmx)nh>xuFj81fd8fWPFCx}PqUUfXI`($Zp*~(v7gJC{r&ja)sR@_&a z@9|uNGzehAcN&IZ+s7XXWlIeOVJf_Y{EiJ@GMn)pA&qTXagX${mn`F7rGVI&O=kBw!u<(zKjmc+SOO=PwgCT|*RCz3keew4l+x4UNUE+|;yjPVr zzy78A)opjK!#_9E&O4?MA3si4Shs8c^aktUN6oT5IDZ#hUS6Jj&LI&(bSTIQV?lBG z&~~h%czffMMq0%?aRC7}5Kw8Q+m|i?f=dUGf;!a<1oxS>>1H$mTR@9i!^9sN@hLk9 ze+n3oE0|HlA{eB;_n%rzNJvtztzU0EL=AB>n7 zjqC`G;=PTwO^wUP?4GGc&ca5_2u}qB#gEw&6WG zAgg}>GPiy3oZ&J@76`i;Le<9K+$6wsp#-G#w%5X6$oNZxxv1#r^=!uBySK+Gr~nZ5 z?YZLdGKioh*6%7hIW$><2~OA4)}jJF6d}E@i-|c7u;n;xrW_R^ad;0Ago$+cBI>;J zVtK$T3yX{U+sBO#xQ>pF>ffm}%+%pq?-8GTsgl44Xov_w33~VW?nb~B{ZJ*MI!P@p zt&}~+rt?H9Lfeaduka@Btx5@i^cNBKUNeKJ$(rW->(~>OIhsk+(0Aj3k5ZGFV6x^dWa9tHglY^N$aUPA?jrejxE5n2+0 zfJeP`DjZ%RO5JYg3v8f*NI{Rz+SHW~NEriiM~kidds|m;ScG`*7uF8k^@r`n4XE~} zO)cbTU8qQAevVhqqqhe;})3r-j26Z?+ywu9wdvTpIyZ6xV#WFA|z?axPZLZDy&MJ9F zEg3)$7H>1kb4Y#PA8YSj-`Lootv}d$HeUu+#uazJ$ZAg=!|Kf^%xJz@rE1?4Lh>T7byNI`RA7_XE542J(uEB+y4f5lYXyfz={3 z7eW(4&nNZk*4q(D_9N-ZV#_c%OW(hL$@&8=3R_fU!b}(9l2A8&VC}2rdBqKGz&>u6wPOxF*$=TZ=M1QQ;*aB{jFV&y^SxcNh|= zS#M)Wxze%%4gB_5d8bmzt-} z&ibxR;oNp~e5J#;S=PJyzD+Rrl)Lw2TN@$xwQT3!B{=Q`uu4emi>q~C)J7i=1VB|0 zq9>prbeP-Nps1Mjf(ruqOFK#bRm+hEu|0eW$RExEkb!5k0)CucSUBl+3KW)F%W58WZOw4z^mBFCYo(^7IMg(Z? zSl*d5|F82Ppa$gnWuIN;=m?b2nou{@%B1b3wcX6!Ag#CVN(7O86JQETT3Q~3N<;UZ zU)Ct&wp#O>JVo3&HawgdjgWx%FU!gzKAXz~5PIRv0IIkPg4ZHI-Rv^efV02(#nh+z z`s|I_t@ZWO?&O@BZbG*qA&A`Dx(#P^Sm9*>3T9?za||Xqdn{e2B_)k`czJ=48Wx3i zF8Z>r5WsK%R}=0;R20BF9->gf0hQ=&`u+N{pzAYyQcUbRJ^{hfCVsZu6IOaA2$m?i zFsSt@1!0>7lzP^0{4{fPW}s4_1$;nT>hOggP8>9S{;ccn^hDZcs3L81hmMkx6OA$O z)EkHQ4=+J9TAPPJ*aAQ%q_(#9X0PYTmMCX02uV;bDZEyUk%vPU6YN{}U)&H-0kSz9 zTAvZ%Or~nd!k1gx+x2a73^&u?d)*!_Q-^idf+I;+v#R>@vK^hBohkLN)J6k|K?AaD zR6^dDag`>gD@O-4CcLcy$kQEp2c9dsRpKphvH%LdFW;riWINdlUcTf6y}o7N%gZRW zL`cC-h9qC~F`a9fg{BEA1YjOWTEue1WNa5{p`J%6ud>@rj~+ip3D-s- zN6u&j991u{{Q=xS$<9vB!om{4KlEaO?Vh$ab=mC^TsUKde!y_I))`O< zR^5Wcl4WHRv`u15+=pbWb%|C~nn_eml2%kBE}KR*mROgpkxXoA#7I!rQtBEjrDFx5 zwlioOqo|@Ql7@7fu_7$C()048?T=2UGkzF`wXgSkp7WgZoMTRQl=Dx@%Z}GM06q{t z0RuC5zHf4Nx)KBBXG-44R|1O_%(dqg4}3Fq1=rWxVpBI%N#xVylCh3maVx{PZ@p8q z;!tpzOyCoKa*y;-Qpx!f%Rk=zo@K%bZfdh-b=q1LX;+cWOp&M`ZE9&l)g*|3is6>n z-QItaZx7b*8A`M^o6R1)bwDTTyW-qmzZ?s!V9&ZpltEm+H~eN*N8iKKd1cvQ9@8U(+ndS3dPLBhnnyP&dq&D!V8D7_!=6eR4)1G%7kPW*L2Fq}4Q;pIwX~)t_Tb=PLbW|>_>x@fO|JHDpcZRj6vd;o z`{P%GQB+W23h$P)*Xg(pH=WKJr*5o9?LY3%%@QS3SH88*p*yIX*d5^p2I`)1G=DPM z@G@{IkZ8|VTn=29y{O5~D#q^;?0bwy^b931M6BUQ^Y=L>mD*{-9DGupKj2)kts6ag@n+_Lp z?vIY{z@wp*Wg5OE{vaq;HG!Nk9`q;k&(RMnfJ{QWQoZcM+bMLjePOM%nVFf;j>P>E ziG(a#APuq-#h&z1P*fN(n;|O^4-u{rIdQ_B=rP=k%FD|M!~n=|#{I=yK7<;d>iDD*W=`xBXJR(;-MG5B3uT<^{Sl9s zhIs{KdS&g$^2|K2>v~$qK`U5C9bPzX8C$G^+Gcb&?*E9ubkb#Lw{_|+nO4kctoIGF*_)b0OJq;ru=h87| zo=p|u{RCEVz&;Gr+Z7DV$mR9nMFH=|p^ zo&xItt8zgpG=ppdBIJwUQa=y^ug6Wg4Yd$H`W-0@*1*w&EtuamC@?O>K1*F}bl1^P zS1&tS3!X?rvi78o?Z|+~YV+5Ty%(Gh(a}Ko|2}cYCo$25Okc1(N!FisEG#bGg9>^X z3`Q@mI$ov^C|fo^Uz=2nFi*k^1Ox=6iNyyrB0ZJ3uYZ5WsGjO2gsGBd==(smsr26Qjn&iV4y${gi7Z2O=Scj#UcpF z;QoE^H+(;OM-W8PQ|6|Gs#D}lpRuc|!>_`HjqeE>x3O=&;QUj)5US3}OOqHZW=MpU~?Zom#o1oKtECZj}qb`<}O>K1a<+(Hu1)NGi zK)~YC5|0aY=JTwqEMXB5hqZYF_|3Pvy1Ho@ORsbLkijbJf@Ir4_f3nHfE1a zo0l(Me7#I*(VhQoTE^Nggdef9v!i8V%7BG!|C-YG*m7XKaKXGjm|d#^Q?R+U92*f}q+TZyIoR1{^j#Nj zv1jIG%DRxv7cmMuDP2&ER)u9>>Z4<1Os8fNG#RZAsUo_+eEG7zsi|^0@y<%rH?=XF zlKl81GEYO1Qiu5NDV-ZYEtY_@J(XQUP( zj>m`T4J61M^*woQwsi^}zVY1^$%Awk-x?ghN+~I}Ise>!ZHOEWeP4SzWTSvSJdjy$Msp5GQbIY3f|-8yjhoUerWrm^nT- zJ~x;3E$D)IORPldy*wk+&4+pAyX%Y;c2*8NMn~t^HDh345T>^(_r;GXt!ig$&ahNI zP*1y5u1w+gc;&YV27E~hv#nY4({Rc>T< zWa@I3^=0NftTX%l{eAdVLvOgI2`nC)cWFeH-==D0WolcN+=6W>Fz@W>EwQ6zU`SnF zwinr68>XP4(TEXsTV8HcG#_h zX6-F4agqfO>!{se)!wgOwUj$A*>~zbF`eqjFl$f#!MBrFQ;_or(M$UgFKs^ZH6Uy| zGAb(L>({T!JHlD3maGx-vRxQuZtkuWHS(s(#{M6vzv>iu$gzuo`qN5FV^#d4c5_Y> z3hU0gU6S_J*4e0GDe6(nGm@vJqci*d?h0|G$BOpkNluwm{i@2=)>dAJN!32v2Cl{B zy1>`Iz7D1xf71bxe1`aH5d>MsMfjug^Y#39NFV z$uMeI#VpR}c#JzSCEA^6T0!X0_V)EvyMI5n-)WdCL$88(O>9MR;4668OMU7(I-5&d zm6c&k2KwbrcOA=gr#iF3`rOwCxK5oKS; zC_#oR4_@fGuN%URx(%zr%$AHDJA8P^aX_p8gL*dI1=ewHeM@{zV;!Meqb#2|c&`F4 zq!mYE=)rdcNw2^BhEvqj;lj?AFMUz3Z3A~@qc<(*F?xF3g&5bxR*Q|*xvFUku;3%s zI@^q2C-G@=fvCMpRZEj?rQQ1e@!h-QV1*2gj5to89x~e&WIIbc$GJg~pxxZ_W?cG~BI|xiifPhrf)SbDA=|faasn6Ap`s|lifc<*TXQlrG&KF}O-n&R(TXM6 z)1G|ytlRPrX(Dkd3w%bRzu2~>d1oeAul7WLl`K6Gw=F_vcZEyQ4M|B_u!&&mIIdn* z=B`}(pyxbFJJXdXZ3V|PXKB`3oI@l`;kLInrZS59mG9hnqYxvSVb~Cw0=8+gyI^Y0 z{SA|lV{&rxZFuP_3JOh$^A|H7nm5=Cg~Oam&Xwfm=GM>H%?byM5^Ey{$|kp+b2!b~ zA80HVx#+M`8<)7bBgyID>U4!1r>#fF#v(*UQ@564cI@#P+N-TGQ3|-Js3-k4e5S3R zMkgjFQuQiIr<#Q3?78$Sdq)A2k&%&QKHWoJ`t130UA0tI8>$mmKf&>{Y1rE@C;A7x ze?L*WwbG+YLPBy$CUdT8ryu>1si|ouT=P;_S67__2M%PG*o~E*E1_l<9*2*a6K%LM z=+2`sCpq~mVRNau49=)~j z?Wt2N8m#bmK7RaIUth1Rq@+~h*56xmM5O3`L}jn_oxo!Q+2PyH9_DH^Be#zunQGu2 zVPx1swjyDw8vJ_3Mq7HF)sqL`SoZ4vSa)$5pApR(ezG) z3PDtnz4ysF$}AG-sArPD7?23st_^Ib)EGJ@+n2I-tl&0O<=FqKGVBP-S0}y zAK3eV*0+YV;M5g8?n}Ly%^ikp&Ru#L0#53~%&+ch9+EzeAgimWWfl|Lq1UHBQqx?; zb#U)}*1;*mPV?0Q<;TyJwha5#GX$*_biX7{#;g`~H2S7Rh|nO|f#oW(tV4$WX9r~y zjPG!9G0yOjTS~g2rp!vd9-6LsE6Qu#xkm#i+A*%wa&L~t+j1=H!Lt#%ci^7ztHNS=x9;oH|fcFEV4PIg&M2q%DmUY zGx=i3<~8td9BQd-JWB&RdDCNKPrByvZhaoKEdex#`~LloT8i?hah1#Qoi8-cDyeBl z$z|w5uk-R7hKb%0J166vqH=4P<;~rhRQKQ1dys3xwk7t9BQmddOKyG^eVMY-$Mo+0m^v$_%ud8 zH6NLnSdY-y=IDkWoTMo&1C7vMVZ!GrYTeVF{8!BLAXHosc07#%JLVI zt*!)|b`RgU8OiM9A9zk)-{$tJyi8|6p76v81W7xEaD8p4O{#J*&s-%Isby#33K<)f zJ4aL#ABz~Q@FIv3^?vb#Q|-cc*lUlrCn?a59t$1+cJJhJ@1_L@o8#_v3qDQS^2UdkF)+bjgQ=q;sLf&iPUg1;1QEY?8ab_4CLb?!t!>$>hyBxlT#vtTnzn5! zou#Pd?kM~Ai|g2G2QkRX$SQ4MPSZ9 zx1#s#Zi-yUY^nV2W2CqTK@wjepPHS1S`e#*!pGyKyVJC=VUAJXfAk$~T^{v}|I-GG ze9DqFQPpLaIpCeal3ISoORA|W-T1eqy58N_aBGlihf~NxgxTJ8liv@SmQ`_Ia!<7O z5~T4DYba&}LLQ=1wf5aFzImyvv1MMtmv<^BLRF+i+l7aFa`u2}cpksx=6MMO;eaSW z<04q< z&2PACceWa@kWXrPU6ic-9ZE5x%xU2gqJq}vHAF6Cw4~#`1di-OVo6USHjUlVFWC&8 zo>`hJ>)v8j*mCISr`mWFZ%g6b7!BdD`yP^4Q%8QyC9aa^w~aT+j~ejgJ2f0|I2n^< zQJ4FDw+R_EG0Ho^;3~JrjsLoOLF(G%e3x(^54$c;D~-)LN(6iI406}ZGF@9uF7OvV z<=#7QMum!O>oU*py|L-8=m}Y0*n3J=jaH0Xe##?0dagq!+EG&9LM$co8;YMlqOW^U zY`=K0VD07Q+pfW)9%mE+PFD(IMD;6h2~!pAdl(PwK?dO#1iv5u%AqBEQ6fsaT{WjR zF)VDlJ=VWt;)Y%TdO+E{q=yVS;Ee z7xUKUm`b4D3%vg7x!fFC27bxyZl_Poo$;8j7;St-`)N4Ls+&ao(9QQ zUV^B>BBX6hsXE3nJ3UD}?^+awo^m}2$^JIpgEXxl;ucCTB!xy^nrQTx`GK7$jz75PwZdN(fDZiXh{ghXrz0I>7?bb3#ok% zxQrkgzR=)qR(MtA@gq2r90yhz6%XN9Q5B8J@pa*#FcL&5=MXkosa#~5=;BWo-kar1 z>L#4O@RiI#UZJh3Fot(`BKt^QQKZ;4SSOxiWh-^e&Rz5&tkq2sT0byxa14Qg#12Rz zA8NcQ7utF+{8~0~4L&#VoR%E#B3pX33BB{xR;Q7>an8;^mvxGMhj&zEJaZE%ST_kR zJ%=-!=s1e*N43RaZ1OQnE9N9tnFTWyoVP87EbpU^eIix&BPhI?cALz=RC&!b2yOo| zj_S<2#&P_QakS>%dy0ehZ|nGUMit+zf?CI(HD0b>*IxAWim6Bsg|u48o1^c%yYt|W z&oxI_-E!~7SM}DT8wQW_^-J;%vz1tC28_1k3D4zk;b$iWY+kMy>g{eu60}Hh{%L_B zHk~Jq2dt#h4JPVdu(Mx%!RuBsl#D*C%Ty%$&g2=`?oo{5`y^@!x8Q>5jJrt_ORjtj#Y?);|`}j=6>Bb(X zJAD@tOvhe7&cne4NZK#18Qy5bwovFvTwc(`Q!f5^+Ey}o#pb0^hA4W8Vq0?`BZ3fy zulCw`dwT~$T*km_66>)!%pyFlt-6tXD3MaJB||D)*!jcG8cbgr|FDaJACH5$! z_N=K|G!@@Rmzn7U-8DrDg!7q)8Z}2}P@UvA`SRujW~uQS-@`9&^xa}0Ea&9poNASm zl9Cd*;TMpE-{_1qoF+=V6+g+YM{3XL_(Msw<^zs3v~uOij>!G)e0 z4Pjxik+3u9o7dLd4rqpohPrauIujk~W^_@284gB=AYk7BKP zPN&Vn`NNl$7$|F%2B;nKPvyiRpOuwgv*bn{LJ_dgiLv*b-h#*I6uD9` zVlQL0ZSKGCj(&Wbz)RFF4I1wkj}2b?uRYK9uICxNy7!clH;fZg7@&2XSI^gM@3_4} z95cqMpnu)bpAmhky?aUa2S5E{@Dy#}*4+`>##*s7qbIW5Z)Rvjzl#n@53zAp>N!@p z>*x2+9^G|3%-7S<(6!H{8?|meXOX8@9Tg+G(LUtO_f3BPe1@=d-?x7gQzXl{*>M8F z3czF;dD9QauD@o&7fCXe=(N6=TTPkE#|s98SixPyk{!m13oI<;o8QR_m36-?Mbgi# zWj7vK`bG}FTE>GSq3q)@6XPe+(k2VpPJM?CCoDOC#yAnRe057zKBH@?KR~koU929T zhuf8N3VR+*$p$7}5{uoyWwz%W-2KiB-#^v0Wmc`4#C_Z9W^1XFJn5&Sga#c(b?m5J z;t(J`bot&`=#bXcixNKyo`;0!r%SM8w29HpDcwB)CxgwEKu9fP6_R6qiyp>F3rfiZ z_A3e{_p4~YYlud%a>!wl{ly2kX(FQM`gPj=KyrR#7-dA&tzhN_Y7RmmyHNbTC&J5A zM!EdKr0QJ-iPzEZN+h^1{!FSl;>4+Lmy^jAmh}uVUMW#yWJvk_Y#TS2y-`mwtf`>^gct#drC>7%fd6dv?9kyq+0^N zr=no2{gy+_+oY1It0>O3wu2@gKl7z01t;uf}Kmr8f==t>?BiXM? z3P0r=9$LZtZaNR}KkTI61YrAahpRp4ZM}9AAq{!)@2+PXbv*_z(U9a)Si`h4w7LPU z?)-0FCi_#$4}D9uR$N4|iqd2B#zve%p31U8D8xc(g8LB_QE$nUZ?a_L!150;x84I2 zmg#!zxo@CV+-_eT$C;nfUQNFzqGcwCPNSy*$5#J>-3=_uu~Y+Zri3#x;IO?;=zTUL z8(AUI1$P!}co>T%Q(ahU&ELK@Sz_5ZYI-d=myl3;9%p9vg$!Nt9dU$|&fvHwkiV^C zil0&()$|P`8#>)oS_u-}66hEY;2J#ma5l|EM)}!nXwC}+x zDJejcXMm6R*5mjwDRoqfxjoB`ekzmUkx5k2O%Z4l2qUXMfHB$mi6Jh2yN;(KwB;OJ zpX4!2?BBBagUVyCo<&G}%RI?~Uw@6=zZO z^|&nc5K|Bw<|RKcQ?Cl)YKDkC3jVQIVL5M?=gtmQGEJIDJdnm`{mwdij|?-|rxw1p zB?{|_4TL<7PSUP%^wG$Ar)7Ix7c)H7$8g!rw@K$BikD)84`C7aF9SW2R;#Z&rdA6B z{c-XsF3rhkl+o+afexe$1FhWx^siWUn~RYlONx&)_&titGg^zSR_i|k22nNHdkQJQ_dFT%ka5U;u86Gq0uWL==GF7Xcf;EMB@{#h2 z<-{{T)|b8%#=BkSHo4Jn7WMrX_!kZe(nHm1OJE?UMRtMtX2rCY-FzgV*-5Xy_vjPS zA%P}*WkP~Ce1eX&3k%;Kv-RP%CTdlb+J||g0Z)+>LRx(3E`F0R8e}ucqOB3g3qBD1 z4hK`!TPxHBXQ5krjYY9cZ}P_th|uoF7I}5Bh-QJcCp!Kyk?s%@#kSjQ2FJRsab~siQe}K>i_i-Y??`~kiYAbc>YI_K<9meP|ijWaYYy#S1 ztn6B6nMdhe2~p=AQb|>FbG}DD`c;d=WKCY64)*_pe+pPgU4ULpCbIKnc=u- zgF2>*zR)BIMdpzoa~NFh++5Hw#ck`?nd|) z8?ii+L3K`sM}z5Zmdu2pHSq%&{Axj1%xF`sWn118KKvW$ZqD`rIU&VIDE@C8aQY5+ z?fwDCBe(Uo7MH?e#*>Jr>p5*rJ{dxTuHg(=Ay)OAY%sd5Z+SgwcDOBn>QN!Mq}bN%$4Io8haT|4!8jZ)^pb8W{O>r* zALCQiz*lHS_ZgY|WI1WN5*u-hZX{z1XNU4GZl%9p0VL{LLSk!pbm+FSCIBDiKln_M zn3SZqRQI*1NgXmbz$ZgeSJit8*&Lbvd;<+88df7i&k;E9 z6Ez_)*h5ZjvN-Y$@=pPk+eC99mT$_)$b>^0C#zD?z#tBwJ+}*q(#m6gNl8nKSb^tO z$~Uw9siVKC!J!kK@CIOm1{pM0_Wx{XkhAD1RKsA1i9LaVf%%RzS{XVei}V9ypXv46 z2X?ksWBM#d<-UqL3&m(B7>f?11JfZJSXxNg`O`(4<7-_T+)@q-KP;Ck*=1p2oyLf3 zRnvt=jo}kt1I|_vMdPLY)z#HI62kyg=SCkG^iUVSisLR)A& zJ$kmZo`!p}A(;sYfK|gHle#}sF08DmD=D=YawGLI2FEcM<0=8Vq-m+SI*jN< z&qhUNPH;O#dn*FizAK9o00QfOBu4-K2m42mvP0 z3uXT+9IfQmow}ESl$pGGNiB^!k`FH4J5R786Obw1=)wPZ_Q{D4pz!y|8-%Dr*>4Ri zyUym|8H7YrDkvO~cz*nBSxzBvO*2+2$vfm}A@5btcnyut5xIq>#g>SQc!K(z37VLD zFmMmJnIzgjnS**D0jdLMD{>0ysHT$78$3lb2Q(E`T2?#e*8qrJdR%PTFVwPScz0ksClX!NlLGk_AqU7}NcNGtMK zR%pR9htpY_{!N-VjnL^oV4On~ZE>ql$-_CBk-IB-IYE zse{*?Tz(R6te)g0C|-j{CmC_|QnI;iYGuEBD;Q_%MmWA=(kJ~&DkwuPnCqQ;P?mRX zn1Hbva- zvL~WrBPPArioV7T#aOmN-2KPf%zB|Mj?j(7-}CQFND$)(CMYJeQK|VgXFfMi9Xi(& zu(PrOV9!TpeEF7sPy^wV(TB5bciW_JtK3Ejr$HdVk$UkuPkiuIVLhgko*Y#_<8Wh^ z9XpL(>E$1G;W+GxVWL#5zbGc*`S#ojO2*Tl^h*V%Wk&QH04zILjgsdyzhv$9&)a$A zeF@p8tY*Zb(#kF*OtkSykJy%ck0!7F0Q<&9ehp8fCae6+(o{$HC98rj(Kb!WwNQrs zAOIVsZM4OOIFkNw(d?*gR}B^LlXQ;-Gg0rg8eW4@}+G z!&r%HZ)KSCIRB)C)4kCb*p^RVgZEWW2TMK=;t+q<_Rii557g4Uv%rS6K`w28XyCLyD7GOWw?;qw>-4?>LO&@vXEz z%vx=Mpi52*I@Bo`isKbxMN?t-$3y}dpYPgi3OqS}a*r{9huCKTJ!46)P)e>ArNzIL z9L8r$VHFJNCqJ5|@w#{E3BaPPU&5l2vEl8M?KN>s4ptG}wxtP0m0j`MEa@E+jNq3y zQH#LACdN%ufxn<-wc;0=h12C+i9%&SS~+uX;3gD9h>vg-Z&;>h+^Q8!mC=laprKt7 z==h$2Y2cNsv%qG=9x>58tF&}fX!5CJfNe>_h@lI9u0l;PL>D#0mHg||?$ucT{->^OkH$n9V zA&uOmKgb3%o+KEU0GrzRyiI-Lrg|lyo#H)cC+sL3pY2jUO8mms@~=Xx|v>1dG&c`V2?DOw1G zCqi-w^gXC?tUnIxpj)joGC&iEJ*8?PDw-cI7+bX1EfuB2{zNmGhA-eUvVHK*5_R4@ zPgPRz^xVX-nwLX!f<2RPkU4}EhTzuiOQh3=%X4Y z`oC|%hO?2usSVNt7ti1cWgogWuh`b4Rr^Qx~72f*Ww_sj0bPXl$&% zLW-y#?K!0iE-<(yIh?{f3bW$Fg_+Egujc|eLo(Y%CM>G-;eY%y7PMn}KYIL`gw#O` z5vF(M?AZpV(?~H6B9ib0YZvfLN5TI7w)$g#hp+EEq*UDt!28V`N-7pnojjw)K!5*c z+KT4!AMqg}Ar2F)XV1pJ(ICZcql?rR2o7Tu~I+e5%xFp?qr7 z))S+wLVV-#4yA839R`$uz)j2g5R3Go1K$C)Xc^2hFB&?dD!{Fo1nbOsBoT0fo)Bp5^J7ga8jVFBGU$ zq+S<*^B0j8EdZSCRx}arKi#xYh)%4&hc*F{2DyW>TR@4RB+T>4Z7{;gE^rmzC6Ew%Ccy3Xx?X>oLQSqb1~X z{#%X~4V;ldeoT=s>R0gBFN)*rDDZPzc+5tGh^;jY!htqWXLw0wCh?$r*6JjCn4GL$ zp~hCfcA`ob8H5`gkl_QZhik<&W~NddGq&BaxRh&-e`<#Y0b;WP7Aw55$`DE*mT9Ph zhM6wQXh=dZLOX$^t#jNr>q*L|A+WScad19Jk$M#di+Wpkrpd3Pf#=<;^l22d6OZ0o zM+dry4z%JbJcCKpkVB&<@Tx$b>7k;X4PBH7;y4FQlnm_6Y2!ZE{=$Dyf7>)hJ2gbp zY4*5Yffi7{4lUXsu08E{7Psdo)B8FiGOg__G>~BrfrNf@uYoujY6m$O|M3dR|2ade zbQ-`AmSQTCZU{Bm_A~blN9m^){5z-SdiN3z|VR2#>6o4BZja zzK#S><-jBDm3pr((S`m?z+&Kx_Mn`0VmiL-xgc;H4E2{26gwF2?jq(TG&XMAokcUy zKs$XuZnB89>fuStfjaS5YsiyOGUcCI_kyf8q>UzknI|3j5;JwU1Q^xhkOFYcD07fmh=Q2hy-qE4PC`~i(`fzIFMdxo8W z@4;S0>m4pO8}S4?X@f;}N;liLK3@G^hY*>6BTt>>_wC~$pnX89J@Wl2?$*!mg}p2F zmW?D%m0K{Ze3KeIh9YJ*HJAvp!wM|<9L*n=yw=EMA@t}Zzo>kVpCPzpHon~^wO}sS zLiZ6LTc@K+q@g_LQe)*(qXZTpKSM~-fwGE$Cg+mz*7%Di|Hn!S9Fh7A2nCrxnY!j| zsl2jNv@qDZNF4y=~{C+Uf$3%`z?_>~qvwuA}>`sGBb z11|5r8!YEBrhB)1yjYX%e8M>#i-T;}^d4hR-7^e3W zcbWXatZ?F`VdaADd6ZVrc!TUk200+u-_9W{1JjyHKZzT@M>fgh5R!CpfEyQd)}R5(18SDAe1Y2N4fIZES0X8z?FxD&-dy1y%-8brz%?|zyPp}8rkJl+l@;PDYypWqDX_sIl_+4w%I)^?-r)FT z8^5xT=a;m*zDQIPyK2>{##GF}bii|14jM{eueP!QQ||R8O|hpNFtbg=O6q`1TJU=m zGix%!?u(yTB;-yJHa-xVH{wUf3_DZzjI}%Kq`LRoK_W5xGTMo43ujUxDuZbYfBK*7 z<3#}8NNnW4ClWu+t)~5xNZgI{#05Zx^Is+sufkhDh%Wi^$G#tjL8YX}WkxpPs+YsO zZJqHYX<8MsVr=B-#-C5oXw-+$stx-S*ozb~W+g}&J1o0Gj!&rzeLU~J_SF7cCedF< zsdI#P%X~v74;Oa?#hKQ7qO?8HxBgcqu}(}cD~xVtm%LzeLr1YZ^Otdita@MqjXI<1 z9Q#E5bqE7x>0!gLCl?m8Cm`*^m*JsJwt+DNnIIZ6wPsxS9_=ZM0^(|_zJB35sH$sM z+ZSx|HJu9M{*j;dm=M|oi#CzRXHMdp_tlxra}ii&STcmuT`u6JTHfmfg~ff?o#?}8 z#|Wt>mPr$PdQwt>xL|2kFIq6wDqb({YEycOE>{&P;>(B&9y(yA&wZ2rpj`0sHz@$k zoYFPL=h2nW-h?b7s_u&`;tK{kAzk3ZKcG48S&lv82Y7L&yFdl>;Xu8{MT@wYtQl50NPa94#P0E)+tJ1Z^vU2_RfZN9O^kXt|au7Jk zK`F~eC-UIZ{GJ!X4+;CqY z{9S57h9EpBHE(a0e$U@Qi6Cw@(^#GiEQV=QH>Hg)d6g%!Ndt=R!)K+EfuS|~@!>P5 z(1C{s4T(#5dks4sX8bDN|0vyK?1~nCl9F=DGoLgtd9;;iPmabV7@Wbvr{QCB^ zR;hgo)GsStLadmyW5yFgnZOtq@C>imjD zywQ-b!q$tk_cIaMKu>C>)XzTjQyU;{!LJ3KgYp!RvFJh&fECL54}wKO4UzMie*}wP zSVO7Bp|&JW(#x#B+?hCAHg}Ac)^Oz<*qB@YTdwp!Dsl$*LG_;neozLj%Jv|B%T@@@+_SPE3?&FV8fo1ST|bnN8wdwAp`l0{uSfQ)lJF zLb3T^`?`|?+oH7*i;0-8X$V0cAkW5f>Qy4Bo5Y%b}e zO56=o^7TswyH+JT7S%oiL0)E=obtd+4vIV^pNnc`9drgtT2cVTf7!|R^%dpalYR9j zZJw7;^ShNT1w%I16y!tDVz()Fr>gXEU|^o`2dm{Mhxu(>cGT&xXu zD-;WoY12`3m$A!zg9btlsL?dL62=1>Qs{epdyb6gWVZSI3PW33B2eE%_f=Cgq~{}V z2B({d`Y0sq_#fA?n`WKO3hF}Btbe%<&ck4hk?} zbto5&YLGTO!0Yrn%hvf_;@hr+2@e|c{8dx}xf=;0#bl57LS0IJ<%Q0yZu-3>)W89vohXq-tamf z0E?<6ARs_NP0jD($xay-va~8F5T(E*=B@)3v{xzPRmB|txQvj1fH)val(&8sV|rO; zUvAV^SbG%H&-xFHLBRw_;-KWT>v4xGKcfbc^}NwY1$=nJvfW-XvIXw!lSA9q-2eP) zlRr&wed9G>9z86$=I;gf1w;9pp3@MSvx`fF2-&Y~>udk~Vo-Ko{uJyBT`lc@zdhG@ zZGPQEYc)khMJHS0o_D0*d$@8=jzP#Vy}Q612hIead{^|sllaP*k0-|^*!29hT2QAS!6Zx!-o$eQ&VaCs2Ijs zcGkQSJqEbknMlTsL^q~+d>I9lxy$FDp|lqi0`@tNMb&@*&g&9BdQrbp2V9y~fmsNE ziIcSS^izI9vr3khnO$uctzeVF1szi1t06iCkL_|n$7wc2MMW;%QdO8yi?&roA{3Z~ zi!=u6xyh6f_rdBj%%+YP2D2>UV?{zl)!tE)>~8;qQ+GnV{vx2JSRS1!JJP z7hQI|ly55(zy*hgo2?wXJ=u`~D57S0dt*+&bO!2!LO^M2)D&s@>uT}YOr$j6!-q2& z`c-;Sf)1tj5pe!!p|S0#?9niZK*-sjL#sc}bLSKSI&+xmCggf3-uHWXkUkX>jDu!Y<*U$jr1kS|l(5vfZ3qT=G#uPxzfr^agl!?U~<+60nnkV?j$@ z`T{H$!Dio}$woyaWzh}hoY}ysMc#L!m2XB-`~H>F4kkm|87sA1)tIP<1%QyT%koz61z&$A?*2g zJjQ;Ivrj~G<(?-kTR@4x`{2|5TQ_f7d!Q=KYswi~d|fk+u!EDiJ&I9+iJ-R)&!>Ru zUp$mk5{CW7QXOZyjhb`P2~(Y%JUl9Ja3%H;wL>jX;Fo;h==o%*=X5OV`}DHoC^K^= z2#56@wSh%l29?3P{IA{7&c9FiGVsaL2+w2BrNI6Qx~^q|5?BuTW$Z*93o*oEtM9e` zWcZ?6+Bjiv)|G1rm707u@A&{4Q!xpug5C-0OyCAZ^iCsusa-QM%lU z>MW)@72ywOw(qn6`5Uukk^s*w8RXIDxpE7kSheeMm{@wxj3bzsAi9rHHe@Z0Z{X$Z z*+;1adxo!cbE#Nr5~^=(#6yWBi02w)?%Zjg?#e5;|B)0edK~!%YT&`a`=GB5FK@!2 zWa`SMoQH=8Jle(bJ3+#Pb``+LTj1(-Bxw;aQBoUjv%1N36-Ly zL!Kw|ZHA>Ppg0gS5+Dr;(cKp$iN3CrR^@RZ2~UN`AgiFD?nTW6??J%RVDr}u1P7hf zPxmxDp>+QNik5o+r&qe*aQHCGCNq6y8c=k~AYhvSHsaCBMLGEQ3Vzr%i{L;B1ZN_~74-m}mU&tr}Rp|66bH|Io4gcU`^PA>YIMM5StlCKe`) O$lOx6nR(;>v;PHeHhZxE diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series/test_should_plot_feature_x.png b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series/test_should_plot_feature_x.png new file mode 100644 index 0000000000000000000000000000000000000000..4d4de31bfb13982b77cfda98c82aa21477cebd2b GIT binary patch literal 12852 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�D+>$2v-Cs1@m3dk+pJV_oTBSciG+%2jL=$PEs26s zIqQcjp|8P3R2Me?(MjJj&p7@4Kc!0Go`EYPu_?LI7TS$7g*vl}=INdli{ZGX@xJVWQ;`$PmTcB420WA>Q26x%D{Uy%RTRu&uMn+$_Uj|w4!EQOOI}-Co2h2o-gw@@e zjMzANv|AaUtH9(?)vlTONg5N|Tu_D1G7CHVq;H_zP~GKo7qK^4l9}8d8)g}i8dSv9 zNmA7NtuKt>h2_!9Kf*|Izbh}zbzwAqFQfa6Z<9@LnRcwllD5pHT^MJ)t5zJX*pbY` zjMgpArA@5RsG?V}%vgyUw=dX*>t>!kT;(*?We(|O<$76VWu-+&mVQeEhO1|WzS9`h z4RfVi`hPoEqk;c)u>O3o4Y3tJCnjbn7$txG`t`=Tg%pLiLh;QB(v~&8G<6LP>QD9@ z?{TxKH+od-UW)qMV3*U_QLrjhZzFx#=Qg6-u5Pv;P3gqFt<;w;YfHD-p}Nm26&94BVP=*pXw#eFx;U=iy4G}c{$)^b z@Zw;gn1TJC06>@m{S@BC{tUI~Z(mfOoi>zrJ1sjkp@E!-%6RQ?6<)oiV)g6ASY}pM z*>cxK6<`yH$?_-VV?{TqI==p^FOS(KCle*|A#dWa@E#LK6>x<{y6`c7pui!SYEGEa`tn0*-EXmE|Ta{K8vO6l%|3V#j4? zXLseAHW}A1{prD9aU6dWvJcD3@T%>K6eube-|z@=U4b@Wu;br0VBF+^{)3l(##L2S zSsHA=xES+2QowSdMUKmSduuaN%&Q_P`WIKxFlI zFx?f0QA2~+?kbGg5{MM&$uB|&_?E^ z;4aMJ$8=3X3^LD5!%73WF!l$ZO;GE)isIoj!OeTKv>bh|vOyuX_8yyqHvY!hGYlWG ztblroM^~XfL_9^s)|%z&>M9Lab+iDS}bi7Tw^-!=c85u(Mo2J%RM6xta2 zGl=MIn2;I)}ZbDN<#r@^D26@Zuf$+9-Jd%Kas1spO zWllDe6mFmbB{22j!|{`o_XRB5Z$%3`Ye13x`Q?eh3_us@G|i;9VV`T$C3<}8>bP3s zBGMu&mzHhrQ(=w$AuP9nbh%d>kR}_-dc|w2tN`W>-;;0NDs}Lrpo5e`%3bo~IQ&fNQReCE4ogo3|7={DT+WRa)${$UDu=%^O!7u>MfU@}KLT9M7!C95T%x z#YdaAnU2#z^MMaaEvmshOAP$jSY)wHwX4FTG*^@fb4ha3?P%MGr$YHC_r(Ln-l!jao zngN;C)+$8EBJ{4wl)h}`WPdo{a4C8*4a0&UUbnXlWYdY-JW-)c9Q)9jw$>riVSf9T zKKP=oy@D|5sDcpKV>ETwBwcWx{(%n0;PVH4)9~5Om!L+Nxyxz4duFs*tincpsw+P_ zp9Py?g;d+%PqX-I^~Z~IzCDqlc3RS{_KQxHf~+G=Pq}gUk-T#_T0cqe*>x}fuKQW@ zCL^aHb;#1VFP!xHz$LcIFIfP9i@jCML}td75jN5pW_XBgYqET}hn|*Js(h5-nArAe z;O9WbX=DPL6J760(!;6RP*)j3KB|zG_Y`PCHVz@VUrKh9u4<@0e1fQHNTd?mP>PHy zWP~X=Q zG{7_dGu4-qrfcEL&x4T_<8fuSSyWX5wmKxx*(sZR{rYu0G(jxCz2UK*U9!dct;Kh_ zFK$&a_w=QqTw!CRbm3>t6l)%;OR8!vPtjG)4b^X(?E5re%Y62%_yJmW+jbKS+x~}^ z(li>fqbqbz0opVD-dJ&@gP|@II+65LI6u2C0R$#xllS~;-m$8ur(S=uXKwaEW;eC% z!PA)H!eS#I-R!^xeb&6RJ48EIFC{lgH3|sxI29$}2J=XZEQqW%pFV9QPtwrPurM)6 zf?qlPgFUKHoW<`oO&PysQUTmt>%!i5ZOKk#kVxC|hMyoUULB4itaw(QIB}u`evHnC zh61CR0pBf@duO<&Hkuwwoz4@`saOnwwJbWGLUYZh`a#Xf>nTY|EJ8v*w4+F{jThs0 z9_eh{%q!u~Oy4+LdSuw9Epd7oI-qe{FSr^fddo}Cf90k)NXLH@;zmtV=Y2t|o)UE) z9v-G13ap=X_xifoIF8xhutIM7BI6D(HZXsgj7HM<*A%?5;|9YWQ7Px}OGFc_jUTDs{Vv?y9oQrEa>bF7H29 zR|Ak;a2)-9J(N|w1+oHSzNIF@e`{bkU+q6_tJ1^%^DjU%LMJAI35SC^&Q;c(K9}2qc+0`M;b=)AUOV+B3Az$w2r#l!BVKi&ILvxjqg`H*tX~REA0*E}(o{ zFNlnGIFHn&o}+LySW)!#`GX8swG^+;KHXX>tV~mk74`M=vqx^DK-(Rc1C4iTWgaES z+h{JaXtV5XgyQ2Gi(MD>`yT6X_!HRFv>aye{`Mmk6_vL4cO*nMW~%4r?W3atc*!WR z%FwWA!X3u@-@VTr`+bjRL1meCoSp`CDm4353LiZ<231s1PMLUAj6sfi?ET9uGEk3H z0Jo+^TW`}hL63W=H!R2=HZiyshreSPa8t-Lb>MxljU>-J92H(6q+g#x2073k;Y1G21v90j&Y#~kK=92 zHeh0^sb$Tvd#|8ZmdNmeMJIpxEyBrHs?)oQytcRc*tfxo)CdM5JLdQKEZbhov6){1&VDIwP)$GRdYMc{g!Enx}=yO<=-*`nJSOFMdQlFsZCWzv2)(Vl71TUN|Y>lXtBO6QbQ zkLyGxDi}r@qlc!a3CamlW7)L~_8JBlPG-X+!?j$K4f$$EMHl{r7=6oYXp$2P^B-@> zE==scc7mek3wxiY z>{pl?_a$ps00pb1zY>jpfm`KNw^!$ez%9?nvGJJlyu$iE*L1e}=iufoUczx=rJytY04kMoFcFMDmLyn6MDt>VvYEhE=glefOA zRapPk6XE30j(ifdobvVV&3n_<$se*`LnVJTvcBxtO#g=`i%Z=$+twrws5fGpB_5@J zFWjo*aofG1#7E7J{7ZjK=CZFW(o2(Ugx6DFa~21I)rh^&smOxyID@Ubg}`h;|9wHB zQjmQA%;tP3i5`ur52&wJo`EuC<*zb?Y(;0GI>vrS8KSqN45>t4BSfTcz*`QyH&fp~ z+wrGW8!1En61BK(DDp8O{r^PN?({UVq<8;2QG3k5m9pp*v@zn^p6*^5FMp&=2UH~t zG^xpX0z^XUX1P)H2X}fY*V5*)br!sq4N^v?tuIu+f;NoW6VqhYL6vyul@Ndp#zL-C zbMyaRyD86jDCx8q-m}ZgK;&Y|sFo|@NeIw9#zG=E8$RYkm9Bo^;P(pHD455|06nPW z`W>O2f#W6qC$6@P9C{T>!~cn^eZ-5F>CM^y#MM4(fjEM_`E0?%Km5nUHCxvnn*E|( zE_%Cqb@6`1WRMqKrGqEjE+L5?ABD!LdSjooB~=o%5hQ&Ykv0TLgfN_3QMNLT2me(m zf%?7U-&aoo17Hb60Kf&q3uu8(ZT|z99~Q16aQ@l>Zzq+GVWOIu{peRo-Gx}f z5_G?X4#U&??MOE>BHJo6z5CP*gBF&Y*B4hFH`KA^fi_`=V(0leS`_{j2`>!Bn#DzF zC6Lptn`Ef#I90$BgGOjKR+J|?Wog;?YNx*spxws7qrKi_0!>$>5rXc6pShB@+~7U+ z(z~w$k_=U#XBe~`3*1wG0UBZ9cVGbl+fwzT$?NLaTB?Any)&*16SV$1b)dhVtCAfy z+3xqv+ysyzYA4xkMJ_8zZ?$!hq1X7Lc@PG4RGszma3pL z8BZk#oe3lk4}w+l*7?N-ABhcyk=cHDOx9KOAmPHTH#6Y|Vs}37e)jAcjTn^kvX{?b zaTyK()If3|fINDPD{bUAQKxtZ;lqcW$Yy|tb={b)6|m{OO169VMv^0fT;TVp#R7mv zt78FWK-zyIjP=3>Y;!MZ>J{9N`1R`-P?>(=kjtI$J_Bj%#>Pf{Olc5E_h2+A!h!BD ziT(tpBt`B!>FP8l=#e*Dbbjo^#JNT28`oLz0Oug22^EYYixI1OVXrG5>N%&*9LRj| zGQk(SN=l6+*-+2iQ&_(TMYYn$hJ$KgE{Ko%7cmV@A-v8H!%~NRGY;0ykYQt9 zH6oc7qt)@zYAin#g%wQ3du7DT*I!V8>2Q9S$|7;tlLh8E{eWFW^NDGa#dha?BGb4TnX9+{$z2P@6FXL?2j{<#F%$JJA!Ca~@OF z{g%yjBJv*3mU(e!3cwQ{PxkjoIo!$Atddu{NI^W z7Y2AXwmlejVF0R$m+3xaqgBN_Fjf5;!IT05>VC~g;yz-|Q!N3)iS)d;q|mh204RZC zy2>0)P4Bvk8ID%uR3@ivz1>s)E{{yRl`(G?x1|6w;a zR3+!;zJ2Olys)hAEl(;r2t=22HewRWkpH zOYOgewn0d_=C)YF$u8v{oerhfJ@KYt)~!!zO5YsvmV<%{NHU~kYfj0Rax!O@i7c6m z`!!Q$NJ%kjHI!EqYd1p%gMh2}%_F&%HE#1uAh=(x#oePo?xA8}UUj57$ zP2E7#ot}zlG?)PrMqyY|hJ=wM#Da8#q1&i~3!;a`%^2V|9v_3I52m!|KQXB;h#A3* z6Ww3M4pWS!#!Oj!{qrhj+r?*VbBq#{cv2^J?)U!BOsWkE=W#FpADC1ZE`MWLD7#;WrBKFOb9W0d6KJ=g2BNbLJ?Hk z+SB^Qd-Zmz4Gu=uTkwSB0o;7kN;z;D^13H}JDzyv&xDpVAME4v%D{Gd1x-{+$DmSL zZ)X#!T8bgB1I;Yb{0ebsK7f+Wp1WaE%a#X0!PQ#{Gl$UnPduNiD^g1(na(5z?SRd( zoeAzjG2-!^Xa`NdanRuLTg=jyFAXttPTkrEk^>A^OFol79_?v``qnZnrG3*K&&i@f zG`~E3Ux+-R{{xb3^z_~!EZt`@#K$)k#HfHw(Loexez{R*h;e;qV->gec2LubBM8z1 z(gX+PPu~jb%)WgD?Xbbw|HPvr;R!Z#b`c+<3I$SEM`j!Xa3)LR3%!pgDx!p6KeA3U#{KKPvApP zBZ0I#SpQH-ep=c?3E_0{SA>G-FG__nU%MPxTPL-cCD9||mK@nEw8cSyw;$-st4OIj z?HmgOlts}1yNUX;|0|E0g!~-yeMYuwvGj^^oR}2`dRb79jXqO!`ttedduarfxcZg< zz@sivqo>cDgsO5Yc@N6HH$2!us;j*inWK}!%L%d*1>|B_R!Ig$dj){f-Y z=_*Kmna>om=fnvyLqDbLyESa0&=dSC%!3m<O|ATy7X>x-FI2ZZV3{;h~A{C|Y{WBPFx>uMEZOBgcU_IIffsD4L#_ zc-~{V$JzJgOa7h1JNSRtUEN4Ebru{fs_^VSFL;%gxXt=4VdMI&c2#m>d6ELMAJ7PSi;X&EH`i7@hZnnjt>Z z#_fFWhsF5{m$SQs^U0j^~c zqy?@HTT(;RKhz+XH=(p3z@ZhmjHk?X9~fy-a#WNW5xVl}hj)M&sTEYHQlR6vjq*O| z1DG%FNa*|`|Lg2RZImK}O9YZQ6}5j!S_lU;A2npv9=qQj)i-G@{sZZ8Fs1az8}9t8 z6;7^2NYVnIv>x4|CqU9N{rCGDK@c(-EiVx7b^r?OFe}ltb<+%WP|tKWmx1I5l9C8d zdJD^?eoE+pD31>uK$4b6NYXNQW#NdKte}AK#Lh? z-ErB;`sAl}fOv1OA--lJFoM3`65$+<1s$F7kq{mOXH|y+JB>+qaXfrSO03s~kgAFw zm7uMK{tV^CkItL7Ebm?T@mRi&%}Bh6AB7TJ8bEP^wM|BcYkm-c_OU z3=DB_XNYqDD?yhEx1$yZR`k~QgXda*Jf*LtDm3^cwr_PM&(=HF0hFo!y&ptn<6`By zV_z!;g3ilt&%W|*>WTaL_-t@+u^5U4w%Xoz%syovT-4~>(a;ea`NsJi{Tq!yL)U&UZCbf3DXcziv-;Exd1f(g}FoT&0)&>*E?GyWwV>5z_`r^f{-shT@8+|lt3 z!#_e+PVC`3X37w+@$57@;dAn&dNV>*bZ$YD9;JO>2s;m`-M4=RgbxW0UMXF6LW#4n z(=GP(1^DlvNRHe|zA=#B<&W05MOjYn99;N!CCf1Hj-?Gk+P9Yw*tS5TOg@)84yXKx zK<4foTo^vGbHzPJbJ{FPDrvT>ZH91g0clpE0t~o?!^U<#PJr?(Iq+y!hogY_zkmzu z@mqi~==veBxDY>*q5{>?Tt|IX(h2oaWcsF;yY}DN`I!8}76@KX%fe|b78%#YdJ$LG zuNpMe5Br{SBSUjJ2nQG7nAblC7j()7igp@78WHn6!Wf2K(?-V@&a&>dsQr4Y=VxMi z=YzUaJ2xgp(P;C_6qV#_pNgcfBgz*WTqLfhqoyAuf7*SR) z7yWR!f_;8j4wjshBohSfnp+BBF}71JEiKfvv`)kcIPaRFmHqBK;*mP?T5YX(K_UZW zIdI-Aa6WcY$l%GQHRY09=e^h{_$dISGoWQCEo#-{fHStV^-bZT-p`)RHds9V{#|LQ zbpMa(;oFtrB1^@W;ir|PR=q`6g+@35j2%OHF`S<@(8e}5Hx~(Bn{q(RnMlvFPCDDa z?`!zr$>la_kA6~a*|ZkQa`Ze7cUgaB3q&^VvQq=&!clU9xxf(zh*SUli|i-s!g`b3 z2>NPEo==7as0j~jWF&p{#BZRu)x4Zo(m1B6O0z1q>2p@l7r_NUqxbex9rlovvx>@CoBiJ z5#|dQq(G@O)m_*D$9)%91_LLi3i||wBc;2G?NdObm37jlOd0rTV%fv_^Rs&uwL$+7 z%gf6P=Q`t^dml=JQl8y2VAJr5)8vo%lh#Go^DT%fMn>l^(Q%&ZF0g7{>@XythtAH< zy8bC1apDM5W)LD;?Q`3Wl@E{4FMywEv>Brz(4fBxroRsj_F9(V;bwBfmAV* zPU`}dXN0rZFJ6=e`df2zZ87xC8)liVa<{^{xjD7$yOLmZ-M^p4jD2~1&ez|ch$Gp> zZ}ROp@PM)s-W1KXj9wYQ3caCkx;OQ+SQS`a-+%xOI2;Y&w1$}y~FP)3j z1m4B&t%zHDbE@*W+S$Qcdax76Je$5=9#~#!(4c^>iNQpALFnPbhXHV!w>SI2pp>+- z^6Nq1O`Oq%hmRcjHQJUId=JbJF1!hYbo}YiDj&XiwRpZ!m>&K9Ek>k!7TUlOZyNc4 zCldZsx$RjCXOjKGVVj$pQxqAcQxu|4*_1D8q}}hZ+BVAXysrcFCE5Tu1)%^!3J@u& z-oKwA2&$X|$2i~6H=nz_)m@O&c^~p}#aa6^XU@>^8a?mIGf(*R=>{lAB57I& z0Yb)q)%c+kE{U-|Hs@J*c~!>7#)66_)dm$Z-F7SXo?X*%9k*j68;<1={~#;$$WPPS>#R>)yt zRM`sDghA-kMy6J_INaJ^I$eQ>v+^Jm(@r*7;0Gbg6_EPPHraw`XU{=8vtOTHShOU* zfNy!HD7M))*6r9$YL>4b|8iFkQW>2V^G^q+_RLYJxjJU9{1V zR%^H=(towmy-zn&V{@jODkw2YF1*epm*wnPaj~tHg!W8b)4SqLs`(b`h;m%}9jpjj zEh;km>8M3#PST&EK}y8Aq4xk3_Ia{JHGFPzx`=8VH8|?N_@_q~aHI_e5*iYcNT^to z1$|}2+R_xhGuM=jgTsIG&u%~%D2t%13Im_>+Y9bh3R=p{?0dB!_eouGwK28pCS{f> z{AuUM;5Nx4BNk2t&2&i2fy`&&;v%d#_PNjdpAUE?qzayx5Bq`mRisvIj1@C1^YZZU zAm$j$!80P>w&e1IPN}6y?6|v!2h-+;hZm>_e|6k?!+jm}HmYFEEGI;WT$Q8N#Y42K z>+5Wyq6V>ETg3<<9t?gq2TnBdvi-2Jn6nZuu+og%D?Ug*2XY%jr;~4V@-0|kk%gWA zgw)&}FfBbQDJ5kA6&#(IXIbPWn=A$q*U?_L>CijJQAvjm;(+}!3kkj1G$5_qIBb)z zGc+-Qf3#~aD+`MZI15~uqs0zJjYM<6WyIC^9kZ+rpjT+RdI*bY2QZDW&aWX0G}8fF3p`|dMDvRKcxw6*1F^oj|&AoO+Rb9HR4zg}FVrlwBx zVQ{^v0m{;*a7_X0pIRS2d{Af@Xs=}Q_4W0f_xlrWnIJAMzEHUy1~5O@%;;REq$u zTJWBQNS=G%Fo!mH7sW3xA2=xo>GnP3`D+6{jBNx%v4bagZ$Nlef?0{K{yvIM!i7|- zP#-;-fXI2Iu7oG$d8|7%yuGZ7*T}SUJuyoQ?_@xt2~NGDxV$`mq^?ZYE6zD@zA`gV z_w{S@`#aSRzrP%IobJ_k9B*p|^itQ-8eQ=CQ&9LQyYqgIPUaQ&mG`JQ09GTrR*V%u z^nf+dDYTCETpPOxI^u}8?eoSaCafYN`r6vsi0Yrc#4p$0k?7r z+xlbnlbyNJ2qPeAKw^=a+FCqNMo_-F^m%QUdsEW0g6qMD<7hfNwBJyeot+*3-A~Vd z#ms?_16Etvbv!LaElHL}Mr_+X0-_IEZags^JQl_=4t)T1i2c!#wHycfxumx!8AUTb z`=2~!7{V$80>X6FlmK#a@;uK?*9zr<=5~T10Yar2G+zKWBRU`8RF>{NgC_xfHZj@%zS5e9GD9B-D<_^7xt6Fh!G0KwQ zo5mKdT5Dq4g&X-+-5L)bJU}tt-QE4St&kC%Jv6SP?s4k2g2}w@eDFvmJUF;|>^SsM zE4Ln&+YX3>VJL2|)Qa)DE|{rj>1o3%LndOB);IYR-U&je?*jpqbHf{+!Al(^24h{< zAT!jwo!jYq@y9WCt+=htbxT+!y32Nn=ujg4WxE^p!{3yZl$6pA5=!JrHu@~Lwo*4B z3oW|hQ?2ZNp!C^+V-{675`+Sjr-b6#+S*jS{1gjWa4k*K%0Du+`4-1orQ!7_Tnw)v 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 I{m;k$4~XU|KL7v# literal 16227 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 F{|8aDNEHA8 diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series/test_should_return_table_both.png b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series/test_should_return_table_both.png new file mode 100644 index 0000000000000000000000000000000000000000..8c10979a0599b3d4135020585623129939840951 GIT binary patch literal 12395 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 diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series_scatter/test_should_plot_feature_both_set.png b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series_scatter/test_should_plot_feature_both_set.png new file mode 100644 index 0000000000000000000000000000000000000000..9d6035eafce22e316e5021c1a27433bbbae6af3c GIT binary patch literal 12902 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�PrT zxvif~+^7nkTypM8Q(^7NeY&4Oxo zM&ezTzneqnsA}6x92?^pdD*&WdmWnt5_IMZYiw6atOpG&uC*sihaaqD@{!wIsbd zKcE54s8ZLpxirBC--)0l7aSd(1%zkzt29Hm7r{RJPWj8`wZ2C_(6isa3#$a&2kd?W z+$|~6x=IW1@sqiGOD=_YcvI4VRk=JkP2F3+mRCUwW`KqgvYYT-yd)6$(%MID1N`o; z(g$X6MCSzswNUGRKLu?nwZ1cW&re=5cx+q)Tc8`IhSpe7`3OE4RM3Grzj5Fuf2l4P zs{b5jyS_qPqQ(L^-#c^apJGJZ_SV>!Yvj66It7*)%NOd$S4vwVFS9c-U5^%a>R}4J z8jm{P=+_NeIpsD z=r=YucYS8%jVgk@?ter)w^0@CZ)RBjEdC#JF7XK zTF_Tcb6A;H!cBio=luYgXL#XWDQ#tCo0>>{%8$ zl|B8?U@e5UDWd{4z2m~5d9>58OHaC5#=`+JGO|pN<2qT|h51%hzrMp0{SY;o;HV9t zm#?O*e1}fNwJV>aDMIi;GTH>v2G>B{#pRc|%Y3dV;YkLDocQ>&Xp=+8btU!OtvByH zca~$pe8KeP#-S#Q)livC@N5?;&S2KuNGr^7t}iY%^*pu+YAp^zrx*5}f*O4g*c4+v zaV_~AoCa08Q?Z^^3srb4?ALUHefv{oUZ3mFGnTeFaEJuOdAHC z{Ap)r2c%*GzXf)3&t>ex1QnBi7iPrA$3I+jw;C+T13PVU)m0Je9~+jL$pZas*NxFdi1NJ&efi)^cbOouFMU=39Q!YOC-fky+}+?gVK{i!Z?}Fu&0gFXf*J;iLnb z%?snyG1Us2#D`yE(<#J+s^#d5;J%r~7G{@zr@;XjEX})tGnOUfFuT!noK*mJmjQs* z<3mc7iC?V7`uY1847;!E;UN9<(1C*txXT_mDf+of*VS!p^Bn5woHW6GD=dWkm&JoL zybmzbTejMxu@&rz`^@)^3sGFt)RmdS~LroXNH`xYOwT< z&Q5;g&xh!)*mz|;R;|b-0P8@}FRvapG=!EePZxPc5zkq-qNYX;^L*%2bC_%I?&-?rP ztE?{!g}#3M39q~>3EeqnI=sH-l6y7`#?S}W7n^$S;<2kW`zVQ4+|!KcygKr(w?X#- z)BipVwuS-|whAuj0#qiQv#N0r;WQTwy>`|;cQp!3TRMPc&kgi~M+Z(;RHt<}cm)r4 zPeX!&`6biQmuKwICbFIiXZV4Z`>tAr$ao`rPDs;a$9yq18_;2@{?Kh^FmHZyNjvY(6YE_?vF$`4&uI`+*P?h< zws*2H`Z*fJ#Kh@3#n~twK&@vuqTnGb%0AqaI?tD2M{9+t&5($@xVR+M0VfV=G3|s{ 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 CKIs7f literal 0 HcmV?d00001 diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series_scatter/test_should_plot_feature_only_x.png b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series_scatter/test_should_plot_feature_only_x.png new file mode 100644 index 0000000000000000000000000000000000000000..f44732c27ee30c7ad3909d7ce9b97526e53592e4 GIT binary patch literal 11657 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 literal 9483 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 Q2z;H;GuBNzYWv%N04@g(3;+NC diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py index ee3ae4fbd..d352769ff 100644 --- a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py +++ b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py @@ -15,11 +15,24 @@ def test_should_return_table(snapshot_png: SnapshotAssertion) -> None: time_name="time", feature_names=None, ) - plot = table.plot_time_series_line_plot() + plot = table.plot_time_series_lineplot() assert plot == snapshot_png +def test_should_return_table_both(snapshot_png: SnapshotAssertion) -> None: + table = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "target": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + plot = table.plot_time_series_lineplot(x_column_name="feature_1", y_column_name="target") + assert plot == snapshot_png -def test_should_plot_feature(snapshot_png: SnapshotAssertion) -> None: +def test_should_plot_feature_y(snapshot_png: SnapshotAssertion) -> None: table = TimeSeries( { "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], @@ -30,7 +43,35 @@ def test_should_plot_feature(snapshot_png: SnapshotAssertion) -> None: time_name="time", feature_names=None, ) - plot = table.plot_time_series_line_plot("feature_1") + plot = table.plot_time_series_lineplot(y_column_name="feature_1") + assert plot == snapshot_png + +def test_should_plot_feature_x(snapshot_png: SnapshotAssertion) -> None: + table = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": [10, 9, 8, 7, 6, 5, 4, 3, 2, 1], + "target": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + plot = table.plot_time_series_lineplot(x_column_name="feature_1") + assert plot == snapshot_png + +def test_should_plot_feature(snapshot_png: SnapshotAssertion) -> None: + table = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": [2, 4, 6, 8, 10, 12, 14, 16, 18, 20], + "target": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + plot = table.plot_time_series_lineplot(x_column_name="feature_1") assert plot == snapshot_png @@ -54,7 +95,7 @@ def test_should_raise_if_column_contains_non_numerical_values() -> None: r" non-numerical columns." ), ): - table.plot_time_series_line_plot() + table.plot_time_series_lineplot() @pytest.mark.parametrize( @@ -106,4 +147,55 @@ def test_should_raise_error_optional_parameter( error, match=error_msg, ): - time_series.plot_time_series_line_plot(feature_name=name) + time_series.plot_time_series_lineplot(x_column_name=name) + +@pytest.mark.parametrize( + ("time_series", "name", "error", "error_msg"), + [ + ( + TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"], + "target": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"], + }, + target_name="target", + time_name="time", + feature_names=None, + ), + "feature_1", + NonNumericColumnError, + r"Tried to do a numerical operation on one or multiple non-numerical columns: \nThe time series plotted" + r" column" + r" contains" + r" non-numerical columns.", + ), + ( + TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"], + "target": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"], + }, + target_name="target", + time_name="time", + feature_names=None, + ), + "feature_3", + UnknownColumnNameError, + r"Could not find column\(s\) 'feature_3'.", + ), + ], + ids=["feature_not_numerical", "feature_does_not_exist"], +) +def test_should_raise_error_optional_parameter_y( + time_series: TimeSeries, + name: str, + error: type[Exception], + error_msg: str, +) -> None: + with pytest.raises( + error, + match=error_msg, + ): + time_series.plot_time_series_lineplot(y_column_name=name) diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py index 3bdde2d24..979b6c40e 100644 --- a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py +++ b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py @@ -15,7 +15,7 @@ def test_should_return_table(snapshot_png: SnapshotAssertion) -> None: time_name="time", feature_names=None, ) - plot = table.plot_time_series_scatter_plot() + plot = table.plot_time_series_scatterplot() assert plot == snapshot_png def test_should_plot_feature(snapshot_png: SnapshotAssertion) -> None: table = TimeSeries( @@ -28,8 +28,68 @@ def test_should_plot_feature(snapshot_png: SnapshotAssertion) -> None: time_name="time", feature_names=None, ) - plot = table.plot_time_series_scatter_plot("feature_1") + plot = table.plot_time_series_scatterplot(y_column_name="feature_1") assert plot == snapshot_png +def test_should_plot_feature_only_x(snapshot_png: SnapshotAssertion) -> None: + table = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": [10, 9, 8, 7, 6, 5, 4, 3, 2, 1], + "target": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + plot = table.plot_time_series_scatterplot(x_column_name="feature_1") + assert plot == snapshot_png +def test_should_plot_feature_only_y_optional(snapshot_png: SnapshotAssertion) -> None: + table = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": [10, 9, 8, 7, 6, 5, 4, 3, 2, 1], + "target": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + plot = table.plot_time_series_scatterplot(y_column_name="feature_1") + assert plot == snapshot_png +def test_should_plot_feature_both_set(snapshot_png: SnapshotAssertion) -> None: + table = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": [1, 2, 1, 2, 1, 2, 1, 2, 1, 1], + "target": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + plot = table.plot_time_series_scatterplot(x_column_name="feature_1",y_column_name="target") + assert plot == snapshot_png + +def test_should_raise_if_column_contains_non_numerical_values() -> None: + table = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"], + "target": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + with pytest.raises( + NonNumericColumnError, + match=( + r"Tried to do a numerical operation on one or multiple non-numerical columns: \nThe time series plotted column" + r" contains" + r" non-numerical columns." + ), + ): + table.plot_time_series_scatterplot(y_column_name="feature_1") def test_should_raise_if_column_contains_non_numerical_values() -> None: table = TimeSeries( @@ -50,7 +110,7 @@ def test_should_raise_if_column_contains_non_numerical_values() -> None: r" non-numerical columns." ), ): - table.plot_time_series_scatter_plot() + table.plot_time_series_scatterplot() @pytest.mark.parametrize( ("time_series", "name", "error", "error_msg"), @@ -101,4 +161,56 @@ def test_should_raise_error_optional_parameter( error, match=error_msg, ): - time_series.plot_time_series_scatter_plot(feature_name=name) + time_series.plot_time_series_scatterplot(x_column_name=name) + + +@pytest.mark.parametrize( + ("time_series", "name", "error", "error_msg"), + [ + ( + TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"], + "target": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"], + }, + target_name="target", + time_name="time", + feature_names=None, + ), + "feature_1", + NonNumericColumnError, + r"Tried to do a numerical operation on one or multiple non-numerical columns: \nThe time series plotted" + r" column" + r" contains" + r" non-numerical columns.", + ), + ( + TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"], + "target": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"], + }, + target_name="target", + time_name="time", + feature_names=None, + ), + "feature_3", + UnknownColumnNameError, + r"Could not find column\(s\) 'feature_3'.", + ), + ], + ids=["feature_not_numerical", "feature_does_not_exist"], +) +def test_should_raise_error_optional_parameter_y( + time_series: TimeSeries, + name: str, + error: type[Exception], + error_msg: str, +) -> None: + with pytest.raises( + error, + match=error_msg, + ): + time_series.plot_time_series_scatterplot(y_column_name=name) From ef1c11cfd9ac5ac7127cb1a5e05a535ed7438e0d Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Wed, 28 Feb 2024 00:02:07 +0100 Subject: [PATCH 11/24] linter fixes --- .../data/tabular/containers/_time_series.py | 15 ++++--- .../_time_series/test_plot_time_series.py | 44 +++++++++++++++++++ .../test_plot_time_series_scatter.py | 4 +- 3 files changed, 56 insertions(+), 7 deletions(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index fc2300f7e..c01e41ccc 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -752,8 +752,8 @@ def replace_column(self, old_column_name: str, new_columns: list[Column]) -> Tim self.features.column_names if old_column_name not in self.features.column_names else self.features.column_names[: self.features.column_names.index(old_column_name)] - + [col.name for col in new_columns] - + self.features.column_names[self.features.column_names.index(old_column_name) + 1:] + + [col.name for col in new_columns] + + self.features.column_names[self.features.column_names.index(old_column_name) + 1 :] ), ), time_name=self.time.name, @@ -910,6 +910,7 @@ def plot_lagplot(self, lag: int) -> Image: def plot_time_series_lineplot(self, y_column_name: str | None = None, x_column_name: str | None = None) -> Image: + """ Plot the time series target or the given column(s) as line plot. @@ -982,10 +983,14 @@ def plot_time_series_lineplot(self, y_column_name: str | None = None, fig.savefig(buffer, format="png") plt.close() # Prevents the figure from being displayed directly buffer.seek(0) - self._data.reset_index(inplace=True) + self._data = self._data.reset_index() return Image.from_bytes(buffer.read()) - def plot_time_series_scatterplot(self, y_column_name: str | None = None, x_column_name: str | None = None) -> Image: + def plot_time_series_scatterplot( + self, + x_column_name: str | None = None, + y_column_name:str | None = None, + ) -> Image: """ Plot the time series target or the given column(s) as scatter plot. @@ -1058,5 +1063,5 @@ def plot_time_series_scatterplot(self, y_column_name: str | None = None, x_colum fig.savefig(buffer, format="png") plt.close() # Prevents the figure from being displayed directly buffer.seek(0) - self._data.reset_index(inplace=True) + self._data = self._data.reset_index() return Image.from_bytes(buffer.read()) diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py index d352769ff..c32fb86f8 100644 --- a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py +++ b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py @@ -18,6 +18,50 @@ def test_should_return_table(snapshot_png: SnapshotAssertion) -> None: plot = table.plot_time_series_lineplot() assert plot == snapshot_png +def test_should_raise_if_column_contains_non_numerical_values_x() -> None: + table = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"], + "target": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + with pytest.raises( + NonNumericColumnError, + match=( + r"Tried to do a numerical operation on one or multiple non-numerical columns: \nThe time series plotted column" + r" contains" + r" non-numerical columns." + ), + ): + table.plot_time_series_lineplot(y_column_name="feature_1") + + +def test_should_raise_if_column_contains_non_numerical_values_x() -> None: + table = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "target": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + with pytest.raises( + NonNumericColumnError, + match=( + r"Tried to do a numerical operation on one or multiple non-numerical columns: \nThe time series plotted" + r" column" + r" contains" + r" non-numerical columns." + ), + ): + table.plot_time_series_lineplot(x_column_name="feature_1") + def test_should_return_table_both(snapshot_png: SnapshotAssertion) -> None: table = TimeSeries( { diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py index 68abe81c7..7b7ea024f 100644 --- a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py +++ b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py @@ -94,7 +94,7 @@ def test_should_raise_if_column_contains_non_numerical_values() -> None: table.plot_time_series_scatterplot(y_column_name="feature_1") -def test_should_raise_if_column_contains_non_numerical_values() -> None: +def test_should_raise_if_column_contains_non_numerical_values_x() -> None: table = TimeSeries( { "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], @@ -114,7 +114,7 @@ def test_should_raise_if_column_contains_non_numerical_values() -> None: r" non-numerical columns." ), ): - table.plot_time_series_scatterplot() + table.plot_time_series_scatterplot(x_column_name="feature_1") @pytest.mark.parametrize( From 177c52ea7f37386cbc9a8e5df0f7252ff16fe1c5 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Wed, 28 Feb 2024 00:06:00 +0100 Subject: [PATCH 12/24] linter fixes --- .../data/tabular/containers/_time_series.py | 2 ++ .../_time_series/test_plot_time_series.py | 26 ++++--------------- 2 files changed, 7 insertions(+), 21 deletions(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index c01e41ccc..63af0984d 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -914,6 +914,7 @@ def plot_time_series_lineplot(self, y_column_name: str | None = None, """ Plot the time series target or the given column(s) as line plot. + The function will take the target column as the default value for x_column_name and a time dummy column as the default value for y_column_name. @@ -994,6 +995,7 @@ def plot_time_series_scatterplot( """ Plot the time series target or the given column(s) as scatter plot. + The function will take the target column as the default value for x_column_name and a time dummy column as the default value for y_column_name. diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py index c32fb86f8..2caabef93 100644 --- a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py +++ b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py @@ -18,27 +18,6 @@ def test_should_return_table(snapshot_png: SnapshotAssertion) -> None: plot = table.plot_time_series_lineplot() assert plot == snapshot_png -def test_should_raise_if_column_contains_non_numerical_values_x() -> None: - table = TimeSeries( - { - "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - "feature_1": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"], - "target": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - }, - target_name="target", - time_name="time", - feature_names=None, - ) - with pytest.raises( - NonNumericColumnError, - match=( - r"Tried to do a numerical operation on one or multiple non-numerical columns: \nThe time series plotted column" - r" contains" - r" non-numerical columns." - ), - ): - table.plot_time_series_lineplot(y_column_name="feature_1") - def test_should_raise_if_column_contains_non_numerical_values_x() -> None: table = TimeSeries( @@ -62,6 +41,7 @@ def test_should_raise_if_column_contains_non_numerical_values_x() -> None: ): table.plot_time_series_lineplot(x_column_name="feature_1") + def test_should_return_table_both(snapshot_png: SnapshotAssertion) -> None: table = TimeSeries( { @@ -76,6 +56,7 @@ def test_should_return_table_both(snapshot_png: SnapshotAssertion) -> None: plot = table.plot_time_series_lineplot(x_column_name="feature_1", y_column_name="target") assert plot == snapshot_png + def test_should_plot_feature_y(snapshot_png: SnapshotAssertion) -> None: table = TimeSeries( { @@ -90,6 +71,7 @@ def test_should_plot_feature_y(snapshot_png: SnapshotAssertion) -> None: plot = table.plot_time_series_lineplot(y_column_name="feature_1") assert plot == snapshot_png + def test_should_plot_feature_x(snapshot_png: SnapshotAssertion) -> None: table = TimeSeries( { @@ -104,6 +86,7 @@ def test_should_plot_feature_x(snapshot_png: SnapshotAssertion) -> None: plot = table.plot_time_series_lineplot(x_column_name="feature_1") assert plot == snapshot_png + def test_should_plot_feature(snapshot_png: SnapshotAssertion) -> None: table = TimeSeries( { @@ -193,6 +176,7 @@ def test_should_raise_error_optional_parameter( ): time_series.plot_time_series_lineplot(x_column_name=name) + @pytest.mark.parametrize( ("time_series", "name", "error", "error_msg"), [ From 5e36a78054e2efb68b7e7b2a6aba0735317d4c34 Mon Sep 17 00:00:00 2001 From: megalinter-bot <129584137+megalinter-bot@users.noreply.github.com> Date: Tue, 27 Feb 2024 23:07:37 +0000 Subject: [PATCH 13/24] style: apply automated linter fixes --- src/safeds/data/tabular/containers/_time_series.py | 9 +++------ .../_time_series/test_plot_time_series_scatter.py | 12 ++++++++++-- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 63af0984d..1a66a7099 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -801,7 +801,7 @@ def slice_rows( def sort_columns( self, comparator: Callable[[Column, Column], int] = lambda col1, col2: (col1.name > col2.name) - - (col1.name < col2.name), + - (col1.name < col2.name), ) -> TimeSeries: """ Sort the columns of a `TimeSeries` with the given comparator and return a new `TimeSeries`. @@ -908,9 +908,7 @@ def plot_lagplot(self, lag: int) -> Image: buffer.seek(0) return Image.from_bytes(buffer.read()) - def plot_time_series_lineplot(self, y_column_name: str | None = None, - x_column_name: str | None = None) -> Image: - + def plot_time_series_lineplot(self, y_column_name: str | None = None, x_column_name: str | None = None) -> Image: """ Plot the time series target or the given column(s) as line plot. @@ -990,9 +988,8 @@ def plot_time_series_lineplot(self, y_column_name: str | None = None, def plot_time_series_scatterplot( self, x_column_name: str | None = None, - y_column_name:str | None = None, + y_column_name: str | None = None, ) -> Image: - """ Plot the time series target or the given column(s) as scatter plot. diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py index 7b7ea024f..1d45e8a69 100644 --- a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py +++ b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py @@ -32,6 +32,8 @@ def test_should_plot_feature(snapshot_png: SnapshotAssertion) -> None: ) plot = table.plot_time_series_scatterplot(y_column_name="feature_1") assert plot == snapshot_png + + def test_should_plot_feature_only_x(snapshot_png: SnapshotAssertion) -> None: table = TimeSeries( { @@ -45,6 +47,8 @@ def test_should_plot_feature_only_x(snapshot_png: SnapshotAssertion) -> None: ) plot = table.plot_time_series_scatterplot(x_column_name="feature_1") assert plot == snapshot_png + + def test_should_plot_feature_only_y_optional(snapshot_png: SnapshotAssertion) -> None: table = TimeSeries( { @@ -58,6 +62,8 @@ def test_should_plot_feature_only_y_optional(snapshot_png: SnapshotAssertion) -> ) plot = table.plot_time_series_scatterplot(y_column_name="feature_1") assert plot == snapshot_png + + def test_should_plot_feature_both_set(snapshot_png: SnapshotAssertion) -> None: table = TimeSeries( { @@ -69,9 +75,10 @@ def test_should_plot_feature_both_set(snapshot_png: SnapshotAssertion) -> None: time_name="time", feature_names=None, ) - plot = table.plot_time_series_scatterplot(x_column_name="feature_1",y_column_name="target") + plot = table.plot_time_series_scatterplot(x_column_name="feature_1", y_column_name="target") assert plot == snapshot_png + def test_should_raise_if_column_contains_non_numerical_values() -> None: table = TimeSeries( { @@ -86,7 +93,8 @@ def test_should_raise_if_column_contains_non_numerical_values() -> None: with pytest.raises( NonNumericColumnError, match=( - r"Tried to do a numerical operation on one or multiple non-numerical columns: \nThe time series plotted column" + r"Tried to do a numerical operation on one or multiple non-numerical columns: \nThe time series plotted" + r" column" r" contains" r" non-numerical columns." ), From 7437360f1d8cfab4946211e35e2357de822424e8 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Wed, 28 Feb 2024 00:28:50 +0100 Subject: [PATCH 14/24] fixed UnknownError --- .../data/tabular/containers/_time_series.py | 32 +++++---------- .../_time_series/test_plot_time_series.py | 39 ++++++++++++++++++- .../test_plot_time_series_scatter.py | 38 ++++++++++++++++++ 3 files changed, 86 insertions(+), 23 deletions(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 63af0984d..fcf7dc587 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -948,20 +948,14 @@ def plot_time_series_lineplot(self, y_column_name: str | None = None, self._data.index.name = "index" if y_column_name is None: y_column_name = self.target.name + else: + if y_column_name not in self._data.columns: + raise UnknownColumnNameError([y_column_name]) if x_column_name is None: x_column_name = "index" else: - if not self.get_column(x_column_name).type.is_numeric(): - raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") - if not self.has_column(x_column_name) or not self.has_column(y_column_name): - similar_columns_x = self._get_similar_columns(x_column_name) - similar_columns_y = self._get_similar_columns(y_column_name) - raise UnknownColumnNameError( - ([x_column_name] if not self.has_column(x_column_name) else []) - + ([y_column_name] if not self.has_column(y_column_name) else []), - (similar_columns_x if not self.has_column(x_column_name) else []) - + (similar_columns_y if not self.has_column(y_column_name) else []), - ) + if x_column_name not in self._data.columns: + raise UnknownColumnNameError([x_column_name]) if not self.get_column(y_column_name).type.is_numeric(): raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") @@ -1029,20 +1023,14 @@ def plot_time_series_scatterplot( self._data.index.name = "index" if y_column_name is None: y_column_name = self.target.name + else: + if y_column_name not in self._data.columns: + raise UnknownColumnNameError([y_column_name]) if x_column_name is None: x_column_name = "index" else: - if not self.get_column(x_column_name).type.is_numeric(): - raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") - if not self.has_column(x_column_name) or not self.has_column(y_column_name): - similar_columns_x = self._get_similar_columns(x_column_name) - similar_columns_y = self._get_similar_columns(y_column_name) - raise UnknownColumnNameError( - ([x_column_name] if not self.has_column(x_column_name) else []) - + ([y_column_name] if not self.has_column(y_column_name) else []), - (similar_columns_x if not self.has_column(x_column_name) else []) - + (similar_columns_y if not self.has_column(y_column_name) else []), - ) + if x_column_name not in self._data.columns: + raise UnknownColumnNameError([x_column_name]) if not self.get_column(y_column_name).type.is_numeric(): raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py index 2caabef93..1b0d760a6 100644 --- a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py +++ b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py @@ -122,7 +122,7 @@ def test_should_raise_if_column_contains_non_numerical_values() -> None: r" non-numerical columns." ), ): - table.plot_time_series_lineplot() + table.plot_time_series_lineplot( x_column_name="target") @pytest.mark.parametrize( @@ -227,3 +227,40 @@ def test_should_raise_error_optional_parameter_y( match=error_msg, ): time_series.plot_time_series_lineplot(y_column_name=name) +def test_should_raise_if_column_does_not_exist_x() -> None: + table = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "target": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + with pytest.raises( + UnknownColumnNameError, + match=( + "Could not find column\(s\) '2'." + ), + ): + table.plot_time_series_lineplot( x_column_name="target", y_column_name="2") + +def test_should_raise_if_column_does_not_exist_y() -> None: + table = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "target": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + with pytest.raises( + UnknownColumnNameError, + match=( + "Could not find column\(s\) '2'." + ), + ): + table.plot_time_series_lineplot( x_column_name="2", y_column_name="target") diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py index 7b7ea024f..41bcbc78f 100644 --- a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py +++ b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py @@ -219,3 +219,41 @@ def test_should_raise_error_optional_parameter_y( match=error_msg, ): time_series.plot_time_series_scatterplot(y_column_name=name) + +def test_should_raise_if_column_does_not_exist_x() -> None: + table = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "target": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + with pytest.raises( + UnknownColumnNameError, + match=( + "Could not find column\(s\) '2'." + ), + ): + table.plot_time_series_scatterplot( x_column_name="target", y_column_name="2") + +def test_should_raise_if_column_does_not_exist_y() -> None: + table = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "target": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + with pytest.raises( + UnknownColumnNameError, + match=( + "Could not find column\(s\) '2'." + ), + ): + table.plot_time_series_scatterplot( x_column_name="2", y_column_name="target") From 3e08d061056a6f5a1c5118c5cd8941bbd75e60f7 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Wed, 28 Feb 2024 00:29:50 +0100 Subject: [PATCH 15/24] Revert "fixed UnknownError" This reverts commit 7437360f1d8cfab4946211e35e2357de822424e8. --- .../data/tabular/containers/_time_series.py | 32 ++++++++++----- .../_time_series/test_plot_time_series.py | 39 +------------------ .../test_plot_time_series_scatter.py | 38 ------------------ 3 files changed, 23 insertions(+), 86 deletions(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 5dd840963..1a66a7099 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -946,14 +946,20 @@ def plot_time_series_lineplot(self, y_column_name: str | None = None, x_column_n self._data.index.name = "index" if y_column_name is None: y_column_name = self.target.name - else: - if y_column_name not in self._data.columns: - raise UnknownColumnNameError([y_column_name]) if x_column_name is None: x_column_name = "index" else: - if x_column_name not in self._data.columns: - raise UnknownColumnNameError([x_column_name]) + if not self.get_column(x_column_name).type.is_numeric(): + raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") + if not self.has_column(x_column_name) or not self.has_column(y_column_name): + similar_columns_x = self._get_similar_columns(x_column_name) + similar_columns_y = self._get_similar_columns(y_column_name) + raise UnknownColumnNameError( + ([x_column_name] if not self.has_column(x_column_name) else []) + + ([y_column_name] if not self.has_column(y_column_name) else []), + (similar_columns_x if not self.has_column(x_column_name) else []) + + (similar_columns_y if not self.has_column(y_column_name) else []), + ) if not self.get_column(y_column_name).type.is_numeric(): raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") @@ -1020,14 +1026,20 @@ def plot_time_series_scatterplot( self._data.index.name = "index" if y_column_name is None: y_column_name = self.target.name - else: - if y_column_name not in self._data.columns: - raise UnknownColumnNameError([y_column_name]) if x_column_name is None: x_column_name = "index" else: - if x_column_name not in self._data.columns: - raise UnknownColumnNameError([x_column_name]) + if not self.get_column(x_column_name).type.is_numeric(): + raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") + if not self.has_column(x_column_name) or not self.has_column(y_column_name): + similar_columns_x = self._get_similar_columns(x_column_name) + similar_columns_y = self._get_similar_columns(y_column_name) + raise UnknownColumnNameError( + ([x_column_name] if not self.has_column(x_column_name) else []) + + ([y_column_name] if not self.has_column(y_column_name) else []), + (similar_columns_x if not self.has_column(x_column_name) else []) + + (similar_columns_y if not self.has_column(y_column_name) else []), + ) if not self.get_column(y_column_name).type.is_numeric(): raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py index 1b0d760a6..2caabef93 100644 --- a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py +++ b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py @@ -122,7 +122,7 @@ def test_should_raise_if_column_contains_non_numerical_values() -> None: r" non-numerical columns." ), ): - table.plot_time_series_lineplot( x_column_name="target") + table.plot_time_series_lineplot() @pytest.mark.parametrize( @@ -227,40 +227,3 @@ def test_should_raise_error_optional_parameter_y( match=error_msg, ): time_series.plot_time_series_lineplot(y_column_name=name) -def test_should_raise_if_column_does_not_exist_x() -> None: - table = TimeSeries( - { - "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - "feature_1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - "target": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - }, - target_name="target", - time_name="time", - feature_names=None, - ) - with pytest.raises( - UnknownColumnNameError, - match=( - "Could not find column\(s\) '2'." - ), - ): - table.plot_time_series_lineplot( x_column_name="target", y_column_name="2") - -def test_should_raise_if_column_does_not_exist_y() -> None: - table = TimeSeries( - { - "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - "feature_1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - "target": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - }, - target_name="target", - time_name="time", - feature_names=None, - ) - with pytest.raises( - UnknownColumnNameError, - match=( - "Could not find column\(s\) '2'." - ), - ): - table.plot_time_series_lineplot( x_column_name="2", y_column_name="target") diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py index 699f502a7..1d45e8a69 100644 --- a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py +++ b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py @@ -227,41 +227,3 @@ def test_should_raise_error_optional_parameter_y( match=error_msg, ): time_series.plot_time_series_scatterplot(y_column_name=name) - -def test_should_raise_if_column_does_not_exist_x() -> None: - table = TimeSeries( - { - "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - "feature_1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - "target": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - }, - target_name="target", - time_name="time", - feature_names=None, - ) - with pytest.raises( - UnknownColumnNameError, - match=( - "Could not find column\(s\) '2'." - ), - ): - table.plot_time_series_scatterplot( x_column_name="target", y_column_name="2") - -def test_should_raise_if_column_does_not_exist_y() -> None: - table = TimeSeries( - { - "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - "feature_1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - "target": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], - }, - target_name="target", - time_name="time", - feature_names=None, - ) - with pytest.raises( - UnknownColumnNameError, - match=( - "Could not find column\(s\) '2'." - ), - ): - table.plot_time_series_scatterplot( x_column_name="2", y_column_name="target") From 7778e5c2984333238cdd12b6e2d27327b9804f04 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Wed, 28 Feb 2024 00:30:55 +0100 Subject: [PATCH 16/24] Revert "Revert "fixed UnknownError"" This reverts commit 3e08d061056a6f5a1c5118c5cd8941bbd75e60f7. --- .../data/tabular/containers/_time_series.py | 32 +++++---------- .../_time_series/test_plot_time_series.py | 39 ++++++++++++++++++- .../test_plot_time_series_scatter.py | 38 ++++++++++++++++++ 3 files changed, 86 insertions(+), 23 deletions(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 1a66a7099..5dd840963 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -946,20 +946,14 @@ def plot_time_series_lineplot(self, y_column_name: str | None = None, x_column_n self._data.index.name = "index" if y_column_name is None: y_column_name = self.target.name + else: + if y_column_name not in self._data.columns: + raise UnknownColumnNameError([y_column_name]) if x_column_name is None: x_column_name = "index" else: - if not self.get_column(x_column_name).type.is_numeric(): - raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") - if not self.has_column(x_column_name) or not self.has_column(y_column_name): - similar_columns_x = self._get_similar_columns(x_column_name) - similar_columns_y = self._get_similar_columns(y_column_name) - raise UnknownColumnNameError( - ([x_column_name] if not self.has_column(x_column_name) else []) - + ([y_column_name] if not self.has_column(y_column_name) else []), - (similar_columns_x if not self.has_column(x_column_name) else []) - + (similar_columns_y if not self.has_column(y_column_name) else []), - ) + if x_column_name not in self._data.columns: + raise UnknownColumnNameError([x_column_name]) if not self.get_column(y_column_name).type.is_numeric(): raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") @@ -1026,20 +1020,14 @@ def plot_time_series_scatterplot( self._data.index.name = "index" if y_column_name is None: y_column_name = self.target.name + else: + if y_column_name not in self._data.columns: + raise UnknownColumnNameError([y_column_name]) if x_column_name is None: x_column_name = "index" else: - if not self.get_column(x_column_name).type.is_numeric(): - raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") - if not self.has_column(x_column_name) or not self.has_column(y_column_name): - similar_columns_x = self._get_similar_columns(x_column_name) - similar_columns_y = self._get_similar_columns(y_column_name) - raise UnknownColumnNameError( - ([x_column_name] if not self.has_column(x_column_name) else []) - + ([y_column_name] if not self.has_column(y_column_name) else []), - (similar_columns_x if not self.has_column(x_column_name) else []) - + (similar_columns_y if not self.has_column(y_column_name) else []), - ) + if x_column_name not in self._data.columns: + raise UnknownColumnNameError([x_column_name]) if not self.get_column(y_column_name).type.is_numeric(): raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py index 2caabef93..1b0d760a6 100644 --- a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py +++ b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py @@ -122,7 +122,7 @@ def test_should_raise_if_column_contains_non_numerical_values() -> None: r" non-numerical columns." ), ): - table.plot_time_series_lineplot() + table.plot_time_series_lineplot( x_column_name="target") @pytest.mark.parametrize( @@ -227,3 +227,40 @@ def test_should_raise_error_optional_parameter_y( match=error_msg, ): time_series.plot_time_series_lineplot(y_column_name=name) +def test_should_raise_if_column_does_not_exist_x() -> None: + table = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "target": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + with pytest.raises( + UnknownColumnNameError, + match=( + "Could not find column\(s\) '2'." + ), + ): + table.plot_time_series_lineplot( x_column_name="target", y_column_name="2") + +def test_should_raise_if_column_does_not_exist_y() -> None: + table = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "target": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + with pytest.raises( + UnknownColumnNameError, + match=( + "Could not find column\(s\) '2'." + ), + ): + table.plot_time_series_lineplot( x_column_name="2", y_column_name="target") diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py index 1d45e8a69..699f502a7 100644 --- a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py +++ b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py @@ -227,3 +227,41 @@ def test_should_raise_error_optional_parameter_y( match=error_msg, ): time_series.plot_time_series_scatterplot(y_column_name=name) + +def test_should_raise_if_column_does_not_exist_x() -> None: + table = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "target": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + with pytest.raises( + UnknownColumnNameError, + match=( + "Could not find column\(s\) '2'." + ), + ): + table.plot_time_series_scatterplot( x_column_name="target", y_column_name="2") + +def test_should_raise_if_column_does_not_exist_y() -> None: + table = TimeSeries( + { + "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "feature_1": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + "target": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + }, + target_name="target", + time_name="time", + feature_names=None, + ) + with pytest.raises( + UnknownColumnNameError, + match=( + "Could not find column\(s\) '2'." + ), + ): + table.plot_time_series_scatterplot( x_column_name="2", y_column_name="target") From ca724f2b77b87029b1a24e499412923c0429e958 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Wed, 28 Feb 2024 00:40:15 +0100 Subject: [PATCH 17/24] fixed --- .../data/tabular/containers/_time_series.py | 39 ++++++++++++------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 5dd840963..51f347aff 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -752,8 +752,8 @@ def replace_column(self, old_column_name: str, new_columns: list[Column]) -> Tim self.features.column_names if old_column_name not in self.features.column_names else self.features.column_names[: self.features.column_names.index(old_column_name)] - + [col.name for col in new_columns] - + self.features.column_names[self.features.column_names.index(old_column_name) + 1 :] + + [col.name for col in new_columns] + + self.features.column_names[self.features.column_names.index(old_column_name) + 1:] ), ), time_name=self.time.name, @@ -801,7 +801,7 @@ def slice_rows( def sort_columns( self, comparator: Callable[[Column, Column], int] = lambda col1, col2: (col1.name > col2.name) - - (col1.name < col2.name), + - (col1.name < col2.name), ) -> TimeSeries: """ Sort the columns of a `TimeSeries` with the given comparator and return a new `TimeSeries`. @@ -944,16 +944,23 @@ def plot_time_series_lineplot(self, y_column_name: str | None = None, x_column_n """ self._data.index.name = "index" + # falls mitgegebene column kein numerical column ist + if x_column_name is not None: + if not self.get_column(x_column_name).type.is_numeric(): + raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") + if y_column_name is None: y_column_name = self.target.name - else: - if y_column_name not in self._data.columns: - raise UnknownColumnNameError([y_column_name]) + + elif y_column_name not in self._data.columns: + raise UnknownColumnNameError([y_column_name]) + if x_column_name is None: x_column_name = "index" - else: - if x_column_name not in self._data.columns: - raise UnknownColumnNameError([x_column_name]) + + elif x_column_name not in self._data.columns: + raise UnknownColumnNameError([x_column_name]) + if not self.get_column(y_column_name).type.is_numeric(): raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") @@ -1018,16 +1025,18 @@ def plot_time_series_scatterplot( """ self._data.index.name = "index" + if x_column_name is not None: + if not self.get_column(x_column_name).type.is_numeric(): + raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") if y_column_name is None: y_column_name = self.target.name - else: - if y_column_name not in self._data.columns: - raise UnknownColumnNameError([y_column_name]) + elif y_column_name not in self._data.columns: + raise UnknownColumnNameError([y_column_name]) if x_column_name is None: x_column_name = "index" - else: - if x_column_name not in self._data.columns: - raise UnknownColumnNameError([x_column_name]) + + elif x_column_name not in self._data.columns: + raise UnknownColumnNameError([x_column_name]) if not self.get_column(y_column_name).type.is_numeric(): raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") From 17107341f87aee727ec5c457ec27304f0e6eb968 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Wed, 28 Feb 2024 00:45:10 +0100 Subject: [PATCH 18/24] fixed --- src/safeds/data/tabular/containers/_time_series.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 51f347aff..5f200f05d 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -945,9 +945,8 @@ def plot_time_series_lineplot(self, y_column_name: str | None = None, x_column_n """ self._data.index.name = "index" # falls mitgegebene column kein numerical column ist - if x_column_name is not None: - if not self.get_column(x_column_name).type.is_numeric(): - raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") + if x_column_name is not None and not self.get_column(x_column_name).type.is_numeric(): + raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") if y_column_name is None: y_column_name = self.target.name @@ -1025,9 +1024,9 @@ def plot_time_series_scatterplot( """ self._data.index.name = "index" - if x_column_name is not None: - if not self.get_column(x_column_name).type.is_numeric(): - raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") + if x_column_name is not None and not self.get_column(x_column_name).type.is_numeric(): + raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") + if y_column_name is None: y_column_name = self.target.name elif y_column_name not in self._data.columns: From 6a7327308734bd16753f7d02ce07451af2ff8275 Mon Sep 17 00:00:00 2001 From: megalinter-bot <129584137+megalinter-bot@users.noreply.github.com> Date: Tue, 27 Feb 2024 23:46:45 +0000 Subject: [PATCH 19/24] style: apply automated linter fixes --- .../data/tabular/containers/_time_series.py | 6 +++--- .../_time_series/test_plot_time_series.py | 17 ++++++++--------- .../test_plot_time_series_scatter.py | 14 ++++++-------- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 5f200f05d..bedca4e18 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -752,8 +752,8 @@ def replace_column(self, old_column_name: str, new_columns: list[Column]) -> Tim self.features.column_names if old_column_name not in self.features.column_names else self.features.column_names[: self.features.column_names.index(old_column_name)] - + [col.name for col in new_columns] - + self.features.column_names[self.features.column_names.index(old_column_name) + 1:] + + [col.name for col in new_columns] + + self.features.column_names[self.features.column_names.index(old_column_name) + 1 :] ), ), time_name=self.time.name, @@ -801,7 +801,7 @@ def slice_rows( def sort_columns( self, comparator: Callable[[Column, Column], int] = lambda col1, col2: (col1.name > col2.name) - - (col1.name < col2.name), + - (col1.name < col2.name), ) -> TimeSeries: """ Sort the columns of a `TimeSeries` with the given comparator and return a new `TimeSeries`. diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py index 1b0d760a6..b5d05f987 100644 --- a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py +++ b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py @@ -122,7 +122,7 @@ def test_should_raise_if_column_contains_non_numerical_values() -> None: r" non-numerical columns." ), ): - table.plot_time_series_lineplot( x_column_name="target") + table.plot_time_series_lineplot(x_column_name="target") @pytest.mark.parametrize( @@ -227,6 +227,8 @@ def test_should_raise_error_optional_parameter_y( match=error_msg, ): time_series.plot_time_series_lineplot(y_column_name=name) + + def test_should_raise_if_column_does_not_exist_x() -> None: table = TimeSeries( { @@ -240,11 +242,10 @@ def test_should_raise_if_column_does_not_exist_x() -> None: ) with pytest.raises( UnknownColumnNameError, - match=( - "Could not find column\(s\) '2'." - ), + match=r"Could not find column\(s\) '2'.", ): - table.plot_time_series_lineplot( x_column_name="target", y_column_name="2") + table.plot_time_series_lineplot(x_column_name="target", y_column_name="2") + def test_should_raise_if_column_does_not_exist_y() -> None: table = TimeSeries( @@ -259,8 +260,6 @@ def test_should_raise_if_column_does_not_exist_y() -> None: ) with pytest.raises( UnknownColumnNameError, - match=( - "Could not find column\(s\) '2'." - ), + match=r"Could not find column\(s\) '2'.", ): - table.plot_time_series_lineplot( x_column_name="2", y_column_name="target") + table.plot_time_series_lineplot(x_column_name="2", y_column_name="target") diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py index 699f502a7..1298d1729 100644 --- a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py +++ b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py @@ -228,6 +228,7 @@ def test_should_raise_error_optional_parameter_y( ): time_series.plot_time_series_scatterplot(y_column_name=name) + def test_should_raise_if_column_does_not_exist_x() -> None: table = TimeSeries( { @@ -241,11 +242,10 @@ def test_should_raise_if_column_does_not_exist_x() -> None: ) with pytest.raises( UnknownColumnNameError, - match=( - "Could not find column\(s\) '2'." - ), + match=r"Could not find column\(s\) '2'.", ): - table.plot_time_series_scatterplot( x_column_name="target", y_column_name="2") + table.plot_time_series_scatterplot(x_column_name="target", y_column_name="2") + def test_should_raise_if_column_does_not_exist_y() -> None: table = TimeSeries( @@ -260,8 +260,6 @@ def test_should_raise_if_column_does_not_exist_y() -> None: ) with pytest.raises( UnknownColumnNameError, - match=( - "Could not find column\(s\) '2'." - ), + match=r"Could not find column\(s\) '2'.", ): - table.plot_time_series_scatterplot( x_column_name="2", y_column_name="target") + table.plot_time_series_scatterplot(x_column_name="2", y_column_name="target") From f247a99ff55c7b611ff741679df4e07077f3debb Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Wed, 28 Feb 2024 00:59:13 +0100 Subject: [PATCH 20/24] deleted useless catch --- src/safeds/data/tabular/containers/_time_series.py | 4 ---- .../_time_series/test_plot_time_series_scatter.py | 7 ++++--- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index bedca4e18..3b8d07ab8 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -957,8 +957,6 @@ def plot_time_series_lineplot(self, y_column_name: str | None = None, x_column_n if x_column_name is None: x_column_name = "index" - elif x_column_name not in self._data.columns: - raise UnknownColumnNameError([x_column_name]) if not self.get_column(y_column_name).type.is_numeric(): raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") @@ -1034,8 +1032,6 @@ def plot_time_series_scatterplot( if x_column_name is None: x_column_name = "index" - elif x_column_name not in self._data.columns: - raise UnknownColumnNameError([x_column_name]) if not self.get_column(y_column_name).type.is_numeric(): raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py index 1298d1729..d7ef223e4 100644 --- a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py +++ b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py @@ -229,7 +229,7 @@ def test_should_raise_error_optional_parameter_y( time_series.plot_time_series_scatterplot(y_column_name=name) -def test_should_raise_if_column_does_not_exist_x() -> None: +def test_should_raise_if_column_does_not_exist_y() -> None: table = TimeSeries( { "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], @@ -247,7 +247,8 @@ def test_should_raise_if_column_does_not_exist_x() -> None: table.plot_time_series_scatterplot(x_column_name="target", y_column_name="2") -def test_should_raise_if_column_does_not_exist_y() -> None: + +def test_should_raise_if_column_does_not_exist_x() -> None: table = TimeSeries( { "time": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], @@ -262,4 +263,4 @@ def test_should_raise_if_column_does_not_exist_y() -> None: UnknownColumnNameError, match=r"Could not find column\(s\) '2'.", ): - table.plot_time_series_scatterplot(x_column_name="2", y_column_name="target") + table.plot_time_series_scatterplot(x_column_name="2") From 38c5d845331e55f6c353ba868477cc54aef54230 Mon Sep 17 00:00:00 2001 From: megalinter-bot <129584137+megalinter-bot@users.noreply.github.com> Date: Wed, 28 Feb 2024 00:00:44 +0000 Subject: [PATCH 21/24] style: apply automated linter fixes --- src/safeds/data/tabular/containers/_time_series.py | 1 - .../_tagged_table/_time_series/test_plot_time_series_scatter.py | 1 - 2 files changed, 2 deletions(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 3b8d07ab8..d7a9e5426 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -957,7 +957,6 @@ def plot_time_series_lineplot(self, y_column_name: str | None = None, x_column_n if x_column_name is None: x_column_name = "index" - if not self.get_column(y_column_name).type.is_numeric(): raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py index d7ef223e4..fa1117ae1 100644 --- a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py +++ b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py @@ -247,7 +247,6 @@ def test_should_raise_if_column_does_not_exist_y() -> None: table.plot_time_series_scatterplot(x_column_name="target", y_column_name="2") - def test_should_raise_if_column_does_not_exist_x() -> None: table = TimeSeries( { From 779d5fd8f5c41c5b04837782082124620467fefa Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Mon, 4 Mar 2024 11:32:47 +0100 Subject: [PATCH 22/24] applied code changes --- .../data/tabular/containers/_time_series.py | 27 +++++++++--------- .../test_should_plot_feature.png | Bin .../test_should_plot_feature_x.png | Bin .../test_should_plot_feature_y.png | Bin 0 -> 17313 bytes .../test_should_return_table.png | Bin 0 -> 14946 bytes .../test_should_return_table_both.png | Bin .../test_should_plot_feature.png | Bin 0 -> 11415 bytes .../test_should_plot_feature_both_set.png | Bin .../test_should_plot_feature_only_x.png | Bin ...st_should_plot_feature_only_y_optional.png | Bin 0 -> 11415 bytes .../test_should_return_table.png | Bin 0 -> 11067 bytes .../test_should_plot_feature_y.png | Bin 19374 -> 0 bytes .../test_should_return_table.png | Bin 18627 -> 0 bytes .../test_should_plot_feature.png | Bin 11608 -> 0 bytes ...st_should_plot_feature_only_y_optional.png | Bin 11608 -> 0 bytes .../test_should_return_table.png | Bin 11291 -> 0 bytes ...t_time_series.py => test_plot_lineplot.py} | 22 +++++++------- ...es_scatter.py => test_plot_scatterplot.py} | 22 +++++++------- 18 files changed, 35 insertions(+), 36 deletions(-) rename tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/{test_plot_time_series => test_plot_lineplot}/test_should_plot_feature.png (100%) rename tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/{test_plot_time_series => test_plot_lineplot}/test_should_plot_feature_x.png (100%) create mode 100644 tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_lineplot/test_should_plot_feature_y.png create mode 100644 tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_lineplot/test_should_return_table.png rename tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/{test_plot_time_series => test_plot_lineplot}/test_should_return_table_both.png (100%) create mode 100644 tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_scatterplot/test_should_plot_feature.png rename tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/{test_plot_time_series_scatter => test_plot_scatterplot}/test_should_plot_feature_both_set.png (100%) rename tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/{test_plot_time_series_scatter => test_plot_scatterplot}/test_should_plot_feature_only_x.png (100%) create mode 100644 tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_scatterplot/test_should_plot_feature_only_y_optional.png create mode 100644 tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_scatterplot/test_should_return_table.png delete mode 100644 tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series/test_should_plot_feature_y.png delete mode 100644 tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series/test_should_return_table.png delete mode 100644 tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series_scatter/test_should_plot_feature.png delete mode 100644 tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series_scatter/test_should_plot_feature_only_y_optional.png delete mode 100644 tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series_scatter/test_should_return_table.png rename tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/{test_plot_time_series.py => test_plot_lineplot.py} (90%) rename tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/{test_plot_time_series_scatter.py => test_plot_scatterplot.py} (90%) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index d7a9e5426..12aa2f038 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -908,20 +908,20 @@ def plot_lagplot(self, lag: int) -> Image: buffer.seek(0) return Image.from_bytes(buffer.read()) - def plot_time_series_lineplot(self, y_column_name: str | None = None, x_column_name: str | None = None) -> Image: + def plot_lineplot(self, x_column_name: str | None = None, y_column_name: str | None = None) -> Image: """ Plot the time series target or the given column(s) as line plot. - The function will take the target column as the default value for x_column_name and a time dummy column as the - default value for y_column_name. + The function will take the time column as the default value for y_column_name and the target column as the + default value for x_column_name. Parameters ---------- - x_column_name : str - The column name of the column to be plotted on the x-Axis. - y_column_name : str - The column name of the column to be plotted on the y-Axis. + x_column_name: + The column name of the column to be plotted on the x-Axis, default is the time column. + y_column_name: + The column name of the column to be plotted on the y-Axis, default is the target column. Returns ------- @@ -944,7 +944,6 @@ def plot_time_series_lineplot(self, y_column_name: str | None = None, x_column_n """ self._data.index.name = "index" - # falls mitgegebene column kein numerical column ist if x_column_name is not None and not self.get_column(x_column_name).type.is_numeric(): raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") @@ -955,7 +954,7 @@ def plot_time_series_lineplot(self, y_column_name: str | None = None, x_column_n raise UnknownColumnNameError([y_column_name]) if x_column_name is None: - x_column_name = "index" + x_column_name = self.time.name if not self.get_column(y_column_name).type.is_numeric(): raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") @@ -982,7 +981,7 @@ def plot_time_series_lineplot(self, y_column_name: str | None = None, x_column_n self._data = self._data.reset_index() return Image.from_bytes(buffer.read()) - def plot_time_series_scatterplot( + def plot_scatterplot( self, x_column_name: str | None = None, y_column_name: str | None = None, @@ -990,14 +989,14 @@ def plot_time_series_scatterplot( """ Plot the time series target or the given column(s) as scatter plot. - The function will take the target column as the default value for x_column_name and a time dummy column as the + The function will take the time column as the default value for x_column_name and the target column as the default value for y_column_name. Parameters ---------- - x_column_name : str + x_column_name: The column name of the column to be plotted on the x-Axis. - y_column_name : str + y_column_name: The column name of the column to be plotted on the y-Axis. Returns @@ -1029,7 +1028,7 @@ def plot_time_series_scatterplot( elif y_column_name not in self._data.columns: raise UnknownColumnNameError([y_column_name]) if x_column_name is None: - x_column_name = "index" + x_column_name = self.time.name if not self.get_column(y_column_name).type.is_numeric(): raise NonNumericColumnError("The time series plotted column contains non-numerical columns.") diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series/test_should_plot_feature.png b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_lineplot/test_should_plot_feature.png similarity index 100% rename from tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series/test_should_plot_feature.png rename to tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_lineplot/test_should_plot_feature.png diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series/test_should_plot_feature_x.png b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_lineplot/test_should_plot_feature_x.png similarity index 100% rename from tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series/test_should_plot_feature_x.png rename to tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_lineplot/test_should_plot_feature_x.png diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_lineplot/test_should_plot_feature_y.png b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_lineplot/test_should_plot_feature_y.png new file mode 100644 index 0000000000000000000000000000000000000000..b0d4d19186fb661091c471b32b68ca8c40cd9bd6 GIT binary patch literal 17313 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 B(=Gr2 literal 0 HcmV?d00001 diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_lineplot/test_should_return_table.png b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_lineplot/test_should_return_table.png new file mode 100644 index 0000000000000000000000000000000000000000..f40ea785459a4912eeda353af9ec865d9a0fba59 GIT binary patch literal 14946 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

    Zx<0|GL18) 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 Dklzf% literal 0 HcmV?d00001 diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series_scatter/test_should_plot_feature_both_set.png b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_scatterplot/test_should_plot_feature_both_set.png similarity index 100% rename from tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series_scatter/test_should_plot_feature_both_set.png rename to tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_scatterplot/test_should_plot_feature_both_set.png diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series_scatter/test_should_plot_feature_only_x.png b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_scatterplot/test_should_plot_feature_only_x.png similarity index 100% rename from tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series_scatter/test_should_plot_feature_only_x.png rename to tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_scatterplot/test_should_plot_feature_only_x.png diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_scatterplot/test_should_plot_feature_only_y_optional.png b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_scatterplot/test_should_plot_feature_only_y_optional.png new file mode 100644 index 0000000000000000000000000000000000000000..d52aa8a85300f335e6918473072ff5c758b4a2c5 GIT binary patch literal 11415 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 Dklzf% literal 0 HcmV?d00001 diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_scatterplot/test_should_return_table.png b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_scatterplot/test_should_return_table.png new file mode 100644 index 0000000000000000000000000000000000000000..f92f23bea9692029026940c80ebd787501347bdf GIT binary patch literal 11067 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 literal 0 HcmV?d00001 diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series/test_should_plot_feature_y.png b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series/test_should_plot_feature_y.png deleted file mode 100644 index 3c15041c84ba6a203d7c210569cb98f4f408c290..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19374 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�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%0Du+`4-1orQ!7_Tnw)v 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 I{m;k$4~XU|KL7v# diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series_scatter/test_should_plot_feature.png b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/__snapshots__/test_plot_time_series_scatter/test_should_plot_feature.png deleted file mode 100644 index 6f692a4ea157c83a54fcb987c2c3d2c8b2a0b19e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11608 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 diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_lineplot.py similarity index 90% rename from tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py rename to tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_lineplot.py index b5d05f987..a4816e4ec 100644 --- a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series.py +++ b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_lineplot.py @@ -15,7 +15,7 @@ def test_should_return_table(snapshot_png: SnapshotAssertion) -> None: time_name="time", feature_names=None, ) - plot = table.plot_time_series_lineplot() + plot = table.plot_lineplot() assert plot == snapshot_png @@ -39,7 +39,7 @@ def test_should_raise_if_column_contains_non_numerical_values_x() -> None: r" non-numerical columns." ), ): - table.plot_time_series_lineplot(x_column_name="feature_1") + table.plot_lineplot(x_column_name="feature_1") def test_should_return_table_both(snapshot_png: SnapshotAssertion) -> None: @@ -53,7 +53,7 @@ def test_should_return_table_both(snapshot_png: SnapshotAssertion) -> None: time_name="time", feature_names=None, ) - plot = table.plot_time_series_lineplot(x_column_name="feature_1", y_column_name="target") + plot = table.plot_lineplot(x_column_name="feature_1", y_column_name="target") assert plot == snapshot_png @@ -68,7 +68,7 @@ def test_should_plot_feature_y(snapshot_png: SnapshotAssertion) -> None: time_name="time", feature_names=None, ) - plot = table.plot_time_series_lineplot(y_column_name="feature_1") + plot = table.plot_lineplot(y_column_name="feature_1") assert plot == snapshot_png @@ -83,7 +83,7 @@ def test_should_plot_feature_x(snapshot_png: SnapshotAssertion) -> None: time_name="time", feature_names=None, ) - plot = table.plot_time_series_lineplot(x_column_name="feature_1") + plot = table.plot_lineplot(x_column_name="feature_1") assert plot == snapshot_png @@ -98,7 +98,7 @@ def test_should_plot_feature(snapshot_png: SnapshotAssertion) -> None: time_name="time", feature_names=None, ) - plot = table.plot_time_series_lineplot(x_column_name="feature_1") + plot = table.plot_lineplot(x_column_name="feature_1") assert plot == snapshot_png @@ -122,7 +122,7 @@ def test_should_raise_if_column_contains_non_numerical_values() -> None: r" non-numerical columns." ), ): - table.plot_time_series_lineplot(x_column_name="target") + table.plot_lineplot(x_column_name="target") @pytest.mark.parametrize( @@ -174,7 +174,7 @@ def test_should_raise_error_optional_parameter( error, match=error_msg, ): - time_series.plot_time_series_lineplot(x_column_name=name) + time_series.plot_lineplot(x_column_name=name) @pytest.mark.parametrize( @@ -226,7 +226,7 @@ def test_should_raise_error_optional_parameter_y( error, match=error_msg, ): - time_series.plot_time_series_lineplot(y_column_name=name) + time_series.plot_lineplot(y_column_name=name) def test_should_raise_if_column_does_not_exist_x() -> None: @@ -244,7 +244,7 @@ def test_should_raise_if_column_does_not_exist_x() -> None: UnknownColumnNameError, match=r"Could not find column\(s\) '2'.", ): - table.plot_time_series_lineplot(x_column_name="target", y_column_name="2") + table.plot_lineplot(x_column_name="target", y_column_name="2") def test_should_raise_if_column_does_not_exist_y() -> None: @@ -262,4 +262,4 @@ def test_should_raise_if_column_does_not_exist_y() -> None: UnknownColumnNameError, match=r"Could not find column\(s\) '2'.", ): - table.plot_time_series_lineplot(x_column_name="2", y_column_name="target") + table.plot_lineplot(x_column_name="2", y_column_name="target") diff --git a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_scatterplot.py similarity index 90% rename from tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py rename to tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_scatterplot.py index fa1117ae1..822b3d755 100644 --- a/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_time_series_scatter.py +++ b/tests/safeds/data/tabular/containers/_table/_tagged_table/_time_series/test_plot_scatterplot.py @@ -15,7 +15,7 @@ def test_should_return_table(snapshot_png: SnapshotAssertion) -> None: time_name="time", feature_names=None, ) - plot = table.plot_time_series_scatterplot() + plot = table.plot_scatterplot() assert plot == snapshot_png @@ -30,7 +30,7 @@ def test_should_plot_feature(snapshot_png: SnapshotAssertion) -> None: time_name="time", feature_names=None, ) - plot = table.plot_time_series_scatterplot(y_column_name="feature_1") + plot = table.plot_scatterplot(y_column_name="feature_1") assert plot == snapshot_png @@ -45,7 +45,7 @@ def test_should_plot_feature_only_x(snapshot_png: SnapshotAssertion) -> None: time_name="time", feature_names=None, ) - plot = table.plot_time_series_scatterplot(x_column_name="feature_1") + plot = table.plot_scatterplot(x_column_name="feature_1") assert plot == snapshot_png @@ -60,7 +60,7 @@ def test_should_plot_feature_only_y_optional(snapshot_png: SnapshotAssertion) -> time_name="time", feature_names=None, ) - plot = table.plot_time_series_scatterplot(y_column_name="feature_1") + plot = table.plot_scatterplot(y_column_name="feature_1") assert plot == snapshot_png @@ -75,7 +75,7 @@ def test_should_plot_feature_both_set(snapshot_png: SnapshotAssertion) -> None: time_name="time", feature_names=None, ) - plot = table.plot_time_series_scatterplot(x_column_name="feature_1", y_column_name="target") + plot = table.plot_scatterplot(x_column_name="feature_1", y_column_name="target") assert plot == snapshot_png @@ -99,7 +99,7 @@ def test_should_raise_if_column_contains_non_numerical_values() -> None: r" non-numerical columns." ), ): - table.plot_time_series_scatterplot(y_column_name="feature_1") + table.plot_scatterplot(y_column_name="feature_1") def test_should_raise_if_column_contains_non_numerical_values_x() -> None: @@ -122,7 +122,7 @@ def test_should_raise_if_column_contains_non_numerical_values_x() -> None: r" non-numerical columns." ), ): - table.plot_time_series_scatterplot(x_column_name="feature_1") + table.plot_scatterplot(x_column_name="feature_1") @pytest.mark.parametrize( @@ -174,7 +174,7 @@ def test_should_raise_error_optional_parameter( error, match=error_msg, ): - time_series.plot_time_series_scatterplot(x_column_name=name) + time_series.plot_scatterplot(x_column_name=name) @pytest.mark.parametrize( @@ -226,7 +226,7 @@ def test_should_raise_error_optional_parameter_y( error, match=error_msg, ): - time_series.plot_time_series_scatterplot(y_column_name=name) + time_series.plot_scatterplot(y_column_name=name) def test_should_raise_if_column_does_not_exist_y() -> None: @@ -244,7 +244,7 @@ def test_should_raise_if_column_does_not_exist_y() -> None: UnknownColumnNameError, match=r"Could not find column\(s\) '2'.", ): - table.plot_time_series_scatterplot(x_column_name="target", y_column_name="2") + table.plot_scatterplot(x_column_name="target", y_column_name="2") def test_should_raise_if_column_does_not_exist_x() -> None: @@ -262,4 +262,4 @@ def test_should_raise_if_column_does_not_exist_x() -> None: UnknownColumnNameError, match=r"Could not find column\(s\) '2'.", ): - table.plot_time_series_scatterplot(x_column_name="2") + table.plot_scatterplot(x_column_name="2") From 9afba911cf4439f4c3ac807aae8a80ee67985ebd Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Mon, 4 Mar 2024 11:34:46 +0100 Subject: [PATCH 23/24] fixed comment issue --- src/safeds/data/tabular/containers/_time_series.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index 12aa2f038..a64421428 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -940,7 +940,7 @@ def plot_lineplot(self, x_column_name: str | None = None, y_column_name: str | N -------- >>> from safeds.data.tabular.containers import TimeSeries >>> table = TimeSeries({"time":[1, 2], "target": [3, 4], "feature":[2,2]}, target_name= "target", time_name="time", feature_names=["feature"], ) - >>> image = table.plot_time_series_lineplot() + >>> image = table.plot_lineplot() """ self._data.index.name = "index" From b8d966c069cb67b990fc36bc80bf8b2448b42568 Mon Sep 17 00:00:00 2001 From: Gerhardsa0 Date: Mon, 4 Mar 2024 11:43:01 +0100 Subject: [PATCH 24/24] fixed comment issue --- src/safeds/data/tabular/containers/_time_series.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/safeds/data/tabular/containers/_time_series.py b/src/safeds/data/tabular/containers/_time_series.py index a64421428..a755885e1 100644 --- a/src/safeds/data/tabular/containers/_time_series.py +++ b/src/safeds/data/tabular/containers/_time_series.py @@ -1016,7 +1016,7 @@ def plot_scatterplot( -------- >>> from safeds.data.tabular.containers import TimeSeries >>> table = TimeSeries({"time":[1, 2], "target": [3, 4], "feature":[2,2]}, target_name= "target", time_name="time", feature_names=["feature"], ) - >>> image = table.plot_time_series_scatterplot() + >>> image = table.plot_scatterplot() """ self._data.index.name = "index"