From c68a8da6d8153ef7608b2b440421319c16abb695 Mon Sep 17 00:00:00 2001
From: Bert Palm <bert.palm@ufz.de>
Date: Tue, 24 Nov 2020 21:54:44 +0100
Subject: [PATCH] fixed centering

---
 saqc/lib/rolling.py      | 22 ++++++++++++--------
 test/lib/test_rolling.py | 44 ++++++++++++++++++++--------------------
 2 files changed, 35 insertions(+), 31 deletions(-)

diff --git a/saqc/lib/rolling.py b/saqc/lib/rolling.py
index 714545eab..d4afba65c 100644
--- a/saqc/lib/rolling.py
+++ b/saqc/lib/rolling.py
@@ -145,9 +145,9 @@ class _FixedWindowDirectionIndexer(_CustomBaseIndexer):
         num_values += offset
 
         if self.forward:
-            start, end = self._fw(num_values, min_periods, center, closed)
+            start, end = self._fw(num_values, min_periods, center, closed, offset)
         else:
-            start, end = self._bw(num_values, min_periods, center, closed)
+            start, end = self._bw(num_values, min_periods, center, closed, offset)
 
         if center:
             start, end = self._center_result(start, end, offset)
@@ -160,8 +160,12 @@ class _FixedWindowDirectionIndexer(_CustomBaseIndexer):
 
     def _center_result(self, start, end, offset):
         if offset > 0:
-            start = start[offset:]
-            end = end[offset:]
+            if self.forward:
+                start = start[:-offset]
+                end = end[:-offset]
+            else:
+                start = start[offset:]
+                end = end[offset:]
         return start, end
 
     def _remove_ramps(self, start, end, center):
@@ -177,7 +181,7 @@ class _FixedWindowDirectionIndexer(_CustomBaseIndexer):
 
         return start, end
 
-    def _bw(self, num_values=0, min_periods=None, center=False, closed=None):
+    def _bw(self, num_values=0, min_periods=None, center=False, closed=None, offset=0):
         # code taken from pd.core.windows.indexer.FixedWindowIndexer
         start_s = np.zeros(self.window_size, dtype="int64")
         start_e = (np.arange(self.window_size, num_values, dtype="int64") - self.window_size + 1)
@@ -189,10 +193,10 @@ class _FixedWindowDirectionIndexer(_CustomBaseIndexer):
         # end stolen code
         return start, end
 
-    def _fw(self, num_values=0, min_periods=None, center=False, closed=None):
-        s, _ = self._bw(num_values, min_periods, center, closed)
-        start = np.arange(num_values)
-        end = num_values - s[::-1]
+    def _fw(self, num_values=0, min_periods=None, center=False, closed=None, offset=0):
+        start = np.arange(-offset, num_values, dtype="int64")[:num_values]
+        end = start + self.window_size
+        start[:offset] = 0
         return start, end
 
 
diff --git a/test/lib/test_rolling.py b/test/lib/test_rolling.py
index 443aba123..d2980ff38 100644
--- a/test/lib/test_rolling.py
+++ b/test/lib/test_rolling.py
@@ -86,30 +86,30 @@ def runtest_for_kw_combi(s, kws):
             print_diff(s, result, expected)
             assert False
 
-#
-# @pytest.mark.parametrize("kws", make_num_kws())
-# def test_pandas_conform_num(data, kws):
-#     runtest_for_kw_combi(data, kws)
-#
-#
-# @pytest.mark.parametrize("kws", make_dt_kws())
-# def test_pandas_conform_dt(data, kws):
-#     if kws.get('center', False) is True:
-#         pass
-#     else:
-#         runtest_for_kw_combi(data, kws)
-#
-#
-# @pytest.mark.parametrize("kws", make_num_kws())
-# def test_forward_num(data, kws):
-#     kws.update(forward=True, center=False)
-#     runtest_for_kw_combi(data, kws)
+
+@pytest.mark.parametrize("kws", make_num_kws())
+def test_pandas_conform_num(data, kws):
+    runtest_for_kw_combi(data, kws)
 
 
 @pytest.mark.parametrize("kws", make_dt_kws())
-def test_forward_dt(data, kws):
-    kws.update(forward=True)
-    if kws['center'] is True:
-        pytest.skip('pandas has no center on dt-index')
+def test_pandas_conform_dt(data, kws):
+    if kws.get('center', False) is True:
+        pass
     else:
         runtest_for_kw_combi(data, kws)
+
+
+@pytest.mark.parametrize("kws", make_num_kws())
+def test_forward_num(data, kws):
+    kws.update(forward=True)
+    runtest_for_kw_combi(data, kws)
+
+
+# @pytest.mark.parametrize("kws", make_dt_kws())
+# def test_forward_dt(data, kws):
+#     kws.update(forward=True)
+#     if kws['center'] is True:
+#         pytest.skip('pandas has no center on dt-index')
+#     else:
+#         runtest_for_kw_combi(data, kws)
-- 
GitLab