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