From 1229cea5de8030d99d5f56536c24ca868fa06998 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sch=C3=A4fer?= <david.schaefer@ufz.de> Date: Thu, 21 Mar 2024 13:18:44 +0100 Subject: [PATCH] added option to change History.squeeze behavior --- CHANGELOG.md | 1 + saqc/core/history.py | 9 ++++++++- tests/core/test_history.py | 24 +++++++++++++++++++++++- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f24a24883..8207d7a88 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ SPDX-License-Identifier: GPL-3.0-or-later - `plot`: added `yscope` keyword - `setFlags`: function to replace `flagManual` - `flagUniLOF`: added defaultly applied correction to mitigate phenomenon of overflagging at relatively steep data value slopes. (parameter `slope_correct`). +- `History`: added option to change aggregation behavior ### Changed ### Removed ### Fixed diff --git a/saqc/core/history.py b/saqc/core/history.py index 3391697c9..db6f9e06a 100644 --- a/saqc/core/history.py +++ b/saqc/core/history.py @@ -15,6 +15,13 @@ from pandas.api.types import is_float_dtype from saqc import UNFLAGGED +AGGRGEGATIONS = { + "last": lambda x: x.ffill(axis=1).iloc[:, -1], + "max": lambda x: x.max(axis=1), + "min": lambda x: x.min(axis=1), +} +AGGREGATION = "last" + class History: """ @@ -306,7 +313,7 @@ class History: if hist.empty: result = pd.Series(data=np.nan, index=self._hist.index, dtype=float) else: - result = hist.ffill(axis=1).iloc[:, -1] + result = AGGRGEGATIONS[AGGREGATION](hist) if not raw: result = result.fillna(UNFLAGGED) result.name = None diff --git a/tests/core/test_history.py b/tests/core/test_history.py index cb3412c37..bbd9ed240 100644 --- a/tests/core/test_history.py +++ b/tests/core/test_history.py @@ -9,7 +9,7 @@ import pandas as pd import pytest from pandas.api.types import is_categorical_dtype, is_float_dtype -from saqc.core.history import History, createHistoryFromData +from saqc.core.history import AGGREGATION, History, createHistoryFromData from tests.common import dummyHistory # see #GH143 combined backtrack @@ -240,3 +240,25 @@ def test_append_force(__hist, s, max_val): hist.append(s) check_invariants(hist) assert all(hist.squeeze() == max_val) + + +@pytest.mark.parametrize( + "col, expected", + [ + (pd.Series(0, index=range(6), dtype=float), {"last": 0, "min": 0, "max": 0}), + (pd.Series(1, index=range(6), dtype=float), {"last": 1, "min": 0, "max": 1}), + (pd.Series(6, index=range(6), dtype=float), {"last": 6, "min": 0, "max": 6}), + (pd.Series(4, index=range(6), dtype=float), {"last": 4, "min": 0, "max": 6}), + ], +) +def test_aggregations(col, expected, hist=History(index=pd.Index(range(6)))): + import saqc.core.history + + hist.append(col) + check_invariants(hist) + for aggregation in ["last", "min", "max"]: + saqc.core.history.AGGREGATION = aggregation + assert (hist.squeeze() == expected[aggregation]).all() + + # reset to not disturb the other tests... + saqc.core.history.AGGREGATION = "last" -- GitLab