Skip to content

Commit f16bf76

Browse files
remove usage of pa_version_under11p0
1 parent b8bc90e commit f16bf76

File tree

10 files changed

+25
-138
lines changed

10 files changed

+25
-138
lines changed

pandas/compat/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
from pandas.compat.numpy import is_numpy_dev
2727
from pandas.compat.pyarrow import (
2828
HAS_PYARROW,
29-
pa_version_under11p0,
29+
pa_version_under12p1,
3030
pa_version_under13p0,
3131
pa_version_under14p0,
3232
pa_version_under14p1,
@@ -159,7 +159,7 @@ def is_ci_environment() -> bool:
159159
"PYPY",
160160
"WASM",
161161
"is_numpy_dev",
162-
"pa_version_under11p0",
162+
"pa_version_under12p1",
163163
"pa_version_under13p0",
164164
"pa_version_under14p0",
165165
"pa_version_under14p1",

pandas/compat/pyarrow.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import pyarrow as pa
99

1010
_palv = Version(Version(pa.__version__).base_version)
11-
pa_version_under11p0 = _palv < Version("11.0.0")
1211
pa_version_under12p1 = _palv < Version("12.0.1")
1312
pa_version_under13p0 = _palv < Version("13.0.0")
1413
pa_version_under14p0 = _palv < Version("14.0.0")
@@ -21,7 +20,6 @@
2120
pa_version_under20p0 = _palv < Version("20.0.0")
2221
HAS_PYARROW = _palv >= Version("12.0.1")
2322
except ImportError:
24-
pa_version_under11p0 = True
2523
pa_version_under12p1 = True
2624
pa_version_under13p0 = True
2725
pa_version_under14p0 = True

pandas/core/arrays/_arrow_string_mixins.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
from pandas._libs import lib
1414
from pandas.compat import (
1515
HAS_PYARROW,
16-
pa_version_under11p0,
1716
pa_version_under13p0,
1817
pa_version_under17p0,
1918
)
@@ -132,10 +131,6 @@ def _str_get(self, i: int) -> Self:
132131
def _str_slice(
133132
self, start: int | None = None, stop: int | None = None, step: int | None = None
134133
) -> Self:
135-
if pa_version_under11p0:
136-
# GH#59724
137-
result = self._apply_elementwise(lambda val: val[start:stop:step])
138-
return type(self)(pa.chunked_array(result, type=self._pa_array.type))
139134
if start is None:
140135
if step is not None and step < 0:
141136
# GH#59710

pandas/core/arrays/arrow/accessors.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,7 @@
1111
cast,
1212
)
1313

14-
from pandas.compat import (
15-
HAS_PYARROW,
16-
pa_version_under11p0,
17-
)
14+
from pandas.compat import HAS_PYARROW
1815

1916
from pandas.core.dtypes.common import is_list_like
2017

@@ -171,11 +168,6 @@ def __getitem__(self, key: int | slice) -> Series:
171168
name=self._data.name,
172169
)
173170
elif isinstance(key, slice):
174-
if pa_version_under11p0:
175-
raise NotImplementedError(
176-
f"List slice not supported by pyarrow {pa.__version__}."
177-
)
178-
179171
# TODO: Support negative start/stop/step, ideally this would be added
180172
# upstream in pyarrow.
181173
start, stop, step = key.start, key.stop, key.step

pandas/core/arrays/arrow/array.py

Lines changed: 3 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
)
2424
from pandas.compat import (
2525
HAS_PYARROW,
26-
pa_version_under11p0,
2726
pa_version_under12p1,
2827
pa_version_under13p0,
2928
)
@@ -209,16 +208,6 @@ def floordiv_compat(
209208
from pandas.core.arrays.timedeltas import TimedeltaArray
210209

211210

212-
def get_unit_from_pa_dtype(pa_dtype) -> str:
213-
# https://github.com/pandas-dev/pandas/pull/50998#discussion_r1100344804
214-
if pa_version_under11p0:
215-
unit = str(pa_dtype).split("[", 1)[-1][:-1]
216-
if unit not in ["s", "ms", "us", "ns"]:
217-
raise ValueError(pa_dtype)
218-
return unit
219-
return pa_dtype.unit
220-
221-
222211
def to_pyarrow_type(
223212
dtype: ArrowDtype | pa.DataType | Dtype | None,
224213
) -> pa.DataType | None:
@@ -1200,10 +1189,6 @@ def factorize(
12001189
null_encoding = "mask" if use_na_sentinel else "encode"
12011190

12021191
data = self._pa_array
1203-
pa_type = data.type
1204-
if pa_version_under11p0 and pa.types.is_duration(pa_type):
1205-
# https://github.com/apache/arrow/issues/15226#issuecomment-1376578323
1206-
data = data.cast(pa.int64())
12071192

12081193
if pa.types.is_dictionary(data.type):
12091194
if null_encoding == "encode":
@@ -1228,8 +1213,6 @@ def factorize(
12281213
)
12291214
uniques = type(self)(combined.dictionary)
12301215

1231-
if pa_version_under11p0 and pa.types.is_duration(pa_type):
1232-
uniques = cast(ArrowExtensionArray, uniques.astype(self.dtype))
12331216
return indices, uniques
12341217

12351218
def reshape(self, *args, **kwargs):
@@ -1516,19 +1499,7 @@ def unique(self) -> Self:
15161499
-------
15171500
ArrowExtensionArray
15181501
"""
1519-
pa_type = self._pa_array.type
1520-
1521-
if pa_version_under11p0 and pa.types.is_duration(pa_type):
1522-
# https://github.com/apache/arrow/issues/15226#issuecomment-1376578323
1523-
data = self._pa_array.cast(pa.int64())
1524-
else:
1525-
data = self._pa_array
1526-
1527-
pa_result = pc.unique(data)
1528-
1529-
if pa_version_under11p0 and pa.types.is_duration(pa_type):
1530-
pa_result = pa_result.cast(pa_type)
1531-
1502+
pa_result = pc.unique(self._pa_array)
15321503
return type(self)(pa_result)
15331504

15341505
def value_counts(self, dropna: bool = True) -> Series:
@@ -1548,18 +1519,12 @@ def value_counts(self, dropna: bool = True) -> Series:
15481519
--------
15491520
Series.value_counts
15501521
"""
1551-
pa_type = self._pa_array.type
1552-
if pa_version_under11p0 and pa.types.is_duration(pa_type):
1553-
# https://github.com/apache/arrow/issues/15226#issuecomment-1376578323
1554-
data = self._pa_array.cast(pa.int64())
1555-
else:
1556-
data = self._pa_array
1557-
15581522
from pandas import (
15591523
Index,
15601524
Series,
15611525
)
15621526

1527+
data = self._pa_array
15631528
vc = data.value_counts()
15641529

15651530
values = vc.field(0)
@@ -1569,9 +1534,6 @@ def value_counts(self, dropna: bool = True) -> Series:
15691534
values = values.filter(mask)
15701535
counts = counts.filter(mask)
15711536

1572-
if pa_version_under11p0 and pa.types.is_duration(pa_type):
1573-
values = values.cast(pa_type)
1574-
15751537
counts = ArrowExtensionArray(counts)
15761538

15771539
index = Index(type(self)(values))
@@ -1865,8 +1827,7 @@ def pyarrow_meth(data, skip_nulls, min_count=0): # type: ignore[misc]
18651827
if pa.types.is_duration(pa_type):
18661828
result = result.cast(pa_type)
18671829
elif pa.types.is_time(pa_type):
1868-
unit = get_unit_from_pa_dtype(pa_type)
1869-
result = result.cast(pa.duration(unit))
1830+
result = result.cast(pa.duration(pa_type.unit))
18701831
elif pa.types.is_date(pa_type):
18711832
# go with closest available unit, i.e. "s"
18721833
result = result.cast(pa.duration("s"))

pandas/core/strings/accessor.py

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -305,8 +305,6 @@ def _wrap_result(
305305
if isinstance(result.dtype, ArrowDtype):
306306
import pyarrow as pa
307307

308-
from pandas.compat import pa_version_under11p0
309-
310308
from pandas.core.arrays.arrow.array import ArrowExtensionArray
311309

312310
value_lengths = pa.compute.list_value_length(result._pa_array)
@@ -319,26 +317,14 @@ def _wrap_result(
319317
)
320318
if min_len < max_len:
321319
# append nulls to each scalar list element up to max_len
322-
if not pa_version_under11p0:
323-
result = ArrowExtensionArray(
324-
pa.compute.list_slice(
325-
result._pa_array,
326-
start=0,
327-
stop=max_len,
328-
return_fixed_size_list=True,
329-
)
320+
result = ArrowExtensionArray(
321+
pa.compute.list_slice(
322+
result._pa_array,
323+
start=0,
324+
stop=max_len,
325+
return_fixed_size_list=True,
330326
)
331-
else:
332-
all_null = np.full(max_len, fill_value=None, dtype=object)
333-
values = result.to_numpy()
334-
new_values = []
335-
for row in values:
336-
if len(row) < max_len:
337-
nulls = all_null[: max_len - len(row)]
338-
row = np.append(row, nulls)
339-
new_values.append(row)
340-
pa_type = result._pa_array.type
341-
result = ArrowExtensionArray(pa.array(new_values, type=pa_type))
327+
)
342328
if name is None:
343329
name = range(max_len)
344330
result = (

pandas/tests/extension/test_arrow.py

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
PY312,
4040
is_ci_environment,
4141
is_platform_windows,
42-
pa_version_under11p0,
4342
pa_version_under13p0,
4443
pa_version_under14p0,
4544
pa_version_under19p0,
@@ -353,15 +352,6 @@ def test_from_sequence_of_strings_pa_array(self, data, request):
353352
reason="Nanosecond time parsing not supported.",
354353
)
355354
)
356-
elif pa_version_under11p0 and (
357-
pa.types.is_duration(pa_dtype) or pa.types.is_decimal(pa_dtype)
358-
):
359-
request.applymarker(
360-
pytest.mark.xfail(
361-
raises=pa.ArrowNotImplementedError,
362-
reason=f"pyarrow doesn't support parsing {pa_dtype}",
363-
)
364-
)
365355
elif pa.types.is_timestamp(pa_dtype) and pa_dtype.tz is not None:
366356
_require_timezone_database(request)
367357

@@ -3288,9 +3278,6 @@ def test_pow_missing_operand():
32883278
tm.assert_series_equal(result, expected)
32893279

32903280

3291-
@pytest.mark.skipif(
3292-
pa_version_under11p0, reason="Decimal128 to string cast implemented in pyarrow 11"
3293-
)
32943281
def test_decimal_parse_raises():
32953282
# GH 56984
32963283
ser = pd.Series(["1.2345"], dtype=ArrowDtype(pa.string()))
@@ -3300,9 +3287,6 @@ def test_decimal_parse_raises():
33003287
ser.astype(ArrowDtype(pa.decimal128(1, 0)))
33013288

33023289

3303-
@pytest.mark.skipif(
3304-
pa_version_under11p0, reason="Decimal128 to string cast implemented in pyarrow 11"
3305-
)
33063290
def test_decimal_parse_succeeds():
33073291
# GH 56984
33083292
ser = pd.Series(["1.2345"], dtype=ArrowDtype(pa.string()))

pandas/tests/io/test_parquet.py

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
from pandas.compat import is_platform_windows
1515
from pandas.compat.pyarrow import (
16-
pa_version_under11p0,
1716
pa_version_under13p0,
1817
pa_version_under15p0,
1918
pa_version_under17p0,
@@ -729,14 +728,7 @@ def test_to_bytes_without_path_or_buf_provided(self, pa, df_full):
729728

730729
expected = df_full.copy()
731730
expected.loc[1, "string_with_nan"] = None
732-
if pa_version_under11p0:
733-
expected["datetime_with_nat"] = expected["datetime_with_nat"].astype(
734-
"M8[ns]"
735-
)
736-
else:
737-
expected["datetime_with_nat"] = expected["datetime_with_nat"].astype(
738-
"M8[ms]"
739-
)
731+
expected["datetime_with_nat"] = expected["datetime_with_nat"].astype("M8[ms]")
740732
tm.assert_frame_equal(res, expected)
741733

742734
def test_duplicate_columns(self, pa):
@@ -1003,8 +995,6 @@ def test_timezone_aware_index(self, pa, timezone_aware_date_list):
1003995
# this use-case sets the resolution to 1 minute
1004996

1005997
expected = df[:]
1006-
if pa_version_under11p0:
1007-
expected.index = expected.index.as_unit("ns")
1008998
if timezone_aware_date_list.tzinfo != datetime.timezone.utc:
1009999
# pyarrow returns pytz.FixedOffset while pandas constructs datetime.timezone
10101000
# https://github.com/pandas-dev/pandas/issues/37286
@@ -1140,7 +1130,6 @@ def test_string_inference(self, tmp_path, pa, using_infer_string):
11401130
)
11411131
tm.assert_frame_equal(result, expected)
11421132

1143-
@pytest.mark.skipif(pa_version_under11p0, reason="not supported before 11.0")
11441133
def test_roundtrip_decimal(self, tmp_path, pa):
11451134
# GH#54768
11461135
import pyarrow as pa

pandas/tests/series/accessors/test_list_accessor.py

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@
1010

1111
pa = pytest.importorskip("pyarrow")
1212

13-
from pandas.compat import pa_version_under11p0
14-
1513

1614
@pytest.mark.parametrize(
1715
"list_dtype",
@@ -57,20 +55,14 @@ def test_list_getitem_slice():
5755
index=[1, 3, 7],
5856
name="a",
5957
)
60-
if pa_version_under11p0:
61-
with pytest.raises(
62-
NotImplementedError, match="List slice not supported by pyarrow "
63-
):
64-
ser.list[1:None:None]
65-
else:
66-
actual = ser.list[1:None:None]
67-
expected = Series(
68-
[[2, 3], [None, 5], None],
69-
dtype=ArrowDtype(pa.list_(pa.int64())),
70-
index=[1, 3, 7],
71-
name="a",
72-
)
73-
tm.assert_series_equal(actual, expected)
58+
actual = ser.list[1:None:None]
59+
expected = Series(
60+
[[2, 3], [None, 5], None],
61+
dtype=ArrowDtype(pa.list_(pa.int64())),
62+
index=[1, 3, 7],
63+
name="a",
64+
)
65+
tm.assert_series_equal(actual, expected)
7466

7567

7668
def test_list_len():
@@ -105,14 +97,8 @@ def test_list_getitem_slice_invalid():
10597
[[1, 2, 3], [4, None, 5], None],
10698
dtype=ArrowDtype(pa.list_(pa.int64())),
10799
)
108-
if pa_version_under11p0:
109-
with pytest.raises(
110-
NotImplementedError, match="List slice not supported by pyarrow "
111-
):
112-
ser.list[1:None:0]
113-
else:
114-
with pytest.raises(pa.lib.ArrowInvalid, match=re.escape("`step` must be >= 1")):
115-
ser.list[1:None:0]
100+
with pytest.raises(pa.lib.ArrowInvalid, match=re.escape("`step` must be >= 1")):
101+
ser.list[1:None:0]
116102

117103

118104
def test_list_accessor_non_list_dtype():

pandas/tests/series/accessors/test_struct_accessor.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@
22

33
import pytest
44

5-
from pandas.compat.pyarrow import (
6-
pa_version_under11p0,
7-
pa_version_under13p0,
8-
)
5+
from pandas.compat.pyarrow import pa_version_under13p0
96

107
from pandas import (
118
ArrowDtype,
@@ -105,7 +102,6 @@ def test_struct_accessor_field_with_invalid_name_or_index():
105102
ser.struct.field(1.1)
106103

107104

108-
@pytest.mark.skipif(pa_version_under11p0, reason="pyarrow>=11.0.0 required")
109105
def test_struct_accessor_explode():
110106
index = Index([-100, 42, 123])
111107
ser = Series(

0 commit comments

Comments
 (0)