Skip to content

Commit cb6f64b

Browse files
authored
TST/REF: collect indexing tests (#39661)
1 parent 5ddf7ac commit cb6f64b

File tree

13 files changed

+89
-91
lines changed

13 files changed

+89
-91
lines changed

pandas/core/indexes/base.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@
115115
)
116116

117117
if TYPE_CHECKING:
118-
from pandas import IntervalIndex, MultiIndex, RangeIndex, Series
118+
from pandas import CategoricalIndex, IntervalIndex, MultiIndex, RangeIndex, Series
119119
from pandas.core.indexes.datetimelike import DatetimeIndexOpsMixin
120120

121121

@@ -405,6 +405,7 @@ def _ensure_array(cls, data, dtype, copy: bool):
405405
data = data.copy()
406406
return data
407407

408+
@final
408409
@classmethod
409410
def _dtype_to_subclass(cls, dtype: DtypeObj):
410411
# Delay import for perf. https://github.com/pandas-dev/pandas/pull/31423
@@ -1013,8 +1014,8 @@ def _format_data(self, name=None) -> str_t:
10131014
if self.inferred_type == "string":
10141015
is_justify = False
10151016
elif self.inferred_type == "categorical":
1016-
# error: "Index" has no attribute "categories"
1017-
if is_object_dtype(self.categories): # type: ignore[attr-defined]
1017+
self = cast("CategoricalIndex", self)
1018+
if is_object_dtype(self.categories):
10181019
is_justify = False
10191020

10201021
return format_object_summary(
@@ -1075,6 +1076,7 @@ def _format_with_header(
10751076
result = trim_front(format_array(values, None, justify="left"))
10761077
return header + result
10771078

1079+
@final
10781080
def to_native_types(self, slicer=None, **kwargs):
10791081
"""
10801082
Format specified values of `self` and return them.

pandas/tests/arrays/sparse/test_arithmetics.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@ def test_mixed_array_float_int(self, kind, mix, all_arithmetic_functions, reques
357357

358358
if not np_version_under1p20:
359359
if op in [operator.floordiv, ops.rfloordiv] and mix:
360-
mark = pytest.mark.xfail(strict=True, reason="GH#38172")
360+
mark = pytest.mark.xfail(reason="GH#38172")
361361
request.node.add_marker(mark)
362362

363363
rdtype = "int64"

pandas/tests/base/test_conversion.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,13 +197,13 @@ def test_iter_box(self):
197197
pd.DatetimeIndex(["2017", "2018"]),
198198
np.ndarray,
199199
"datetime64[ns]",
200-
marks=[pytest.mark.xfail(reason="datetime _values", strict=True)],
200+
marks=[pytest.mark.xfail(reason="datetime _values")],
201201
),
202202
pytest.param(
203203
pd.TimedeltaIndex([10 ** 10]),
204204
np.ndarray,
205205
"m8[ns]",
206-
marks=[pytest.mark.xfail(reason="timedelta _values", strict=True)],
206+
marks=[pytest.mark.xfail(reason="timedelta _values")],
207207
),
208208
],
209209
)

pandas/tests/extension/test_boolean.py

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -106,16 +106,16 @@ def check_opname(self, s, op_name, other, exc=None):
106106
# overwriting to indicate ops don't raise an error
107107
super().check_opname(s, op_name, other, exc=None)
108108

109-
def _check_op(self, s, op, other, op_name, exc=NotImplementedError):
109+
def _check_op(self, obj, op, other, op_name, exc=NotImplementedError):
110110
if exc is None:
111111
if op_name in self.implements:
112112
msg = r"numpy boolean subtract"
113113
with pytest.raises(TypeError, match=msg):
114-
op(s, other)
114+
op(obj, other)
115115
return
116116

117-
result = op(s, other)
118-
expected = s.combine(other, op)
117+
result = op(obj, other)
118+
expected = self._combine(obj, other, op)
119119

120120
if op_name in (
121121
"__floordiv__",
@@ -130,27 +130,20 @@ def _check_op(self, s, op, other, op_name, exc=NotImplementedError):
130130
elif op_name in ("__truediv__", "__rtruediv__"):
131131
# combine with bools does not generate the correct result
132132
# (numpy behaviour for div is to regard the bools as numeric)
133-
expected = s.astype(float).combine(other, op).astype("Float64")
133+
expected = self._combine(obj.astype(float), other, op)
134+
expected = expected.astype("Float64")
134135
if op_name == "__rpow__":
135136
# for rpow, combine does not propagate NaN
136137
expected[result.isna()] = np.nan
137-
self.assert_series_equal(result, expected)
138+
self.assert_equal(result, expected)
138139
else:
139140
with pytest.raises(exc):
140-
op(s, other)
141+
op(obj, other)
141142

142143
def _check_divmod_op(self, s, op, other, exc=None):
143144
# override to not raise an error
144145
super()._check_divmod_op(s, op, other, None)
145146

146-
def test_arith_frame_with_scalar(self, data, all_arithmetic_operators, request):
147-
# frame & scalar
148-
op_name = all_arithmetic_operators
149-
if op_name not in self.implements:
150-
mark = pytest.mark.xfail(reason="_reduce needs implementation")
151-
request.node.add_marker(mark)
152-
super().test_arith_frame_with_scalar(data, all_arithmetic_operators)
153-
154147

155148
class TestComparisonOps(base.BaseComparisonOpsTests):
156149
def check_opname(self, s, op_name, other, exc=None):

pandas/tests/extension/test_sparse.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -450,7 +450,7 @@ def _compare_other(self, s, data, op_name, other):
450450

451451

452452
class TestPrinting(BaseSparseTests, base.BasePrintingTests):
453-
@pytest.mark.xfail(reason="Different repr", strict=True)
453+
@pytest.mark.xfail(reason="Different repr")
454454
def test_array_repr(self, data, size):
455455
super().test_array_repr(data, size)
456456

pandas/tests/frame/indexing/test_getitem.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
CategoricalDtype,
77
CategoricalIndex,
88
DataFrame,
9+
Index,
910
MultiIndex,
1011
Series,
1112
Timestamp,
@@ -174,3 +175,24 @@ def test_getitem_bool_mask_categorical_index(self):
174175
df4[df4.index < 2]
175176
with pytest.raises(TypeError, match=msg):
176177
df4[df4.index > 1]
178+
179+
180+
class TestGetitemSlice:
181+
def test_getitem_slice_float64(self, frame_or_series):
182+
values = np.arange(10.0, 50.0, 2)
183+
index = Index(values)
184+
185+
start, end = values[[5, 15]]
186+
187+
data = np.random.randn(20, 3)
188+
if frame_or_series is not DataFrame:
189+
data = data[:, 0]
190+
191+
obj = frame_or_series(data, index=index)
192+
193+
result = obj[start:end]
194+
expected = obj.iloc[5:16]
195+
tm.assert_equal(result, expected)
196+
197+
result = obj.loc[start:end]
198+
tm.assert_equal(result, expected)

pandas/tests/frame/methods/test_replace.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1587,7 +1587,6 @@ def test_replace_value_category_type(self):
15871587

15881588
@pytest.mark.xfail(
15891589
reason="category dtype gets changed to object type after replace, see #35268",
1590-
strict=True,
15911590
)
15921591
def test_replace_dict_category_type(self, input_category_df, expected_category_df):
15931592
"""

pandas/tests/indexing/test_indexing.py

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -60,16 +60,22 @@ def test_getitem_ndarray_3d(self, index, frame_or_series, indexer_sli):
6060
idxr = indexer_sli(obj)
6161
nd3 = np.random.randint(5, size=(2, 2, 2))
6262

63-
msg = "|".join(
64-
[
65-
r"Buffer has wrong number of dimensions \(expected 1, got 3\)",
66-
"Cannot index with multidimensional key",
67-
r"Wrong number of dimensions. values.ndim != ndim \[3 != 1\]",
68-
"Index data must be 1-dimensional",
69-
"positional indexers are out-of-bounds",
70-
"Indexing a MultiIndex with a multidimensional key is not implemented",
71-
]
72-
)
63+
msgs = []
64+
if frame_or_series is Series and indexer_sli in [tm.setitem, tm.iloc]:
65+
msgs.append(r"Wrong number of dimensions. values.ndim != ndim \[3 != 1\]")
66+
if frame_or_series is Series or indexer_sli is tm.iloc:
67+
msgs.append(r"Buffer has wrong number of dimensions \(expected 1, got 3\)")
68+
if indexer_sli is tm.loc or (
69+
frame_or_series is Series and indexer_sli is tm.setitem
70+
):
71+
msgs.append("Cannot index with multidimensional key")
72+
if frame_or_series is DataFrame and indexer_sli is tm.setitem:
73+
msgs.append("Index data must be 1-dimensional")
74+
if isinstance(index, pd.IntervalIndex) and indexer_sli is tm.iloc:
75+
msgs.append("Index data must be 1-dimensional")
76+
if len(index) == 0 or isinstance(index, pd.MultiIndex):
77+
msgs.append("positional indexers are out-of-bounds")
78+
msg = "|".join(msgs)
7379

7480
potential_errors = (IndexError, ValueError, NotImplementedError)
7581
with pytest.raises(potential_errors, match=msg):

pandas/tests/series/indexing/test_getitem.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,24 @@ def test_getitem_slice_float_raises(self, datetime_series):
222222
with pytest.raises(TypeError, match=msg.format(key=r"4\.5")):
223223
datetime_series[4.5:10.0]
224224

225+
def test_getitem_slice_bug(self):
226+
ser = Series(range(10), index=list(range(10)))
227+
result = ser[-12:]
228+
tm.assert_series_equal(result, ser)
229+
230+
result = ser[-7:]
231+
tm.assert_series_equal(result, ser[3:])
232+
233+
result = ser[:-12]
234+
tm.assert_series_equal(result, ser[:0])
235+
236+
def test_getitem_slice_integers(self):
237+
ser = Series(np.random.randn(8), index=[2, 4, 6, 8, 10, 12, 14, 16])
238+
239+
result = ser[:4]
240+
expected = Series(ser.values[:4], index=[2, 4, 6, 8])
241+
tm.assert_series_equal(result, expected)
242+
225243

226244
class TestSeriesGetitemListLike:
227245
@pytest.mark.parametrize("box", [list, np.array, Index, pd.Series])

pandas/tests/series/indexing/test_numeric.py

Lines changed: 0 additions & 55 deletions
This file was deleted.

pandas/tests/series/indexing/test_setitem.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,21 @@ def test_setitem_slice_float_raises(self, datetime_series):
113113
with pytest.raises(TypeError, match=msg.format(key=r"4\.5")):
114114
datetime_series[4.5:10.0] = 0
115115

116+
def test_setitem_slice(self):
117+
ser = Series(range(10), index=list(range(10)))
118+
ser[-12:] = 0
119+
assert (ser == 0).all()
120+
121+
ser[:-12] = 5
122+
assert (ser == 0).all()
123+
124+
def test_setitem_slice_integers(self):
125+
ser = Series(np.random.randn(8), index=[2, 4, 6, 8, 10, 12, 14, 16])
126+
127+
ser[:4] = 0
128+
assert (ser[:4] == 0).all()
129+
assert not (ser[4:] == 0).any()
130+
116131

117132
class TestSetitemBooleanMask:
118133
def test_setitem_boolean(self, string_series):

pandas/tests/series/test_api.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,6 @@ def test_attrs(self):
174174
@skip_if_no("jinja2")
175175
def test_inspect_getmembers(self):
176176
# GH38782
177-
ser = Series()
177+
ser = Series(dtype=object)
178178
with tm.assert_produces_warning(None):
179179
inspect.getmembers(ser)

pandas/tests/series/test_logical_ops.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -286,15 +286,13 @@ def test_reversed_xor_with_index_returns_index(self):
286286
marks=pytest.mark.xfail(
287287
reason="GH#22092 Index __and__ returns Index intersection",
288288
raises=AssertionError,
289-
strict=True,
290289
),
291290
),
292291
pytest.param(
293292
ops.ror_,
294293
marks=pytest.mark.xfail(
295294
reason="GH#22092 Index __or__ returns Index union",
296295
raises=AssertionError,
297-
strict=True,
298296
),
299297
),
300298
],

0 commit comments

Comments
 (0)