Skip to content

Commit 19330c2

Browse files
keitakuritaTomAugspurger
authored andcommitted
BUG: Incorrect handling of rolling.cov with offset window (pandas-dev#16244)
(cherry picked from commit 4ca29f4)
1 parent 9d6520a commit 19330c2

File tree

2 files changed

+31
-1
lines changed

2 files changed

+31
-1
lines changed

pandas/core/window.py

+8-1
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ def __init__(self, obj, window=None, min_periods=None, freq=None,
8181
self.freq = freq
8282
self.center = center
8383
self.win_type = win_type
84+
self.win_freq = None
8485
self.axis = obj._get_axis_number(axis) if axis is not None else None
8586
self.validate()
8687

@@ -996,7 +997,12 @@ def cov(self, other=None, pairwise=None, ddof=1, **kwargs):
996997
# only default unset
997998
pairwise = True if pairwise is None else pairwise
998999
other = self._shallow_copy(other)
999-
window = self._get_window(other)
1000+
1001+
# GH 16058: offset window
1002+
if self.is_freq_type:
1003+
window = self.win_freq
1004+
else:
1005+
window = self._get_window(other)
10001006

10011007
def _get_cov(X, Y):
10021008
# GH #12373 : rolling functions error on float32 data
@@ -1088,6 +1094,7 @@ def validate(self):
10881094
"based windows")
10891095

10901096
# this will raise ValueError on non-fixed freqs
1097+
self.win_freq = self.window
10911098
self.window = freq.nanos
10921099
self.win_type = 'freq'
10931100

pandas/tests/test_window.py

+23
Original file line numberDiff line numberDiff line change
@@ -3833,3 +3833,26 @@ def test_non_monotonic(self):
38333833
df2 = df.sort_values('B')
38343834
result = df2.groupby('A').rolling('4s', on='B').C.mean()
38353835
tm.assert_series_equal(result, expected)
3836+
3837+
def test_rolling_cov_offset(self):
3838+
# GH16058
3839+
3840+
idx = pd.date_range('2017-01-01', periods=24, freq='1h')
3841+
ss = pd.Series(np.arange(len(idx)), index=idx)
3842+
3843+
result = ss.rolling('2h').cov()
3844+
expected = pd.Series([np.nan] + [0.5 for _ in range(len(idx) - 1)],
3845+
index=idx)
3846+
tm.assert_series_equal(result, expected)
3847+
3848+
expected2 = ss.rolling(2, min_periods=1).cov()
3849+
tm.assert_series_equal(result, expected2)
3850+
3851+
result = ss.rolling('3h').cov()
3852+
expected = pd.Series([np.nan, 0.5] +
3853+
[1.0 for _ in range(len(idx) - 2)],
3854+
index=idx)
3855+
tm.assert_series_equal(result, expected)
3856+
3857+
expected2 = ss.rolling(3, min_periods=1).cov()
3858+
tm.assert_series_equal(result, expected2)

0 commit comments

Comments
 (0)