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