Skip to content

Commit bd78b32

Browse files
charlesdong1991jreback
authored andcommitted
CLN: Clean _test_moments_consistency in common.py (#30577)
1 parent 11664c3 commit bd78b32

File tree

4 files changed

+134
-49
lines changed

4 files changed

+134
-49
lines changed

pandas/tests/window/common.py

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -212,40 +212,23 @@ def _create_data(self):
212212
super()._create_data()
213213
self.data = _consistency_data
214214

215-
def _test_moments_consistency(
216-
self,
217-
min_periods,
218-
count,
219-
mean,
220-
mock_mean,
221-
corr,
222-
var_unbiased=None,
223-
std_unbiased=None,
224-
cov_unbiased=None,
225-
var_biased=None,
226-
std_biased=None,
227-
cov_biased=None,
228-
var_debiasing_factors=None,
229-
):
230-
def _non_null_values(x):
231-
values = x.values.ravel()
232-
return set(values[notna(values)].tolist())
233-
215+
def _test_moments_consistency_mock_mean(self, mean, mock_mean):
234216
for (x, is_constant, no_nans) in self.data:
235-
count_x = count(x)
236217
mean_x = mean(x)
218+
# check that correlation of a series with itself is either 1 or NaN
237219

238220
if mock_mean:
239221
# check that mean equals mock_mean
240222
expected = mock_mean(x)
241223
tm.assert_equal(mean_x, expected.astype("float64"))
242224

225+
def _test_moments_consistency_is_constant(self, min_periods, count, mean, corr):
226+
for (x, is_constant, no_nans) in self.data:
227+
count_x = count(x)
228+
mean_x = mean(x)
243229
# check that correlation of a series with itself is either 1 or NaN
244230
corr_x_x = corr(x, x)
245231

246-
# assert _non_null_values(corr_x_x).issubset(set([1.]))
247-
# restore once rolling_cov(x, x) is identically equal to var(x)
248-
249232
if is_constant:
250233
exp = x.max() if isinstance(x, Series) else x.max().max()
251234

@@ -258,13 +241,35 @@ def _non_null_values(x):
258241
expected[:] = np.nan
259242
tm.assert_equal(corr_x_x, expected)
260243

244+
def _test_moments_consistency_var_debiasing_factors(
245+
self, var_biased=None, var_unbiased=None, var_debiasing_factors=None
246+
):
247+
for (x, is_constant, no_nans) in self.data:
261248
if var_unbiased and var_biased and var_debiasing_factors:
262249
# check variance debiasing factors
263250
var_unbiased_x = var_unbiased(x)
264251
var_biased_x = var_biased(x)
265252
var_debiasing_factors_x = var_debiasing_factors(x)
266253
tm.assert_equal(var_unbiased_x, var_biased_x * var_debiasing_factors_x)
267254

255+
def _test_moments_consistency(
256+
self,
257+
min_periods,
258+
count,
259+
mean,
260+
corr,
261+
var_unbiased=None,
262+
std_unbiased=None,
263+
cov_unbiased=None,
264+
var_biased=None,
265+
std_biased=None,
266+
cov_biased=None,
267+
):
268+
269+
for (x, is_constant, no_nans) in self.data:
270+
count_x = count(x)
271+
mean_x = mean(x)
272+
268273
for (std, var, cov) in [
269274
(std_biased, var_biased, cov_biased),
270275
(std_unbiased, var_unbiased, cov_unbiased),

pandas/tests/window/moments/test_moments_ewm.py

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -379,16 +379,50 @@ def _ewma(s, com, min_periods, adjust, ignore_na):
379379
return result
380380

381381
com = 3.0
382+
self._test_moments_consistency_mock_mean(
383+
mean=lambda x: x.ewm(
384+
com=com, min_periods=min_periods, adjust=adjust, ignore_na=ignore_na
385+
).mean(),
386+
mock_mean=lambda x: _ewma(
387+
x, com=com, min_periods=min_periods, adjust=adjust, ignore_na=ignore_na
388+
),
389+
)
390+
391+
self._test_moments_consistency_is_constant(
392+
min_periods=min_periods,
393+
count=lambda x: x.expanding().count(),
394+
mean=lambda x: x.ewm(
395+
com=com, min_periods=min_periods, adjust=adjust, ignore_na=ignore_na
396+
).mean(),
397+
corr=lambda x, y: x.ewm(
398+
com=com, min_periods=min_periods, adjust=adjust, ignore_na=ignore_na
399+
).corr(y),
400+
)
401+
402+
self._test_moments_consistency_var_debiasing_factors(
403+
var_unbiased=lambda x: (
404+
x.ewm(
405+
com=com, min_periods=min_periods, adjust=adjust, ignore_na=ignore_na
406+
).var(bias=False)
407+
),
408+
var_biased=lambda x: (
409+
x.ewm(
410+
com=com, min_periods=min_periods, adjust=adjust, ignore_na=ignore_na
411+
).var(bias=True)
412+
),
413+
var_debiasing_factors=lambda x: (
414+
_variance_debiasing_factors(
415+
x, com=com, adjust=adjust, ignore_na=ignore_na
416+
)
417+
),
418+
)
382419
# test consistency between different ewm* moments
383420
self._test_moments_consistency(
384421
min_periods=min_periods,
385422
count=lambda x: x.expanding().count(),
386423
mean=lambda x: x.ewm(
387424
com=com, min_periods=min_periods, adjust=adjust, ignore_na=ignore_na
388425
).mean(),
389-
mock_mean=lambda x: _ewma(
390-
x, com=com, min_periods=min_periods, adjust=adjust, ignore_na=ignore_na
391-
),
392426
corr=lambda x, y: x.ewm(
393427
com=com, min_periods=min_periods, adjust=adjust, ignore_na=ignore_na
394428
).corr(y),
@@ -420,9 +454,4 @@ def _ewma(s, com, min_periods, adjust, ignore_na):
420454
com=com, min_periods=min_periods, adjust=adjust, ignore_na=ignore_na
421455
).cov(y, bias=True)
422456
),
423-
var_debiasing_factors=lambda x: (
424-
_variance_debiasing_factors(
425-
x, com=com, adjust=adjust, ignore_na=ignore_na
426-
)
427-
),
428457
)

pandas/tests/window/moments/test_moments_expanding.py

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -328,12 +328,31 @@ def test_expanding_consistency(self, min_periods):
328328
)
329329

330330
# test consistency between different expanding_* moments
331+
self._test_moments_consistency_mock_mean(
332+
mean=lambda x: x.expanding(min_periods=min_periods).mean(),
333+
mock_mean=lambda x: x.expanding(min_periods=min_periods).sum()
334+
/ x.expanding().count(),
335+
)
336+
337+
self._test_moments_consistency_is_constant(
338+
min_periods=min_periods,
339+
count=lambda x: x.expanding().count(),
340+
mean=lambda x: x.expanding(min_periods=min_periods).mean(),
341+
corr=lambda x, y: x.expanding(min_periods=min_periods).corr(y),
342+
)
343+
344+
self._test_moments_consistency_var_debiasing_factors(
345+
var_unbiased=lambda x: x.expanding(min_periods=min_periods).var(),
346+
var_biased=lambda x: x.expanding(min_periods=min_periods).var(ddof=0),
347+
var_debiasing_factors=lambda x: (
348+
x.expanding().count()
349+
/ (x.expanding().count() - 1.0).replace(0.0, np.nan)
350+
),
351+
)
331352
self._test_moments_consistency(
332353
min_periods=min_periods,
333354
count=lambda x: x.expanding().count(),
334355
mean=lambda x: x.expanding(min_periods=min_periods).mean(),
335-
mock_mean=lambda x: x.expanding(min_periods=min_periods).sum()
336-
/ x.expanding().count(),
337356
corr=lambda x, y: x.expanding(min_periods=min_periods).corr(y),
338357
var_unbiased=lambda x: x.expanding(min_periods=min_periods).var(),
339358
std_unbiased=lambda x: x.expanding(min_periods=min_periods).std(),
@@ -343,10 +362,6 @@ def test_expanding_consistency(self, min_periods):
343362
cov_biased=lambda x, y: x.expanding(min_periods=min_periods).cov(
344363
y, ddof=0
345364
),
346-
var_debiasing_factors=lambda x: (
347-
x.expanding().count()
348-
/ (x.expanding().count() - 1.0).replace(0.0, np.nan)
349-
),
350365
)
351366

352367
# test consistency between expanding_xyz() and either (a)

pandas/tests/window/moments/test_moments_rolling.py

Lines changed: 48 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -945,9 +945,7 @@ def test_rolling_consistency(self, window, min_periods, center):
945945
)
946946

947947
# test consistency between different rolling_* moments
948-
self._test_moments_consistency(
949-
min_periods=min_periods,
950-
count=lambda x: (x.rolling(window=window, center=center).count()),
948+
self._test_moments_consistency_mock_mean(
951949
mean=lambda x: (
952950
x.rolling(
953951
window=window, min_periods=min_periods, center=center
@@ -962,6 +960,53 @@ def test_rolling_consistency(self, window, min_periods, center):
962960
).count()
963961
)
964962
),
963+
)
964+
965+
self._test_moments_consistency_is_constant(
966+
min_periods=min_periods,
967+
count=lambda x: (x.rolling(window=window, center=center).count()),
968+
mean=lambda x: (
969+
x.rolling(
970+
window=window, min_periods=min_periods, center=center
971+
).mean()
972+
),
973+
corr=lambda x, y: (
974+
x.rolling(
975+
window=window, min_periods=min_periods, center=center
976+
).corr(y)
977+
),
978+
)
979+
980+
self._test_moments_consistency_var_debiasing_factors(
981+
var_unbiased=lambda x: (
982+
x.rolling(
983+
window=window, min_periods=min_periods, center=center
984+
).var()
985+
),
986+
var_biased=lambda x: (
987+
x.rolling(
988+
window=window, min_periods=min_periods, center=center
989+
).var(ddof=0)
990+
),
991+
var_debiasing_factors=lambda x: (
992+
x.rolling(window=window, center=center)
993+
.count()
994+
.divide(
995+
(x.rolling(window=window, center=center).count() - 1.0).replace(
996+
0.0, np.nan
997+
)
998+
)
999+
),
1000+
)
1001+
1002+
self._test_moments_consistency(
1003+
min_periods=min_periods,
1004+
count=lambda x: (x.rolling(window=window, center=center).count()),
1005+
mean=lambda x: (
1006+
x.rolling(
1007+
window=window, min_periods=min_periods, center=center
1008+
).mean()
1009+
),
9651010
corr=lambda x, y: (
9661011
x.rolling(
9671012
window=window, min_periods=min_periods, center=center
@@ -997,15 +1042,6 @@ def test_rolling_consistency(self, window, min_periods, center):
9971042
window=window, min_periods=min_periods, center=center
9981043
).cov(y, ddof=0)
9991044
),
1000-
var_debiasing_factors=lambda x: (
1001-
x.rolling(window=window, center=center)
1002-
.count()
1003-
.divide(
1004-
(x.rolling(window=window, center=center).count() - 1.0).replace(
1005-
0.0, np.nan
1006-
)
1007-
)
1008-
),
10091045
)
10101046

10111047
# test consistency between rolling_xyz() and either (a)

0 commit comments

Comments
 (0)