Skip to content

Commit c0e8044

Browse files
authored
CLN: follow-ups, whatsnew notes, use tm.get_obj (#44998)
1 parent 3bb9e62 commit c0e8044

28 files changed

+66
-117
lines changed

doc/source/whatsnew/v1.4.0.rst

+5-4
Original file line numberDiff line numberDiff line change
@@ -633,7 +633,7 @@ Datetimelike
633633
- Bug in adding a ``np.timedelta64`` object to a :class:`BusinessDay` or :class:`CustomBusinessDay` object incorrectly raising (:issue:`44532`)
634634
- Bug in :meth:`Index.insert` for inserting ``np.datetime64``, ``np.timedelta64`` or ``tuple`` into :class:`Index` with ``dtype='object'`` with negative loc adding ``None`` and replacing existing value (:issue:`44509`)
635635
- Bug in :meth:`Series.mode` with ``DatetimeTZDtype`` incorrectly returning timezone-naive and ``PeriodDtype`` incorrectly raising (:issue:`41927`)
636-
- Bug in :class:`DateOffset`` addition with :class:`Timestamp` where ``offset.nanoseconds`` would not be included in the result. (:issue:`43968`)
636+
- Bug in :class:`DateOffset`` addition with :class:`Timestamp` where ``offset.nanoseconds`` would not be included in the result. (:issue:`43968`,:issue:`36589`)
637637
-
638638

639639
Timedelta
@@ -845,15 +845,16 @@ Sparse
845845
ExtensionArray
846846
^^^^^^^^^^^^^^
847847
- Bug in :func:`array` failing to preserve :class:`PandasArray` (:issue:`43887`)
848-
- NumPy ufuncs ``np.abs``, ``np.positive``, ``np.negative`` now correctly preserve dtype when called on ExtensionArrays that implement ``__abs__, __pos__, __neg__``, respectively. In particular this is fixed for :class:`TimedeltaArray` (:issue:`43899`)
848+
- NumPy ufuncs ``np.abs``, ``np.positive``, ``np.negative`` now correctly preserve dtype when called on ExtensionArrays that implement ``__abs__, __pos__, __neg__``, respectively. In particular this is fixed for :class:`TimedeltaArray` (:issue:`43899`,:issue:`23316`)
849849
- NumPy ufuncs ``np.minimum.reduce`` and ``np.maximum.reduce`` now work correctly instead of raising ``NotImplementedError`` on :class:`Series` with ``IntegerDtype`` or ``FloatDtype`` (:issue:`43923`)
850850
- Avoid raising ``PerformanceWarning`` about fragmented DataFrame when using many columns with an extension dtype (:issue:`44098`)
851851
- Bug in :class:`IntegerArray` and :class:`FloatingArray` construction incorrectly coercing mismatched NA values (e.g. ``np.timedelta64("NaT")``) to numeric NA (:issue:`44514`)
852852
- Bug in :meth:`BooleanArray.__eq__` and :meth:`BooleanArray.__ne__` raising ``TypeError`` on comparison with an incompatible type (like a string). This caused :meth:`DataFrame.replace` to sometimes raise a ``TypeError`` if a nullable boolean column was included (:issue:`44499`)
853853
- Bug in :func:`array` incorrectly raising when passed a ``ndarray`` with ``float16`` dtype (:issue:`44715`)
854854
- Bug in calling ``np.sqrt`` on :class:`BooleanArray` returning a malformed :class:`FloatingArray` (:issue:`44715`)
855855
- Bug in :meth:`Series.where` with ``ExtensionDtype`` when ``other`` is a NA scalar incompatible with the series dtype (e.g. ``NaT`` with a numeric dtype) incorrectly casting to a compatible NA value (:issue:`44697`)
856-
- Fixed bug in :meth:`Series.replace` with ``FloatDtype``, ``string[python]``, or ``string[pyarrow]`` dtype not being preserved when possible (:issue:`33484`)
856+
- Fixed bug in :meth:`Series.replace` with ``FloatDtype``, ``string[python]``, or ``string[pyarrow]`` dtype not being preserved when possible (:issue:`33484`,:issue:`40732`,:issue:`31644`,:issue:`41215`,:issue:`25438`)
857+
-
857858

858859
Styler
859860
^^^^^^
@@ -874,7 +875,7 @@ Other
874875
- Bug in :meth:`RangeIndex.union` with another ``RangeIndex`` with matching (even) ``step`` and starts differing by strictly less than ``step / 2`` (:issue:`44019`)
875876
- Bug in :meth:`RangeIndex.difference` with ``sort=None`` and ``step<0`` failing to sort (:issue:`44085`)
876877
- Bug in :meth:`Series.to_frame` and :meth:`Index.to_frame` ignoring the ``name`` argument when ``name=None`` is explicitly passed (:issue:`44212`)
877-
- Bug in :meth:`Series.replace` and :meth:`DataFrame.replace` with ``value=None`` and ExtensionDtypes (:issue:`44270`)
878+
- Bug in :meth:`Series.replace` and :meth:`DataFrame.replace` with ``value=None`` and ExtensionDtypes (:issue:`44270`,:issue:`37899`)
878879
- Bug in :meth:`FloatingArray.equals` failing to consider two arrays equal if they contain ``np.nan`` values (:issue:`44382`)
879880
- Bug in :meth:`DataFrame.shift` with ``axis=1`` and ``ExtensionDtype`` columns incorrectly raising when an incompatible ``fill_value`` is passed (:issue:`44564`)
880881
- Bug in :meth:`DataFrame.diff` when passing a NumPy integer object instead of an ``int`` object (:issue:`44572`)

pandas/core/dtypes/common.py

+6-4
Original file line numberDiff line numberDiff line change
@@ -128,10 +128,12 @@ def ensure_python_int(value: int | np.integer) -> int:
128128
------
129129
TypeError: if the value isn't an int or can't be converted to one.
130130
"""
131-
if not is_scalar(value):
132-
raise TypeError(
133-
f"Value needs to be a scalar value, was type {type(value).__name__}"
134-
)
131+
if not (is_integer(value) or is_float(value)):
132+
if not is_scalar(value):
133+
raise TypeError(
134+
f"Value needs to be a scalar value, was type {type(value).__name__}"
135+
)
136+
raise TypeError(f"Wrong type {type(value)} for value {value}")
135137
try:
136138
new_value = int(value)
137139
assert new_value == value

pandas/core/indexes/range.py

+1-5
Original file line numberDiff line numberDiff line change
@@ -1041,11 +1041,7 @@ def _arith_method(self, other, op):
10411041
rstop = op(left.stop, right)
10421042

10431043
res_name = ops.get_op_result_name(self, other)
1044-
with warnings.catch_warnings():
1045-
warnings.simplefilter("ignore", DeprecationWarning)
1046-
# The constructor validation can lead to a DeprecationWarning
1047-
# from numpy, e.g. with RangeIndex + np.datetime64("now")
1048-
result = type(self)(rstart, rstop, rstep, name=res_name)
1044+
result = type(self)(rstart, rstop, rstep, name=res_name)
10491045

10501046
# for compat with numpy / Int64Index
10511047
# even if we can represent as a RangeIndex, return

pandas/tests/apply/test_frame_transform.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,7 @@ def test_transform_bad_dtype(op, frame_or_series, request):
141141
)
142142

143143
obj = DataFrame({"A": 3 * [object]}) # DataFrame that will fail on most transforms
144-
if frame_or_series is not DataFrame:
145-
obj = obj["A"]
144+
obj = tm.get_obj(obj, frame_or_series)
146145

147146
# tshift is deprecated
148147
warn = None if op != "tshift" else FutureWarning

pandas/tests/apply/test_invalid_arg.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -352,8 +352,7 @@ def test_transform_reducer_raises(all_reductions, frame_or_series, op_wrapper):
352352
op = op_wrapper(all_reductions)
353353

354354
obj = DataFrame({"A": [1, 2, 3]})
355-
if frame_or_series is not DataFrame:
356-
obj = obj["A"]
355+
obj = tm.get_obj(obj, frame_or_series)
357356

358357
msg = "Function did not transform"
359358
with pytest.raises(ValueError, match=msg):

pandas/tests/frame/indexing/test_mask.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,8 @@ def test_mask_pos_args_deprecation(self, frame_or_series):
9696
# https://github.com/pandas-dev/pandas/issues/41485
9797
obj = DataFrame({"a": range(5)})
9898
expected = DataFrame({"a": [-1, 1, -1, 3, -1]})
99-
if frame_or_series is Series:
100-
obj = obj["a"]
101-
expected = expected["a"]
99+
obj = tm.get_obj(obj, frame_or_series)
100+
expected = tm.get_obj(expected, frame_or_series)
102101

103102
cond = obj % 2 == 0
104103
msg = (

pandas/tests/frame/indexing/test_where.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -708,8 +708,7 @@ def test_where_interval_noop(self):
708708

709709
def test_where_try_cast_deprecated(frame_or_series):
710710
obj = DataFrame(np.random.randn(4, 3))
711-
if frame_or_series is not DataFrame:
712-
obj = obj[0]
711+
obj = tm.get_obj(obj, frame_or_series)
713712

714713
mask = obj > 0
715714

pandas/tests/frame/methods/test_append.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@
1515
class TestDataFrameAppend:
1616
def test_append_multiindex(self, multiindex_dataframe_random_data, frame_or_series):
1717
obj = multiindex_dataframe_random_data
18-
if frame_or_series is Series:
19-
obj = obj["A"]
18+
obj = tm.get_obj(obj, frame_or_series)
2019

2120
a = obj[:5]
2221
b = obj[5:]

pandas/tests/frame/methods/test_asfreq.py

+3-6
Original file line numberDiff line numberDiff line change
@@ -88,17 +88,15 @@ def test_asfreq_keep_index_name(self, frame_or_series):
8888
index_name = "bar"
8989
index = date_range("20130101", periods=20, name=index_name)
9090
obj = DataFrame(list(range(20)), columns=["foo"], index=index)
91-
if frame_or_series is Series:
92-
obj = obj["foo"]
91+
obj = tm.get_obj(obj, frame_or_series)
9392

9493
assert index_name == obj.index.name
9594
assert index_name == obj.asfreq("10D").index.name
9695

9796
def test_asfreq_ts(self, frame_or_series):
9897
index = period_range(freq="A", start="1/1/2001", end="12/31/2010")
9998
obj = DataFrame(np.random.randn(len(index), 3), index=index)
100-
if frame_or_series is Series:
101-
obj = obj[0]
99+
obj = tm.get_obj(obj, frame_or_series)
102100

103101
result = obj.asfreq("D", how="end")
104102
exp_index = index.asfreq("D", how="end")
@@ -115,8 +113,7 @@ def test_asfreq_resample_set_correct_freq(self, frame_or_series):
115113
# we test if .asfreq() and .resample() set the correct value for .freq
116114
dti = to_datetime(["2012-01-01", "2012-01-02", "2012-01-03"])
117115
obj = DataFrame({"col": [1, 2, 3]}, index=dti)
118-
if frame_or_series is Series:
119-
obj = obj["col"]
116+
obj = tm.get_obj(obj, frame_or_series)
120117

121118
# testing the settings before calling .asfreq() and .resample()
122119
assert obj.index.freq is None

pandas/tests/frame/methods/test_at_time.py

+4-8
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,7 @@ def test_localized_at_time(self, tzstr, frame_or_series):
3131
def test_at_time(self, frame_or_series):
3232
rng = date_range("1/1/2000", "1/5/2000", freq="5min")
3333
ts = DataFrame(np.random.randn(len(rng), 2), index=rng)
34-
if frame_or_series is not DataFrame:
35-
ts = ts[0]
34+
ts = tm.get_obj(ts, frame_or_series)
3635
rs = ts.at_time(rng[1])
3736
assert (rs.index.hour == rng[1].hour).all()
3837
assert (rs.index.minute == rng[1].minute).all()
@@ -46,8 +45,7 @@ def test_at_time_midnight(self, frame_or_series):
4645
# midnight, everything
4746
rng = date_range("1/1/2000", "1/31/2000")
4847
ts = DataFrame(np.random.randn(len(rng), 3), index=rng)
49-
if frame_or_series is not DataFrame:
50-
ts = ts[0]
48+
ts = tm.get_obj(ts, frame_or_series)
5149

5250
result = ts.at_time(time(0, 0))
5351
tm.assert_equal(result, ts)
@@ -56,8 +54,7 @@ def test_at_time_nonexistent(self, frame_or_series):
5654
# time doesn't exist
5755
rng = date_range("1/1/2012", freq="23Min", periods=384)
5856
ts = DataFrame(np.random.randn(len(rng)), rng)
59-
if frame_or_series is not DataFrame:
60-
ts = ts[0]
57+
ts = tm.get_obj(ts, frame_or_series)
6158
rs = ts.at_time("16:00")
6259
assert len(rs) == 0
6360

@@ -87,8 +84,7 @@ def test_at_time_tz(self):
8784
def test_at_time_raises(self, frame_or_series):
8885
# GH#20725
8986
obj = DataFrame([[1, 2, 3], [4, 5, 6]])
90-
if frame_or_series is not DataFrame:
91-
obj = obj[0]
87+
obj = tm.get_obj(obj, frame_or_series)
9288
msg = "Index must be DatetimeIndex"
9389
with pytest.raises(TypeError, match=msg): # index is not a DatetimeIndex
9490
obj.at_time("00:00")

pandas/tests/frame/methods/test_between_time.py

+6-12
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@ def test_between_time_formats(self, frame_or_series):
2323
# GH#11818
2424
rng = date_range("1/1/2000", "1/5/2000", freq="5min")
2525
ts = DataFrame(np.random.randn(len(rng), 2), index=rng)
26-
if frame_or_series is Series:
27-
ts = ts[0]
26+
ts = tm.get_obj(ts, frame_or_series)
2827

2928
strings = [
3029
("2:00", "2:30"),
@@ -62,8 +61,7 @@ def test_between_time_types(self, frame_or_series):
6261
# GH11818
6362
rng = date_range("1/1/2000", "1/5/2000", freq="5min")
6463
obj = DataFrame({"A": 0}, index=rng)
65-
if frame_or_series is Series:
66-
obj = obj["A"]
64+
obj = tm.get_obj(obj, frame_or_series)
6765

6866
msg = r"Cannot convert arg \[datetime\.datetime\(2010, 1, 2, 1, 0\)\] to a time"
6967
with pytest.raises(ValueError, match=msg):
@@ -72,8 +70,7 @@ def test_between_time_types(self, frame_or_series):
7270
def test_between_time(self, inclusive_endpoints_fixture, frame_or_series):
7371
rng = date_range("1/1/2000", "1/5/2000", freq="5min")
7472
ts = DataFrame(np.random.randn(len(rng), 2), index=rng)
75-
if frame_or_series is not DataFrame:
76-
ts = ts[0]
73+
ts = tm.get_obj(ts, frame_or_series)
7774

7875
stime = time(0, 0)
7976
etime = time(1, 0)
@@ -107,8 +104,7 @@ def test_between_time(self, inclusive_endpoints_fixture, frame_or_series):
107104
# across midnight
108105
rng = date_range("1/1/2000", "1/5/2000", freq="5min")
109106
ts = DataFrame(np.random.randn(len(rng), 2), index=rng)
110-
if frame_or_series is not DataFrame:
111-
ts = ts[0]
107+
ts = tm.get_obj(ts, frame_or_series)
112108
stime = time(22, 0)
113109
etime = time(9, 0)
114110

@@ -135,8 +131,7 @@ def test_between_time(self, inclusive_endpoints_fixture, frame_or_series):
135131
def test_between_time_raises(self, frame_or_series):
136132
# GH#20725
137133
obj = DataFrame([[1, 2, 3], [4, 5, 6]])
138-
if frame_or_series is not DataFrame:
139-
obj = obj[0]
134+
obj = tm.get_obj(obj, frame_or_series)
140135

141136
msg = "Index must be DatetimeIndex"
142137
with pytest.raises(TypeError, match=msg): # index is not a DatetimeIndex
@@ -215,8 +210,7 @@ def test_between_time_warn(self, include_start, include_end, frame_or_series):
215210
# GH40245
216211
rng = date_range("1/1/2000", "1/5/2000", freq="5min")
217212
ts = DataFrame(np.random.randn(len(rng), 2), index=rng)
218-
if frame_or_series is not DataFrame:
219-
ts = ts[0]
213+
ts = tm.get_obj(ts, frame_or_series)
220214

221215
stime = time(0, 0)
222216
etime = time(1, 0)

pandas/tests/frame/methods/test_first_and_last.py

+5-10
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,12 @@
1313
class TestFirst:
1414
def test_first_subset(self, frame_or_series):
1515
ts = tm.makeTimeDataFrame(freq="12h")
16-
if frame_or_series is not DataFrame:
17-
ts = ts["A"]
16+
ts = tm.get_obj(ts, frame_or_series)
1817
result = ts.first("10d")
1918
assert len(result) == 20
2019

2120
ts = tm.makeTimeDataFrame(freq="D")
22-
if frame_or_series is not DataFrame:
23-
ts = ts["A"]
21+
ts = tm.get_obj(ts, frame_or_series)
2422
result = ts.first("10d")
2523
assert len(result) == 10
2624

@@ -38,8 +36,7 @@ def test_first_subset(self, frame_or_series):
3836
def test_first_last_raises(self, frame_or_series):
3937
# GH#20725
4038
obj = DataFrame([[1, 2, 3], [4, 5, 6]])
41-
if frame_or_series is not DataFrame:
42-
obj = obj[0]
39+
obj = tm.get_obj(obj, frame_or_series)
4340

4441
msg = "'first' only supports a DatetimeIndex index"
4542
with pytest.raises(TypeError, match=msg): # index is not a DatetimeIndex
@@ -51,14 +48,12 @@ def test_first_last_raises(self, frame_or_series):
5148

5249
def test_last_subset(self, frame_or_series):
5350
ts = tm.makeTimeDataFrame(freq="12h")
54-
if frame_or_series is not DataFrame:
55-
ts = ts["A"]
51+
ts = tm.get_obj(ts, frame_or_series)
5652
result = ts.last("10d")
5753
assert len(result) == 20
5854

5955
ts = tm.makeTimeDataFrame(nper=30, freq="D")
60-
if frame_or_series is not DataFrame:
61-
ts = ts["A"]
56+
ts = tm.get_obj(ts, frame_or_series)
6257
result = ts.last("10d")
6358
assert len(result) == 10
6459

pandas/tests/frame/methods/test_pipe.py

+2-4
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,15 @@ def test_pipe(self, frame_or_series):
2121

2222
def test_pipe_tuple(self, frame_or_series):
2323
obj = DataFrame({"A": [1, 2, 3]})
24-
if frame_or_series is Series:
25-
obj = obj["A"]
24+
obj = tm.get_obj(obj, frame_or_series)
2625

2726
f = lambda x, y: y
2827
result = obj.pipe((f, "y"), 0)
2928
tm.assert_equal(result, obj)
3029

3130
def test_pipe_tuple_error(self, frame_or_series):
3231
obj = DataFrame({"A": [1, 2, 3]})
33-
if frame_or_series is Series:
34-
obj = obj["A"]
32+
obj = tm.get_obj(obj, frame_or_series)
3533

3634
f = lambda x, y: y
3735

pandas/tests/frame/methods/test_reorder_levels.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def test_reorder_levels(self, frame_or_series):
1616
names=["L0", "L1", "L2"],
1717
)
1818
df = DataFrame({"A": np.arange(6), "B": np.arange(6)}, index=index)
19-
obj = df if frame_or_series is DataFrame else df["A"]
19+
obj = tm.get_obj(df, frame_or_series)
2020

2121
# no change, position
2222
result = obj.reorder_levels([0, 1, 2])
@@ -34,7 +34,7 @@ def test_reorder_levels(self, frame_or_series):
3434
names=["L1", "L2", "L0"],
3535
)
3636
expected = DataFrame({"A": np.arange(6), "B": np.arange(6)}, index=e_idx)
37-
expected = expected if frame_or_series is DataFrame else expected["A"]
37+
expected = tm.get_obj(expected, frame_or_series)
3838
tm.assert_equal(result, expected)
3939

4040
result = obj.reorder_levels([0, 0, 0])
@@ -44,7 +44,7 @@ def test_reorder_levels(self, frame_or_series):
4444
names=["L0", "L0", "L0"],
4545
)
4646
expected = DataFrame({"A": np.arange(6), "B": np.arange(6)}, index=e_idx)
47-
expected = expected if frame_or_series is DataFrame else expected["A"]
47+
expected = tm.get_obj(expected, frame_or_series)
4848
tm.assert_equal(result, expected)
4949

5050
result = obj.reorder_levels(["L0", "L0", "L0"])

pandas/tests/frame/methods/test_replace.py

+2-4
Original file line numberDiff line numberDiff line change
@@ -483,8 +483,7 @@ def test_replace_with_empty_list(self, frame_or_series):
483483
# GH 21977
484484
ser = Series([["a", "b"], [], np.nan, [1]])
485485
obj = DataFrame({"col": ser})
486-
if frame_or_series is Series:
487-
obj = ser
486+
obj = tm.get_obj(obj, frame_or_series)
488487
expected = obj
489488
result = obj.replace([], np.nan)
490489
tm.assert_equal(result, expected)
@@ -1332,8 +1331,7 @@ def test_replace_with_duplicate_columns(self, replacement):
13321331
def test_replace_ea_ignore_float(self, frame_or_series, value):
13331332
# GH#34871
13341333
obj = DataFrame({"Per": [value] * 3})
1335-
if frame_or_series is not DataFrame:
1336-
obj = obj["Per"]
1334+
obj = tm.get_obj(obj, frame_or_series)
13371335

13381336
expected = obj.copy()
13391337
result = obj.replace(1.0, 0.0)

pandas/tests/frame/methods/test_sample.py

+2-4
Original file line numberDiff line numberDiff line change
@@ -166,8 +166,7 @@ def test_sample_none_weights(self, obj):
166166
def test_sample_random_state(self, func_str, arg, frame_or_series):
167167
# GH#32503
168168
obj = DataFrame({"col1": range(10, 20), "col2": range(20, 30)})
169-
if frame_or_series is Series:
170-
obj = obj["col1"]
169+
obj = tm.get_obj(obj, frame_or_series)
171170
result = obj.sample(n=3, random_state=eval(func_str)(arg))
172171
expected = obj.sample(n=3, random_state=com.random_state(eval(func_str)(arg)))
173172
tm.assert_equal(result, expected)
@@ -192,8 +191,7 @@ def test_sample_upsampling_without_replacement(self, frame_or_series):
192191
# GH#27451
193192

194193
obj = DataFrame({"A": list("abc")})
195-
if frame_or_series is Series:
196-
obj = obj["A"]
194+
obj = tm.get_obj(obj, frame_or_series)
197195

198196
msg = (
199197
"Replace has to be set to `True` when "

pandas/tests/frame/methods/test_to_period.py

+2-4
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@ def test_to_period(self, frame_or_series):
2121
np.random.randn(len(dr), K), index=dr, columns=["A", "B", "C", "D", "E"]
2222
)
2323
obj["mix"] = "a"
24-
if frame_or_series is Series:
25-
obj = obj["A"]
24+
obj = tm.get_obj(obj, frame_or_series)
2625

2726
pts = obj.to_period()
2827
exp = obj.copy()
@@ -41,8 +40,7 @@ def test_to_period_without_freq(self, frame_or_series):
4140
)
4241

4342
obj = DataFrame(np.random.randn(4, 4), index=idx, columns=idx)
44-
if frame_or_series is Series:
45-
obj = obj[idx[0]]
43+
obj = tm.get_obj(obj, frame_or_series)
4644
expected = obj.copy()
4745
expected.index = exp_idx
4846
tm.assert_equal(obj.to_period(), expected)

0 commit comments

Comments
 (0)