Skip to content

Commit 0730cd6

Browse files
Rename, move and parametrize indexer test
Include some non-monotonic/overlapping IntervalIndex. This triggers another bug, due to the fact that self.get_loc(i) is called on an unexpected key.
1 parent 0a143f2 commit 0730cd6

File tree

2 files changed

+20
-10
lines changed

2 files changed

+20
-10
lines changed

pandas/core/indexes/interval.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -788,7 +788,10 @@ def get_loc(self, key, method=None):
788788
left, right = _get_interval_closed_bounds(key)
789789
return self._engine.get_loc_interval(left, right)
790790
else:
791-
return self._engine.get_loc(key)
791+
try:
792+
return self._engine.get_loc(key)
793+
except TypeError:
794+
raise KeyError('No engine for key {!r}'.format(key))
792795

793796
def get_value(self, series, key):
794797
if com.is_bool_indexer(key):
@@ -829,7 +832,8 @@ def get_indexer(self, target, method=None, limit=None, tolerance=None):
829832
except TypeError:
830833
# This is probably wrong
831834
# but not sure what I should do here
832-
return np.array([-1])
835+
#return np.array([-1])
836+
return np.repeat(np.int(-1), len(target))
833837

834838
start_plus_one = start + 1
835839
if not ((start_plus_one < stop).any()):
@@ -844,7 +848,13 @@ def get_indexer(self, target, method=None, limit=None, tolerance=None):
844848

845849
# non IntervalIndex
846850
else:
847-
indexer = np.concatenate([self.get_loc(i) for i in target])
851+
vals = []
852+
for i in target:
853+
try:
854+
vals.append(self.get_loc(i))
855+
except KeyError:
856+
vals.append(np.array([-1]))
857+
indexer = np.concatenate(vals)
848858

849859
return ensure_platform_int(indexer)
850860

pandas/tests/indexes/interval/test_interval.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -616,6 +616,13 @@ def test_get_indexer_length_one(self, item, closed):
616616
expected = np.array([0] * len(item), dtype='intp')
617617
tm.assert_numpy_array_equal(result, expected)
618618

619+
@pytest.mark.parametrize('index', [
620+
pd.interval_range(0, 1),
621+
pd.IntervalIndex.from_tuples([(1, 3), (2, 4), (0, 2)])
622+
])
623+
def test_get_indexer_errors(self, index):
624+
assert np.all(index.get_indexer(['gg']) == np.array([-1]))
625+
619626
# Make consistent with test_interval_new.py (see #16316, #16386)
620627
@pytest.mark.parametrize('arrays', [
621628
(date_range('20180101', periods=4), date_range('20180103', periods=4)),
@@ -886,13 +893,6 @@ def test_symmetric_difference(self, closed, sort):
886893
result = index.symmetric_difference(other, sort=sort)
887894
tm.assert_index_equal(result, expected)
888895

889-
def test_interval_range_get_indexer_with_different_input_type(self):
890-
# not sure about this one
891-
index = pd.interval_range(0, 1)
892-
# behaviour should be the same as Int64Index and return an
893-
# array with values of -1
894-
assert np.all(index.get_indexer(['gg']) == np.array([-1]))
895-
896896
@pytest.mark.parametrize('op_name', [
897897
'union', 'intersection', 'difference', 'symmetric_difference'])
898898
@pytest.mark.parametrize("sort", [None, False])

0 commit comments

Comments
 (0)