6
6
from pandas import (Interval , IntervalIndex , Index , isna ,
7
7
interval_range , Timestamp , Timedelta ,
8
8
compat , date_range , timedelta_range , DateOffset )
9
+ from pandas .compat import product , zip
9
10
from pandas .tseries .offsets import Day
10
11
from pandas ._libs .interval import IntervalTree
11
12
from pandas .tests .indexes .common import Base
@@ -25,31 +26,39 @@ def setup_method(self, method):
25
26
def create_index (self ):
26
27
return IntervalIndex .from_breaks (np .arange (10 ))
27
28
28
- def test_constructors (self ):
29
- expected = self .index
30
- actual = IntervalIndex .from_breaks (np .arange (3 ), closed = 'right' )
31
- assert expected .equals (actual )
29
+ @pytest .mark .parametrize ('closed, name' , product (
30
+ ['left' , 'right' , 'both' , 'neither' ], [None , 'foo' ]))
31
+ def test_constructors (self , closed , name ):
32
+ left , right = Index ([0 , 1 , 2 , 3 ]), Index ([1 , 2 , 3 , 4 ])
33
+ ivs = [Interval (l , r , closed = closed ) for l , r in zip (left , right )]
34
+ expected = IntervalIndex ._simple_new (
35
+ left = left , right = right , closed = closed , name = name )
32
36
33
- alternate = IntervalIndex . from_breaks ( np . arange ( 3 ), closed = 'left' )
34
- assert not expected . equals ( alternate )
37
+ result = IntervalIndex ( ivs , name = name )
38
+ tm . assert_index_equal ( result , expected )
35
39
36
- actual = IntervalIndex .from_intervals ([ Interval ( 0 , 1 ), Interval ( 1 , 2 )] )
37
- assert expected . equals ( actual )
40
+ result = IntervalIndex .from_intervals (ivs , name = name )
41
+ tm . assert_index_equal ( result , expected )
38
42
39
- actual = IntervalIndex ([Interval (0 , 1 ), Interval (1 , 2 )])
40
- assert expected .equals (actual )
43
+ result = IntervalIndex .from_breaks (
44
+ np .arange (5 ), closed = closed , name = name )
45
+ tm .assert_index_equal (result , expected )
41
46
42
- actual = IntervalIndex .from_arrays (np . arange ( 2 ), np . arange ( 2 ) + 1 ,
43
- closed = 'right' )
44
- assert expected . equals ( actual )
47
+ result = IntervalIndex .from_arrays (
48
+ left . values , right . values , closed = closed , name = name )
49
+ tm . assert_index_equal ( result , expected )
45
50
46
- actual = Index ([ Interval ( 0 , 1 ), Interval ( 1 , 2 )])
47
- assert isinstance ( actual , IntervalIndex )
48
- assert expected . equals ( actual )
51
+ result = IntervalIndex . from_tuples (
52
+ zip ( left , right ), closed = closed , name = name )
53
+ tm . assert_index_equal ( result , expected )
49
54
50
- actual = Index (expected )
51
- assert isinstance (actual , IntervalIndex )
52
- assert expected .equals (actual )
55
+ result = Index (ivs , name = name )
56
+ assert isinstance (result , IntervalIndex )
57
+ tm .assert_index_equal (result , expected )
58
+
59
+ # idempotent
60
+ tm .assert_index_equal (IntervalIndex (expected ), expected )
61
+ tm .assert_index_equal (Index (expected ), expected )
53
62
54
63
def test_constructors_other (self ):
55
64
@@ -165,13 +174,16 @@ def test_with_nans(self):
165
174
tm .assert_numpy_array_equal (index .isna (),
166
175
np .array ([False , True , False ]))
167
176
168
- def test_copy (self ):
169
- actual = self .index .copy ()
170
- assert actual .equals (self .index )
177
+ @pytest .mark .parametrize ('closed' , ['left' , 'right' , 'both' , 'neither' ])
178
+ def test_copy (self , closed ):
179
+ expected = IntervalIndex .from_breaks (np .arange (5 ), closed = closed )
180
+
181
+ result = expected .copy ()
182
+ assert result .equals (expected )
171
183
172
- actual = self . index .copy (deep = True )
173
- assert actual .equals (self . index )
174
- assert actual .left is not self . index .left
184
+ result = expected .copy (deep = True )
185
+ assert result .equals (expected )
186
+ assert result .left is not expected .left
175
187
176
188
def test_ensure_copied_data (self ):
177
189
# exercise the copy flag in the constructor
@@ -191,19 +203,31 @@ def test_ensure_copied_data(self):
191
203
tm .assert_numpy_array_equal (index .right .values , result .right .values ,
192
204
check_same = 'copy' )
193
205
194
- def test_equals (self ):
195
-
196
- idx = self .index
197
- assert idx .equals (idx )
198
- assert idx .equals (idx .copy ())
199
-
200
- assert not idx .equals (idx .astype (object ))
201
- assert not idx .equals (np .array (idx ))
202
- assert not idx .equals (list (idx ))
203
-
204
- assert not idx .equals ([1 , 2 ])
205
- assert not idx .equals (np .array ([1 , 2 ]))
206
- assert not idx .equals (pd .date_range ('20130101' , periods = 2 ))
206
+ @pytest .mark .parametrize ('closed' , ['left' , 'right' , 'both' , 'neither' ])
207
+ def test_equals (self , closed ):
208
+ expected = IntervalIndex .from_breaks (np .arange (5 ), closed = closed )
209
+ assert expected .equals (expected )
210
+ assert expected .equals (expected .copy ())
211
+
212
+ assert not expected .equals (expected .astype (object ))
213
+ assert not expected .equals (np .array (expected ))
214
+ assert not expected .equals (list (expected ))
215
+
216
+ assert not expected .equals ([1 , 2 ])
217
+ assert not expected .equals (np .array ([1 , 2 ]))
218
+ assert not expected .equals (pd .date_range ('20130101' , periods = 2 ))
219
+
220
+ expected_name1 = IntervalIndex .from_breaks (
221
+ np .arange (5 ), closed = closed , name = 'foo' )
222
+ expected_name2 = IntervalIndex .from_breaks (
223
+ np .arange (5 ), closed = closed , name = 'bar' )
224
+ assert expected .equals (expected_name1 )
225
+ assert expected_name1 .equals (expected_name2 )
226
+
227
+ for other_closed in {'left' , 'right' , 'both' , 'neither' } - {closed }:
228
+ expected_other_closed = IntervalIndex .from_breaks (
229
+ np .arange (5 ), closed = other_closed )
230
+ assert not expected .equals (expected_other_closed )
207
231
208
232
def test_astype (self ):
209
233
0 commit comments