5
5
--------
6
6
tests.frame.test_cumulative
7
7
"""
8
- from itertools import product
9
8
10
9
import numpy as np
11
10
import pytest
12
11
13
12
import pandas as pd
14
13
import pandas ._testing as tm
15
14
15
+ methods = {
16
+ "cumsum" : np .cumsum ,
17
+ "cumprod" : np .cumprod ,
18
+ "cummin" : np .minimum .accumulate ,
19
+ "cummax" : np .maximum .accumulate ,
20
+ }
21
+
16
22
17
23
def _check_accum_op (name , series , check_dtype = True ):
18
24
func = getattr (np , name )
@@ -37,136 +43,88 @@ def test_cumsum(self, datetime_series):
37
43
def test_cumprod (self , datetime_series ):
38
44
_check_accum_op ("cumprod" , datetime_series )
39
45
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 ]
49
49
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 ) )
52
52
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 )
58
54
ts = datetime_series .copy ()
59
55
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 ())
62
58
63
59
result .index = result .index ._with_freq (None )
64
60
tm .assert_series_equal (result , expected )
65
61
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 )
80
80
tm .assert_series_equal (expected , result )
81
81
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 )
88
85
tm .assert_series_equal (expected , result )
89
86
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" ]
96
89
)
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 )
104
92
tm .assert_series_equal (expected , result )
105
93
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" ]
110
96
)
111
- result = s .cummax (skipna = False )
97
+ expected = pd .Series (exp_tdi + ts )
98
+ result = ser .cummin (skipna = False )
112
99
tm .assert_series_equal (expected , result )
113
100
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
116
104
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 ))
122
107
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 ]
128
111
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 )
131
114
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 )()
137
116
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 )
143
118
144
- def test_cummethods_bool (self ):
145
- # GH#6270
119
+ def test_cummethods_bool_in_object_dtype (self ):
146
120
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 ])
164
122
cse = pd .Series ([0 , 1 , np .nan , 1 ], dtype = object )
165
123
cpe = pd .Series ([False , 0 , np .nan , 0 ])
166
124
cmin = pd .Series ([False , False , np .nan , False ])
167
125
cmax = pd .Series ([False , True , np .nan , True ])
168
126
expecteds = {"cumsum" : cse , "cumprod" : cpe , "cummin" : cmin , "cummax" : cmax }
169
127
170
128
for method in methods :
171
- res = getattr (e , method )()
129
+ res = getattr (ser , method )()
172
130
tm .assert_series_equal (res , expecteds [method ])
0 commit comments