Skip to content

Commit cd228cc

Browse files
committed
Move setops tests to test_setops.py and add two tests
1 parent 7e9b939 commit cd228cc

File tree

2 files changed

+162
-131
lines changed

2 files changed

+162
-131
lines changed

pandas/tests/indexes/interval/test_interval.py

-131
Original file line numberDiff line numberDiff line change
@@ -797,137 +797,6 @@ def test_non_contiguous(self, closed):
797797

798798
assert 1.5 not in index
799799

800-
@pytest.mark.parametrize("sort", [None, False])
801-
def test_union(self, closed, sort):
802-
index = self.create_index(closed=closed)
803-
other = IntervalIndex.from_breaks(range(5, 13), closed=closed)
804-
805-
expected = IntervalIndex.from_breaks(range(13), closed=closed)
806-
result = index[::-1].union(other, sort=sort)
807-
if sort is None:
808-
tm.assert_index_equal(result, expected)
809-
assert tm.equalContents(result, expected)
810-
811-
result = other[::-1].union(index, sort=sort)
812-
if sort is None:
813-
tm.assert_index_equal(result, expected)
814-
assert tm.equalContents(result, expected)
815-
816-
tm.assert_index_equal(index.union(index, sort=sort), index)
817-
tm.assert_index_equal(index.union(index[:1], sort=sort), index)
818-
819-
# GH 19101: empty result, same dtype
820-
index = IntervalIndex(np.array([], dtype='int64'), closed=closed)
821-
result = index.union(index, sort=sort)
822-
tm.assert_index_equal(result, index)
823-
824-
# GH 19101: empty result, different dtypes
825-
other = IntervalIndex(np.array([], dtype='float64'), closed=closed)
826-
result = index.union(other, sort=sort)
827-
tm.assert_index_equal(result, index)
828-
829-
@pytest.mark.parametrize("sort", [None, False])
830-
def test_intersection(self, closed, sort):
831-
index = self.create_index(closed=closed)
832-
other = IntervalIndex.from_breaks(range(5, 13), closed=closed)
833-
834-
expected = IntervalIndex.from_breaks(range(5, 11), closed=closed)
835-
result = index[::-1].intersection(other, sort=sort)
836-
if sort is None:
837-
tm.assert_index_equal(result, expected)
838-
assert tm.equalContents(result, expected)
839-
840-
result = other[::-1].intersection(index, sort=sort)
841-
if sort is None:
842-
tm.assert_index_equal(result, expected)
843-
assert tm.equalContents(result, expected)
844-
845-
tm.assert_index_equal(index.intersection(index, sort=sort), index)
846-
847-
# GH 19101: empty result, same dtype
848-
other = IntervalIndex.from_breaks(range(300, 314), closed=closed)
849-
expected = IntervalIndex(np.array([], dtype='int64'), closed=closed)
850-
result = index.intersection(other, sort=sort)
851-
tm.assert_index_equal(result, expected)
852-
853-
# GH 19101: empty result, different dtypes
854-
breaks = np.arange(300, 314, dtype='float64')
855-
other = IntervalIndex.from_breaks(breaks, closed=closed)
856-
result = index.intersection(other, sort=sort)
857-
tm.assert_index_equal(result, expected)
858-
859-
@pytest.mark.parametrize("sort", [None, False])
860-
def test_difference(self, closed, sort):
861-
index = IntervalIndex.from_arrays([1, 0, 3, 2],
862-
[1, 2, 3, 4],
863-
closed=closed)
864-
result = index.difference(index[:1], sort=sort)
865-
expected = index[1:]
866-
if sort is None:
867-
expected = expected.sort_values()
868-
tm.assert_index_equal(result, expected)
869-
870-
# GH 19101: empty result, same dtype
871-
result = index.difference(index, sort=sort)
872-
expected = IntervalIndex(np.array([], dtype='int64'), closed=closed)
873-
tm.assert_index_equal(result, expected)
874-
875-
# GH 19101: empty result, different dtypes
876-
other = IntervalIndex.from_arrays(index.left.astype('float64'),
877-
index.right, closed=closed)
878-
result = index.difference(other, sort=sort)
879-
tm.assert_index_equal(result, expected)
880-
881-
@pytest.mark.parametrize("sort", [None, False])
882-
def test_symmetric_difference(self, closed, sort):
883-
index = self.create_index(closed=closed)
884-
result = index[1:].symmetric_difference(index[:-1], sort=sort)
885-
expected = IntervalIndex([index[0], index[-1]])
886-
if sort is None:
887-
tm.assert_index_equal(result, expected)
888-
assert tm.equalContents(result, expected)
889-
890-
# GH 19101: empty result, same dtype
891-
result = index.symmetric_difference(index, sort=sort)
892-
expected = IntervalIndex(np.array([], dtype='int64'), closed=closed)
893-
if sort is None:
894-
tm.assert_index_equal(result, expected)
895-
assert tm.equalContents(result, expected)
896-
897-
# GH 19101: empty result, different dtypes
898-
other = IntervalIndex.from_arrays(index.left.astype('float64'),
899-
index.right, closed=closed)
900-
result = index.symmetric_difference(other, sort=sort)
901-
tm.assert_index_equal(result, expected)
902-
903-
@pytest.mark.parametrize('op_name', [
904-
'union', 'intersection', 'difference', 'symmetric_difference'])
905-
@pytest.mark.parametrize("sort", [None, False])
906-
def test_set_operation_errors(self, closed, op_name, sort):
907-
index = self.create_index(closed=closed)
908-
set_op = getattr(index, op_name)
909-
910-
# non-IntervalIndex
911-
msg = ('the other index needs to be an IntervalIndex too, but '
912-
'was type Int64Index')
913-
with pytest.raises(TypeError, match=msg):
914-
set_op(Index([1, 2, 3]), sort=sort)
915-
916-
# mixed closed
917-
msg = ('can only do set operations between two IntervalIndex objects '
918-
'that are closed on the same side')
919-
for other_closed in {'right', 'left', 'both', 'neither'} - {closed}:
920-
other = self.create_index(closed=other_closed)
921-
with pytest.raises(ValueError, match=msg):
922-
set_op(other, sort=sort)
923-
924-
# GH 19016: incompatible dtypes
925-
other = interval_range(Timestamp('20180101'), periods=9, closed=closed)
926-
msg = ('can only do {op} between two IntervalIndex objects that have '
927-
'compatible dtypes').format(op=op_name)
928-
with pytest.raises(TypeError, match=msg):
929-
set_op(other, sort=sort)
930-
931800
def test_isin(self, closed):
932801
index = self.create_index(closed=closed)
933802

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
import numpy as np
2+
import pytest
3+
4+
5+
from pandas import Index, IntervalIndex, Timestamp, interval_range
6+
import pandas.util.testing as tm
7+
8+
9+
@pytest.fixture(scope='class', params=[None, 'foo'])
10+
def name(request):
11+
return request.param
12+
13+
14+
class TestIntervalIndex:
15+
16+
def create_index(self, closed='right'):
17+
return IntervalIndex.from_breaks(range(11), closed=closed)
18+
19+
@pytest.mark.parametrize("sort", [None, False])
20+
def test_union(self, closed, sort):
21+
index = self.create_index(closed=closed)
22+
other = IntervalIndex.from_breaks(range(5, 13), closed=closed)
23+
24+
expected = IntervalIndex.from_breaks(range(13), closed=closed)
25+
result = index[::-1].union(other, sort=sort)
26+
if sort is None:
27+
tm.assert_index_equal(result, expected)
28+
assert tm.equalContents(result, expected)
29+
30+
result = other[::-1].union(index, sort=sort)
31+
if sort is None:
32+
tm.assert_index_equal(result, expected)
33+
assert tm.equalContents(result, expected)
34+
35+
tm.assert_index_equal(index.union(index, sort=sort), index)
36+
tm.assert_index_equal(index.union(index[:1], sort=sort), index)
37+
38+
# GH 19101: empty result, same dtype
39+
index = IntervalIndex(np.array([], dtype='int64'), closed=closed)
40+
result = index.union(index, sort=sort)
41+
tm.assert_index_equal(result, index)
42+
43+
# GH 19101: empty result, different dtypes
44+
other = IntervalIndex(np.array([], dtype='float64'), closed=closed)
45+
result = index.union(other, sort=sort)
46+
tm.assert_index_equal(result, index)
47+
48+
@pytest.mark.parametrize("sort", [None, False])
49+
def test_intersection(self, closed, sort):
50+
index = self.create_index(closed=closed)
51+
other = IntervalIndex.from_breaks(range(5, 13), closed=closed)
52+
53+
expected = IntervalIndex.from_breaks(range(5, 11), closed=closed)
54+
result = index[::-1].intersection(other, sort=sort)
55+
if sort is None:
56+
tm.assert_index_equal(result, expected)
57+
assert tm.equalContents(result, expected)
58+
59+
result = other[::-1].intersection(index, sort=sort)
60+
if sort is None:
61+
tm.assert_index_equal(result, expected)
62+
assert tm.equalContents(result, expected)
63+
64+
tm.assert_index_equal(index.intersection(index, sort=sort), index)
65+
66+
# GH 19101: empty result, same dtype
67+
other = IntervalIndex.from_breaks(range(300, 314), closed=closed)
68+
expected = IntervalIndex(np.array([], dtype='int64'), closed=closed)
69+
result = index.intersection(other, sort=sort)
70+
tm.assert_index_equal(result, expected)
71+
72+
# GH 19101: empty result, different dtypes
73+
breaks = np.arange(300, 314, dtype='float64')
74+
other = IntervalIndex.from_breaks(breaks, closed=closed)
75+
result = index.intersection(other, sort=sort)
76+
tm.assert_index_equal(result, expected)
77+
78+
# GH 26225: nested intervals
79+
index = IntervalIndex.from_tuples([(1, 2), (1, 3), (1, 4), (0, 2)])
80+
other = IntervalIndex.from_tuples([(1, 2), (1, 3)])
81+
expected = IntervalIndex.from_tuples([(1, 2), (1, 3)])
82+
result = index.intersection(other)
83+
tm.assert_index_equal(result, expected)
84+
85+
# GH 26225: duplicate element
86+
index = IntervalIndex.from_tuples([(1, 2), (1, 2), (2, 3), (3, 4)])
87+
other = IntervalIndex.from_tuples([(1, 2), (2, 3)])
88+
expected = IntervalIndex.from_tuples([(1, 2), (1, 2), (2, 3)])
89+
result = index.intersection(other)
90+
tm.assert_index_equal(result, expected)
91+
92+
@pytest.mark.parametrize("sort", [None, False])
93+
def test_difference(self, closed, sort):
94+
index = IntervalIndex.from_arrays([1, 0, 3, 2],
95+
[1, 2, 3, 4],
96+
closed=closed)
97+
result = index.difference(index[:1], sort=sort)
98+
expected = index[1:]
99+
if sort is None:
100+
expected = expected.sort_values()
101+
tm.assert_index_equal(result, expected)
102+
103+
# GH 19101: empty result, same dtype
104+
result = index.difference(index, sort=sort)
105+
expected = IntervalIndex(np.array([], dtype='int64'), closed=closed)
106+
tm.assert_index_equal(result, expected)
107+
108+
# GH 19101: empty result, different dtypes
109+
other = IntervalIndex.from_arrays(index.left.astype('float64'),
110+
index.right, closed=closed)
111+
result = index.difference(other, sort=sort)
112+
tm.assert_index_equal(result, expected)
113+
114+
@pytest.mark.parametrize("sort", [None, False])
115+
def test_symmetric_difference(self, closed, sort):
116+
index = self.create_index(closed=closed)
117+
result = index[1:].symmetric_difference(index[:-1], sort=sort)
118+
expected = IntervalIndex([index[0], index[-1]])
119+
if sort is None:
120+
tm.assert_index_equal(result, expected)
121+
assert tm.equalContents(result, expected)
122+
123+
# GH 19101: empty result, same dtype
124+
result = index.symmetric_difference(index, sort=sort)
125+
expected = IntervalIndex(np.array([], dtype='int64'), closed=closed)
126+
if sort is None:
127+
tm.assert_index_equal(result, expected)
128+
assert tm.equalContents(result, expected)
129+
130+
# GH 19101: empty result, different dtypes
131+
other = IntervalIndex.from_arrays(index.left.astype('float64'),
132+
index.right, closed=closed)
133+
result = index.symmetric_difference(other, sort=sort)
134+
tm.assert_index_equal(result, expected)
135+
136+
@pytest.mark.parametrize('op_name', [
137+
'union', 'intersection', 'difference', 'symmetric_difference'])
138+
@pytest.mark.parametrize("sort", [None, False])
139+
def test_set_operation_errors(self, closed, op_name, sort):
140+
index = self.create_index(closed=closed)
141+
set_op = getattr(index, op_name)
142+
143+
# non-IntervalIndex
144+
msg = ('the other index needs to be an IntervalIndex too, but '
145+
'was type Int64Index')
146+
with pytest.raises(TypeError, match=msg):
147+
set_op(Index([1, 2, 3]), sort=sort)
148+
149+
# mixed closed
150+
msg = ('can only do set operations between two IntervalIndex objects '
151+
'that are closed on the same side')
152+
for other_closed in {'right', 'left', 'both', 'neither'} - {closed}:
153+
other = self.create_index(closed=other_closed)
154+
with pytest.raises(ValueError, match=msg):
155+
set_op(other, sort=sort)
156+
157+
# GH 19016: incompatible dtypes
158+
other = interval_range(Timestamp('20180101'), periods=9, closed=closed)
159+
msg = ('can only do {op} between two IntervalIndex objects that have '
160+
'compatible dtypes').format(op=op_name)
161+
with pytest.raises(TypeError, match=msg):
162+
set_op(other, sort=sort)

0 commit comments

Comments
 (0)