Skip to content

Commit 32ff424

Browse files
authored
TST: parametrize cumulative tests (#44214)
1 parent b2055b1 commit 32ff424

File tree

2 files changed

+79
-178
lines changed

2 files changed

+79
-178
lines changed

pandas/tests/frame/test_cumulative.py

Lines changed: 20 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"""
88

99
import numpy as np
10+
import pytest
1011

1112
from pandas import (
1213
DataFrame,
@@ -19,53 +20,22 @@ class TestDataFrameCumulativeOps:
1920
# ---------------------------------------------------------------------
2021
# Cumulative Operations - cumsum, cummax, ...
2122

22-
def test_cumsum_corner(self):
23-
dm = DataFrame(np.arange(20).reshape(4, 5), index=range(4), columns=range(5))
24-
# TODO(wesm): do something with this?
25-
result = dm.cumsum() # noqa
26-
27-
def test_cumsum(self, datetime_frame):
28-
datetime_frame.iloc[5:10, 0] = np.nan
29-
datetime_frame.iloc[10:15, 1] = np.nan
30-
datetime_frame.iloc[15:, 2] = np.nan
31-
32-
# axis = 0
33-
cumsum = datetime_frame.cumsum()
34-
expected = datetime_frame.apply(Series.cumsum)
35-
tm.assert_frame_equal(cumsum, expected)
36-
37-
# axis = 1
38-
cumsum = datetime_frame.cumsum(axis=1)
39-
expected = datetime_frame.apply(Series.cumsum, axis=1)
40-
tm.assert_frame_equal(cumsum, expected)
41-
42-
# works
23+
def test_cumulative_ops_smoke(self):
24+
# it works
4325
df = DataFrame({"A": np.arange(20)}, index=np.arange(20))
26+
df.cummax()
27+
df.cummin()
4428
df.cumsum()
4529

46-
# fix issue
47-
cumsum_xs = datetime_frame.cumsum(axis=1)
48-
assert np.shape(cumsum_xs) == np.shape(datetime_frame)
30+
dm = DataFrame(np.arange(20).reshape(4, 5), index=range(4), columns=range(5))
31+
# TODO(wesm): do something with this?
32+
dm.cumsum()
4933

50-
def test_cumprod(self, datetime_frame):
34+
def test_cumprod_smoke(self, datetime_frame):
5135
datetime_frame.iloc[5:10, 0] = np.nan
5236
datetime_frame.iloc[10:15, 1] = np.nan
5337
datetime_frame.iloc[15:, 2] = np.nan
5438

55-
# axis = 0
56-
cumprod = datetime_frame.cumprod()
57-
expected = datetime_frame.apply(Series.cumprod)
58-
tm.assert_frame_equal(cumprod, expected)
59-
60-
# axis = 1
61-
cumprod = datetime_frame.cumprod(axis=1)
62-
expected = datetime_frame.apply(Series.cumprod, axis=1)
63-
tm.assert_frame_equal(cumprod, expected)
64-
65-
# fix issue
66-
cumprod_xs = datetime_frame.cumprod(axis=1)
67-
assert np.shape(cumprod_xs) == np.shape(datetime_frame)
68-
6939
# ints
7040
df = datetime_frame.fillna(0).astype(int)
7141
df.cumprod(0)
@@ -76,53 +46,26 @@ def test_cumprod(self, datetime_frame):
7646
df.cumprod(0)
7747
df.cumprod(1)
7848

79-
def test_cummin(self, datetime_frame):
80-
datetime_frame.iloc[5:10, 0] = np.nan
81-
datetime_frame.iloc[10:15, 1] = np.nan
82-
datetime_frame.iloc[15:, 2] = np.nan
83-
84-
# axis = 0
85-
cummin = datetime_frame.cummin()
86-
expected = datetime_frame.apply(Series.cummin)
87-
tm.assert_frame_equal(cummin, expected)
88-
89-
# axis = 1
90-
cummin = datetime_frame.cummin(axis=1)
91-
expected = datetime_frame.apply(Series.cummin, axis=1)
92-
tm.assert_frame_equal(cummin, expected)
93-
94-
# it works
95-
df = DataFrame({"A": np.arange(20)}, index=np.arange(20))
96-
df.cummin()
97-
98-
# fix issue
99-
cummin_xs = datetime_frame.cummin(axis=1)
100-
assert np.shape(cummin_xs) == np.shape(datetime_frame)
101-
102-
def test_cummax(self, datetime_frame):
49+
@pytest.mark.parametrize("method", ["cumsum", "cumprod", "cummin", "cummax"])
50+
def test_cumulative_ops_match_series_apply(self, datetime_frame, method):
10351
datetime_frame.iloc[5:10, 0] = np.nan
10452
datetime_frame.iloc[10:15, 1] = np.nan
10553
datetime_frame.iloc[15:, 2] = np.nan
10654

10755
# axis = 0
108-
cummax = datetime_frame.cummax()
109-
expected = datetime_frame.apply(Series.cummax)
110-
tm.assert_frame_equal(cummax, expected)
56+
result = getattr(datetime_frame, method)()
57+
expected = datetime_frame.apply(getattr(Series, method))
58+
tm.assert_frame_equal(result, expected)
11159

11260
# axis = 1
113-
cummax = datetime_frame.cummax(axis=1)
114-
expected = datetime_frame.apply(Series.cummax, axis=1)
115-
tm.assert_frame_equal(cummax, expected)
116-
117-
# it works
118-
df = DataFrame({"A": np.arange(20)}, index=np.arange(20))
119-
df.cummax()
61+
result = getattr(datetime_frame, method)(axis=1)
62+
expected = datetime_frame.apply(getattr(Series, method), axis=1)
63+
tm.assert_frame_equal(result, expected)
12064

121-
# fix issue
122-
cummax_xs = datetime_frame.cummax(axis=1)
123-
assert np.shape(cummax_xs) == np.shape(datetime_frame)
65+
# fix issue TODO: GH ref?
66+
assert np.shape(result) == np.shape(datetime_frame)
12467

125-
def test_cumulative_ops_preserve_dtypes(self):
68+
def test_cumsum_preserve_dtypes(self):
12669
# GH#19296 dont incorrectly upcast to object
12770
df = DataFrame({"A": [1, 2, 3], "B": [1, 2, 3.0], "C": [True, False, False]})
12871

pandas/tests/series/test_cumulative.py

Lines changed: 59 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,20 @@
55
--------
66
tests.frame.test_cumulative
77
"""
8-
from itertools import product
98

109
import numpy as np
1110
import pytest
1211

1312
import pandas as pd
1413
import pandas._testing as tm
1514

15+
methods = {
16+
"cumsum": np.cumsum,
17+
"cumprod": np.cumprod,
18+
"cummin": np.minimum.accumulate,
19+
"cummax": np.maximum.accumulate,
20+
}
21+
1622

1723
def _check_accum_op(name, series, check_dtype=True):
1824
func = getattr(np, name)
@@ -37,136 +43,88 @@ def test_cumsum(self, datetime_series):
3743
def test_cumprod(self, datetime_series):
3844
_check_accum_op("cumprod", datetime_series)
3945

40-
def test_cummin(self, datetime_series):
41-
tm.assert_numpy_array_equal(
42-
datetime_series.cummin().values,
43-
np.minimum.accumulate(np.array(datetime_series)),
44-
)
45-
ts = datetime_series.copy()
46-
ts[::2] = np.NaN
47-
result = ts.cummin()[1::2]
48-
expected = np.minimum.accumulate(ts.dropna())
46+
@pytest.mark.parametrize("method", ["cummin", "cummax"])
47+
def test_cummin_cummax(self, datetime_series, method):
48+
ufunc = methods[method]
4949

50-
result.index = result.index._with_freq(None)
51-
tm.assert_series_equal(result, expected)
50+
result = getattr(datetime_series, method)().values
51+
expected = ufunc(np.array(datetime_series))
5252

53-
def test_cummax(self, datetime_series):
54-
tm.assert_numpy_array_equal(
55-
datetime_series.cummax().values,
56-
np.maximum.accumulate(np.array(datetime_series)),
57-
)
53+
tm.assert_numpy_array_equal(result, expected)
5854
ts = datetime_series.copy()
5955
ts[::2] = np.NaN
60-
result = ts.cummax()[1::2]
61-
expected = np.maximum.accumulate(ts.dropna())
56+
result = getattr(ts, method)()[1::2]
57+
expected = ufunc(ts.dropna())
6258

6359
result.index = result.index._with_freq(None)
6460
tm.assert_series_equal(result, expected)
6561

66-
@pytest.mark.parametrize("tz", [None, "US/Pacific"])
67-
def test_cummin_datetime64(self, tz):
68-
s = pd.Series(
69-
pd.to_datetime(
70-
["NaT", "2000-1-2", "NaT", "2000-1-1", "NaT", "2000-1-3"]
71-
).tz_localize(tz)
72-
)
73-
74-
expected = pd.Series(
75-
pd.to_datetime(
76-
["NaT", "2000-1-2", "NaT", "2000-1-1", "NaT", "2000-1-1"]
77-
).tz_localize(tz)
78-
)
79-
result = s.cummin(skipna=True)
62+
@pytest.mark.parametrize(
63+
"ts",
64+
[
65+
pd.Timedelta(0),
66+
pd.Timestamp("1999-12-31"),
67+
pd.Timestamp("1999-12-31").tz_localize("US/Pacific"),
68+
],
69+
)
70+
def test_cummin_cummax_datetimelike(self, ts):
71+
# with ts==pd.Timedelta(0), we are testing td64; with naive Timestamp
72+
# we are testing datetime64[ns]; with Timestamp[US/Pacific]
73+
# we are testing dt64tz
74+
tdi = pd.to_timedelta(["NaT", "2 days", "NaT", "1 days", "NaT", "3 days"])
75+
ser = pd.Series(tdi + ts)
76+
77+
exp_tdi = pd.to_timedelta(["NaT", "2 days", "NaT", "2 days", "NaT", "3 days"])
78+
expected = pd.Series(exp_tdi + ts)
79+
result = ser.cummax(skipna=True)
8080
tm.assert_series_equal(expected, result)
8181

82-
expected = pd.Series(
83-
pd.to_datetime(
84-
["NaT", "2000-1-2", "2000-1-2", "2000-1-1", "2000-1-1", "2000-1-1"]
85-
).tz_localize(tz)
86-
)
87-
result = s.cummin(skipna=False)
82+
exp_tdi = pd.to_timedelta(["NaT", "2 days", "NaT", "1 days", "NaT", "1 days"])
83+
expected = pd.Series(exp_tdi + ts)
84+
result = ser.cummin(skipna=True)
8885
tm.assert_series_equal(expected, result)
8986

90-
@pytest.mark.parametrize("tz", [None, "US/Pacific"])
91-
def test_cummax_datetime64(self, tz):
92-
s = pd.Series(
93-
pd.to_datetime(
94-
["NaT", "2000-1-2", "NaT", "2000-1-1", "NaT", "2000-1-3"]
95-
).tz_localize(tz)
87+
exp_tdi = pd.to_timedelta(
88+
["NaT", "2 days", "2 days", "2 days", "2 days", "3 days"]
9689
)
97-
98-
expected = pd.Series(
99-
pd.to_datetime(
100-
["NaT", "2000-1-2", "NaT", "2000-1-2", "NaT", "2000-1-3"]
101-
).tz_localize(tz)
102-
)
103-
result = s.cummax(skipna=True)
90+
expected = pd.Series(exp_tdi + ts)
91+
result = ser.cummax(skipna=False)
10492
tm.assert_series_equal(expected, result)
10593

106-
expected = pd.Series(
107-
pd.to_datetime(
108-
["NaT", "2000-1-2", "2000-1-2", "2000-1-2", "2000-1-2", "2000-1-3"]
109-
).tz_localize(tz)
94+
exp_tdi = pd.to_timedelta(
95+
["NaT", "2 days", "2 days", "1 days", "1 days", "1 days"]
11096
)
111-
result = s.cummax(skipna=False)
97+
expected = pd.Series(exp_tdi + ts)
98+
result = ser.cummin(skipna=False)
11299
tm.assert_series_equal(expected, result)
113100

114-
def test_cummin_timedelta64(self):
115-
s = pd.Series(pd.to_timedelta(["NaT", "2 min", "NaT", "1 min", "NaT", "3 min"]))
101+
def test_cummethods_bool(self):
102+
# GH#6270
103+
# checking Series method vs the ufunc applied to the values
116104

117-
expected = pd.Series(
118-
pd.to_timedelta(["NaT", "2 min", "NaT", "1 min", "NaT", "1 min"])
119-
)
120-
result = s.cummin(skipna=True)
121-
tm.assert_series_equal(expected, result)
105+
a = pd.Series([False, False, False, True, True, False, False])
106+
c = pd.Series([False] * len(a))
122107

123-
expected = pd.Series(
124-
pd.to_timedelta(["NaT", "2 min", "2 min", "1 min", "1 min", "1 min"])
125-
)
126-
result = s.cummin(skipna=False)
127-
tm.assert_series_equal(expected, result)
108+
for method in methods:
109+
for ser in [a, ~a, c, ~c]:
110+
ufunc = methods[method]
128111

129-
def test_cummax_timedelta64(self):
130-
s = pd.Series(pd.to_timedelta(["NaT", "2 min", "NaT", "1 min", "NaT", "3 min"]))
112+
exp_vals = ufunc(ser.values)
113+
expected = pd.Series(exp_vals)
131114

132-
expected = pd.Series(
133-
pd.to_timedelta(["NaT", "2 min", "NaT", "2 min", "NaT", "3 min"])
134-
)
135-
result = s.cummax(skipna=True)
136-
tm.assert_series_equal(expected, result)
115+
result = getattr(ser, method)()
137116

138-
expected = pd.Series(
139-
pd.to_timedelta(["NaT", "2 min", "2 min", "2 min", "2 min", "3 min"])
140-
)
141-
result = s.cummax(skipna=False)
142-
tm.assert_series_equal(expected, result)
117+
tm.assert_series_equal(result, expected)
143118

144-
def test_cummethods_bool(self):
145-
# GH#6270
119+
def test_cummethods_bool_in_object_dtype(self):
146120

147-
a = pd.Series([False, False, False, True, True, False, False])
148-
b = ~a
149-
c = pd.Series([False] * len(b))
150-
d = ~c
151-
methods = {
152-
"cumsum": np.cumsum,
153-
"cumprod": np.cumprod,
154-
"cummin": np.minimum.accumulate,
155-
"cummax": np.maximum.accumulate,
156-
}
157-
args = product((a, b, c, d), methods)
158-
for s, method in args:
159-
expected = pd.Series(methods[method](s.values))
160-
result = getattr(s, method)()
161-
tm.assert_series_equal(result, expected)
162-
163-
e = pd.Series([False, True, np.nan, False])
121+
ser = pd.Series([False, True, np.nan, False])
164122
cse = pd.Series([0, 1, np.nan, 1], dtype=object)
165123
cpe = pd.Series([False, 0, np.nan, 0])
166124
cmin = pd.Series([False, False, np.nan, False])
167125
cmax = pd.Series([False, True, np.nan, True])
168126
expecteds = {"cumsum": cse, "cumprod": cpe, "cummin": cmin, "cummax": cmax}
169127

170128
for method in methods:
171-
res = getattr(e, method)()
129+
res = getattr(ser, method)()
172130
tm.assert_series_equal(res, expecteds[method])

0 commit comments

Comments
 (0)