diff --git a/saqc/lib/rolling.py b/saqc/lib/rolling.py index d4afba65cc76ab097caf0baab12c085dc6e9fc9a..ba529fa5359f1e9707d12510939b524d0f6d4e65 100644 --- a/saqc/lib/rolling.py +++ b/saqc/lib/rolling.py @@ -86,9 +86,6 @@ class _CustomBaseIndexer(BaseIndexer): start, end = self._apply_skipmask(start, end) start, end = self._apply_steps(start, end, num_values) start, end = self._prepare_min_periods_masking(start, end, num_values) - - # print('Custom') - # print(np.array([start, end])) return start, end def _prepare_min_periods_masking(self, start, end, num_values): @@ -216,16 +213,16 @@ class _VariableWindowDirectionIndexer(_CustomBaseIndexer): ws_bw, ws_fw = self._get_center_window_sizes(self.window_size) if center: c1 = c2 = closed - if closed is 'neither': + if closed == 'neither': c1, c2 = 'right', 'left' start, _ = self._bw(num_values, ws_bw, c1) _, end = self._fw(num_values, ws_fw, c2) - elif not self.forward: - start, end = self._bw(num_values, ws_bw, closed) - else: + elif self.forward: start, end = self._fw(num_values, ws_fw, closed) + else: + start, end = self._bw(num_values, ws_bw, closed) if not self.expand: start, end = self._remove_ramps(start, end, center) @@ -263,6 +260,9 @@ class _VariableWindowDirectionIndexer(_CustomBaseIndexer): s, _ = calculate_variable_window_bounds(num_values, window_size, None, None, closed, arr) start = np.arange(num_values) end = num_values - s[::-1] + + if closed in ['left', 'neither']: + start += 1 return start, end diff --git a/test/lib/test_rolling.py b/test/lib/test_rolling.py index d2980ff386814fa4e15df7b888ef2549cc91cef3..2c0e99452018c554825bc2bfeaefc606a3c8d398 100644 --- a/test/lib/test_rolling.py +++ b/test/lib/test_rolling.py @@ -11,16 +11,16 @@ def data(): def data_(): - # s1 = pd.Series(1., index=pd.date_range("1999/12", periods=12, freq='1M') + pd.Timedelta('1d')) - # s2 = pd.Series(1., index=pd.date_range('2000/05/15', periods=8, freq='1d')) - # s = pd.concat([s1, s2]).sort_index() - # s.name = 's' - # s[15] = np.nan - s1 = pd.Series(1., index=pd.date_range("1999/12", periods=4, freq='1M') + pd.Timedelta('1d')) - s2 = pd.Series(1., index=pd.date_range('2000/05/15', periods=2, freq='1d')) + s1 = pd.Series(1., index=pd.date_range("1999/12", periods=12, freq='1M') + pd.Timedelta('1d')) + s2 = pd.Series(1., index=pd.date_range('2000/05/15', periods=8, freq='1d')) s = pd.concat([s1, s2]).sort_index() s.name = 's' - s[4] = np.nan + s[15] = np.nan + # s1 = pd.Series(1., index=pd.date_range("1999/12", periods=4, freq='1M') + pd.Timedelta('1d')) + # s2 = pd.Series(1., index=pd.date_range('2000/05/15', periods=2, freq='1d')) + # s = pd.concat([s1, s2]).sort_index() + # s.name = 's' + # s[4] = np.nan return s @@ -39,11 +39,11 @@ def make_num_kws(): def make_dt_kws(): l = [] - for window in range(1, len_s + 3): - for min_periods in [None] + list(range(window + 1)): - for win in [f'{window}d', f'{window * 32}d']: - for center in [False, True]: - for closed in [None] + ['left', 'right', 'both', 'neither']: + for closed in [None] + ['right', 'both', 'neither', 'left']: + for window in range(1, len_s + 3): + for min_periods in [None] + list(range(window + 1)): + for win in [f'{window}d', f'{window * 31}d']: + for center in [False, True]: l.append(dict(window=win, min_periods=min_periods, center=center, closed=closed)) return l @@ -95,7 +95,7 @@ def test_pandas_conform_num(data, kws): @pytest.mark.parametrize("kws", make_dt_kws()) def test_pandas_conform_dt(data, kws): if kws.get('center', False) is True: - pass + pytest.skip('pandas has no center on dt-index') else: runtest_for_kw_combi(data, kws) @@ -106,10 +106,25 @@ def test_forward_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') -# else: -# 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.get('center', False) is True: + pytest.skip('pandas has no center on dt-index') + else: + runtest_for_kw_combi(data, kws) + + +# def test_centering_w_dtindex(): +# s = pd.Series(0., index=pd.date_range("2000", periods=10, freq='1H')) +# s[4:7] = 1 +# +# w = 2 +# pd_kw= dict(window=w, center=True, min_periods=None) +# our_kw = dict(window=f'{w}h', center=True, closed='both') +# expected = s.rolling(**pd_kw).sum() +# result = customRoller(s, **our_kw, expand=False).sum() +# df = pd.DataFrame() +# df['res'] = result +# df['exp'] = expected +# print(df)