From 3684afea01096496d6a59293de6310b7fec32f52 Mon Sep 17 00:00:00 2001 From: Jeremy Schendel Date: Tue, 31 Dec 2019 20:32:09 -0700 Subject: [PATCH 1/3] CLN: Remove int32 and float32 dtypes from IntervalTree --- pandas/_libs/intervaltree.pxi.in | 5 +---- .../indexes/interval/test_interval_tree.py | 17 ++++++----------- 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/pandas/_libs/intervaltree.pxi.in b/pandas/_libs/intervaltree.pxi.in index 316c9e5b7e5f0..d09413bfa5210 100644 --- a/pandas/_libs/intervaltree.pxi.in +++ b/pandas/_libs/intervaltree.pxi.in @@ -8,14 +8,11 @@ from pandas._libs.algos import is_monotonic ctypedef fused int_scalar_t: int64_t - int32_t float64_t - float32_t ctypedef fused uint_scalar_t: uint64_t float64_t - float32_t ctypedef fused scalar_t: int_scalar_t @@ -212,7 +209,7 @@ cdef sort_values_and_indices(all_values, all_indices, subset): {{py: nodes = [] -for dtype in ['float32', 'float64', 'int32', 'int64', 'uint64']: +for dtype in ['float64', 'int64', 'uint64']: for closed, cmp_left, cmp_right in [ ('left', '<=', '<'), ('right', '<', '<='), diff --git a/pandas/tests/indexes/interval/test_interval_tree.py b/pandas/tests/indexes/interval/test_interval_tree.py index 695a98777eadb..111acd4cbde0a 100644 --- a/pandas/tests/indexes/interval/test_interval_tree.py +++ b/pandas/tests/indexes/interval/test_interval_tree.py @@ -20,9 +20,7 @@ def skipif_32bit(param): return pytest.param(param, marks=marks) -@pytest.fixture( - scope="class", params=["int32", "int64", "float32", "float64", "uint64"] -) +@pytest.fixture(scope="class", params=["int64", "float64", "uint64"]) def dtype(request): return request.param @@ -39,12 +37,9 @@ def leaf_size(request): @pytest.fixture( params=[ np.arange(5, dtype="int64"), - np.arange(5, dtype="int32"), np.arange(5, dtype="uint64"), np.arange(5, dtype="float64"), - np.arange(5, dtype="float32"), np.array([0, 1, 2, 3, 4, np.nan], dtype="float64"), - np.array([0, 1, 2, 3, 4, np.nan], dtype="float32"), ] ) def tree(request, leaf_size): @@ -146,10 +141,10 @@ def test_get_indexer_closed(self, closed, leaf_size): @pytest.mark.parametrize( "left, right, expected", [ - (np.array([0, 1, 4]), np.array([2, 3, 5]), True), - (np.array([0, 1, 2]), np.array([5, 4, 3]), True), + (np.array([0, 1, 4], dtype="int64"), np.array([2, 3, 5]), True), + (np.array([0, 1, 2], dtype="int64"), np.array([5, 4, 3]), True), (np.array([0, 1, np.nan]), np.array([5, 4, np.nan]), True), - (np.array([0, 2, 4]), np.array([1, 3, 5]), False), + (np.array([0, 2, 4], dtype="int64"), np.array([1, 3, 5]), False), (np.array([0, 2, np.nan]), np.array([1, 3, np.nan]), False), ], ) @@ -164,7 +159,7 @@ def test_is_overlapping(self, closed, order, left, right, expected): def test_is_overlapping_endpoints(self, closed, order): """shared endpoints are marked as overlapping""" # GH 23309 - left, right = np.arange(3), np.arange(1, 4) + left, right = np.arange(3, dtype="int64"), np.arange(1, 4) tree = IntervalTree(left[order], right[order], closed=closed) result = tree.is_overlapping expected = closed == "both" @@ -187,7 +182,7 @@ def test_is_overlapping_trivial(self, closed, left, right): @pytest.mark.skipif(compat.is_platform_32bit(), reason="GH 23440") def test_construction_overflow(self): # GH 25485 - left, right = np.arange(101), [np.iinfo(np.int64).max] * 101 + left, right = np.arange(101, dtype="int64"), [np.iinfo(np.int64).max] * 101 tree = IntervalTree(left, right) # pivot should be average of left/right medians From 31a6dd278b03632332e5235d44a974c15ab1d894 Mon Sep 17 00:00:00 2001 From: Jeremy Schendel Date: Wed, 1 Jan 2020 09:27:41 -0700 Subject: [PATCH 2/3] ensure int64 in tests --- pandas/tests/indexes/interval/test_interval_tree.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandas/tests/indexes/interval/test_interval_tree.py b/pandas/tests/indexes/interval/test_interval_tree.py index 111acd4cbde0a..fca92538f1468 100644 --- a/pandas/tests/indexes/interval/test_interval_tree.py +++ b/pandas/tests/indexes/interval/test_interval_tree.py @@ -65,7 +65,7 @@ def test_get_indexer_overflow(self, dtype, target_value): left, right = np.array([0, 1], dtype=dtype), np.array([1, 2], dtype=dtype) tree = IntervalTree(left, right) - result = tree.get_indexer(np.array([target_value])) + result = tree.get_indexer(np.array([target_value], dtype="int64")) expected = np.array([-1], dtype="intp") tm.assert_numpy_array_equal(result, expected) @@ -94,7 +94,7 @@ def test_get_indexer_non_unique(self, tree): def test_get_indexer_non_unique_overflow(self, dtype, target_value): left, right = np.array([0, 2], dtype=dtype), np.array([1, 3], dtype=dtype) tree = IntervalTree(left, right) - target = np.array([target_value]) + target = np.array([target_value], dtype="int64") result_indexer, result_missing = tree.get_indexer_non_unique(target) expected_indexer = np.array([-1], dtype="intp") From e20f68bd129ca78f981ded95514fa997d8b17c3f Mon Sep 17 00:00:00 2001 From: Jeremy Schendel Date: Wed, 1 Jan 2020 10:16:02 -0700 Subject: [PATCH 3/3] correctly specify dtype --- .../tests/indexes/interval/test_interval_tree.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/pandas/tests/indexes/interval/test_interval_tree.py b/pandas/tests/indexes/interval/test_interval_tree.py index fca92538f1468..0a92192ee6a0f 100644 --- a/pandas/tests/indexes/interval/test_interval_tree.py +++ b/pandas/tests/indexes/interval/test_interval_tree.py @@ -59,13 +59,14 @@ def test_get_indexer(self, tree): tree.get_indexer(np.array([3.0])) @pytest.mark.parametrize( - "dtype, target_value", [("int64", 2 ** 63 + 1), ("uint64", -1)] + "dtype, target_value, target_dtype", + [("int64", 2 ** 63 + 1, "uint64"), ("uint64", -1, "int64")], ) - def test_get_indexer_overflow(self, dtype, target_value): + def test_get_indexer_overflow(self, dtype, target_value, target_dtype): left, right = np.array([0, 1], dtype=dtype), np.array([1, 2], dtype=dtype) tree = IntervalTree(left, right) - result = tree.get_indexer(np.array([target_value], dtype="int64")) + result = tree.get_indexer(np.array([target_value], dtype=target_dtype)) expected = np.array([-1], dtype="intp") tm.assert_numpy_array_equal(result, expected) @@ -89,12 +90,13 @@ def test_get_indexer_non_unique(self, tree): tm.assert_numpy_array_equal(result, expected) @pytest.mark.parametrize( - "dtype, target_value", [("int64", 2 ** 63 + 1), ("uint64", -1)] + "dtype, target_value, target_dtype", + [("int64", 2 ** 63 + 1, "uint64"), ("uint64", -1, "int64")], ) - def test_get_indexer_non_unique_overflow(self, dtype, target_value): + def test_get_indexer_non_unique_overflow(self, dtype, target_value, target_dtype): left, right = np.array([0, 2], dtype=dtype), np.array([1, 3], dtype=dtype) tree = IntervalTree(left, right) - target = np.array([target_value], dtype="int64") + target = np.array([target_value], dtype=target_dtype) result_indexer, result_missing = tree.get_indexer_non_unique(target) expected_indexer = np.array([-1], dtype="intp")