From 9f90081eb42253838d00eb96ed36070cc4128958 Mon Sep 17 00:00:00 2001 From: cmp0xff Date: Sun, 2 Nov 2025 15:30:36 +0100 Subject: [PATCH 1/4] add NumpyExtensionArray --- pandas-stubs/_libs/arrays.pyi | 1 + pandas-stubs/core/arrays/_mixins.pyi | 5 +++++ pandas-stubs/core/arrays/numpy_.pyi | 6 ++++++ pandas-stubs/core/strings/object_array.pyi | 1 + 4 files changed, 13 insertions(+) create mode 100644 pandas-stubs/_libs/arrays.pyi create mode 100644 pandas-stubs/core/arrays/_mixins.pyi create mode 100644 pandas-stubs/core/strings/object_array.pyi diff --git a/pandas-stubs/_libs/arrays.pyi b/pandas-stubs/_libs/arrays.pyi new file mode 100644 index 000000000..740dc7469 --- /dev/null +++ b/pandas-stubs/_libs/arrays.pyi @@ -0,0 +1 @@ +class NDArrayBacked: ... diff --git a/pandas-stubs/core/arrays/_mixins.pyi b/pandas-stubs/core/arrays/_mixins.pyi new file mode 100644 index 000000000..c34cbd231 --- /dev/null +++ b/pandas-stubs/core/arrays/_mixins.pyi @@ -0,0 +1,5 @@ +from pandas.core.arrays.base import ExtensionArray + +from pandas._libs.arrays import NDArrayBacked + +class NDArrayBackedExtensionArray(NDArrayBacked, ExtensionArray): ... diff --git a/pandas-stubs/core/arrays/numpy_.pyi b/pandas-stubs/core/arrays/numpy_.pyi index 760d82e84..96a7a72a3 100644 --- a/pandas-stubs/core/arrays/numpy_.pyi +++ b/pandas-stubs/core/arrays/numpy_.pyi @@ -1,9 +1,12 @@ import numpy as np from numpy.lib.mixins import NDArrayOperatorsMixin +from pandas.core.arraylike import OpsMixin +from pandas.core.arrays._mixins import NDArrayBackedExtensionArray from pandas.core.arrays.base import ( ExtensionArray, ExtensionOpsMixin, ) +from pandas.core.strings.object_array import ObjectStringArrayMixin from pandas.core.dtypes.dtypes import ExtensionDtype @@ -14,3 +17,6 @@ class PandasDtype(ExtensionDtype): def itemsize(self) -> int: ... class PandasArray(ExtensionArray, ExtensionOpsMixin, NDArrayOperatorsMixin): ... +class NumpyExtensionArray( + OpsMixin, NDArrayBackedExtensionArray, ObjectStringArrayMixin +): ... diff --git a/pandas-stubs/core/strings/object_array.pyi b/pandas-stubs/core/strings/object_array.pyi new file mode 100644 index 000000000..3fd853b0f --- /dev/null +++ b/pandas-stubs/core/strings/object_array.pyi @@ -0,0 +1 @@ +class ObjectStringArrayMixin: ... From 4d3e615938c8b59b1a54b7315e4515eef5ffc8f8 Mon Sep 17 00:00:00 2001 From: cmp0xff Date: Tue, 4 Nov 2025 11:54:58 +0100 Subject: [PATCH 2/4] add all arrays --- pandas-stubs/_libs/arrays.pyi | 39 +++++++++++++- pandas-stubs/core/arrays/__init__.pyi | 54 ++++++++++++++----- .../core/arrays/_arrow_string_mixins.pyi | 1 + pandas-stubs/core/arrays/_mixins.pyi | 12 ++++- pandas-stubs/core/arrays/arrow/__init__.pyi | 7 +++ pandas-stubs/core/arrays/arrow/accessors.pyi | 5 ++ pandas-stubs/core/arrays/arrow/array.pyi | 7 +++ pandas-stubs/core/arrays/base.pyi | 4 +- pandas-stubs/core/arrays/floating.pyi | 6 ++- pandas-stubs/core/arrays/numeric.pyi | 8 +++ pandas-stubs/core/arrays/period.pyi | 13 +++++ pandas-stubs/core/arrays/string_.pyi | 7 ++- pandas-stubs/core/arrays/string_arrow.pyi | 7 +++ 13 files changed, 151 insertions(+), 19 deletions(-) create mode 100644 pandas-stubs/core/arrays/_arrow_string_mixins.pyi create mode 100644 pandas-stubs/core/arrays/arrow/accessors.pyi create mode 100644 pandas-stubs/core/arrays/arrow/array.pyi create mode 100644 pandas-stubs/core/arrays/string_arrow.pyi diff --git a/pandas-stubs/_libs/arrays.pyi b/pandas-stubs/_libs/arrays.pyi index 740dc7469..59a8da922 100644 --- a/pandas-stubs/_libs/arrays.pyi +++ b/pandas-stubs/_libs/arrays.pyi @@ -1 +1,38 @@ -class NDArrayBacked: ... +from collections.abc import Sequence +from typing import Any + +import numpy as np +from typing_extensions import Self + +from pandas._typing import ( + AnyArrayLikeInt, + AxisInt, + DtypeObj, + Shape, +) + +class NDArrayBacked: + _dtype: DtypeObj + _ndarray: np.ndarray + def __setstate__(self, state: Any) -> None: ... + def __len__(self) -> int: ... + @property + def shape(self) -> Shape: ... + @property + def ndim(self) -> int: ... + @property + def size(self) -> int: ... + @property + def nbytes(self) -> int: ... + def copy(self, order=...) -> Self: ... + def delete(self, loc, axis=...) -> Self: ... + def swapaxes(self, axis1, axis2) -> Self: ... + def repeat( + self, + repeats: int | Sequence[int] | AnyArrayLikeInt, + axis: AxisInt | None = None, + ) -> Self: ... + def reshape(self, *args: Any, **kwargs: Any) -> Self: ... + def ravel(self, order=...) -> Self: ... + @property + def T(self) -> Self: ... diff --git a/pandas-stubs/core/arrays/__init__.pyi b/pandas-stubs/core/arrays/__init__.pyi index b9fb5f749..f183e9236 100644 --- a/pandas-stubs/core/arrays/__init__.pyi +++ b/pandas-stubs/core/arrays/__init__.pyi @@ -1,15 +1,43 @@ +from pandas.core.arrays.arrow import ArrowExtensionArray from pandas.core.arrays.base import ( - ExtensionArray as ExtensionArray, - ExtensionOpsMixin as ExtensionOpsMixin, - ExtensionScalarOpsMixin as ExtensionScalarOpsMixin, + ExtensionArray, + ExtensionOpsMixin, + ExtensionScalarOpsMixin, ) -from pandas.core.arrays.boolean import BooleanArray as BooleanArray -from pandas.core.arrays.categorical import Categorical as Categorical -from pandas.core.arrays.datetimes import DatetimeArray as DatetimeArray -from pandas.core.arrays.integer import IntegerArray as IntegerArray -from pandas.core.arrays.interval import IntervalArray as IntervalArray -from pandas.core.arrays.numpy_ import PandasArray as PandasArray -from pandas.core.arrays.period import PeriodArray as PeriodArray -from pandas.core.arrays.sparse import SparseArray as SparseArray -from pandas.core.arrays.string_ import StringArray as StringArray -from pandas.core.arrays.timedeltas import TimedeltaArray as TimedeltaArray +from pandas.core.arrays.boolean import BooleanArray +from pandas.core.arrays.categorical import Categorical +from pandas.core.arrays.datetimes import DatetimeArray +from pandas.core.arrays.floating import FloatingArray +from pandas.core.arrays.integer import IntegerArray +from pandas.core.arrays.interval import IntervalArray +from pandas.core.arrays.masked import BaseMaskedArray +from pandas.core.arrays.numpy_ import NumpyExtensionArray +from pandas.core.arrays.period import ( + PeriodArray, + period_array, +) +from pandas.core.arrays.sparse import SparseArray +from pandas.core.arrays.string_ import StringArray +from pandas.core.arrays.string_arrow import ArrowStringArray +from pandas.core.arrays.timedeltas import TimedeltaArray + +__all__ = [ + "ArrowExtensionArray", + "ArrowStringArray", + "BaseMaskedArray", + "BooleanArray", + "Categorical", + "DatetimeArray", + "ExtensionArray", + "ExtensionOpsMixin", + "ExtensionScalarOpsMixin", + "FloatingArray", + "IntegerArray", + "IntervalArray", + "NumpyExtensionArray", + "PeriodArray", + "SparseArray", + "StringArray", + "TimedeltaArray", + "period_array", +] diff --git a/pandas-stubs/core/arrays/_arrow_string_mixins.pyi b/pandas-stubs/core/arrays/_arrow_string_mixins.pyi new file mode 100644 index 000000000..8c2984e50 --- /dev/null +++ b/pandas-stubs/core/arrays/_arrow_string_mixins.pyi @@ -0,0 +1 @@ +class ArrowStringArrayMixin: ... diff --git a/pandas-stubs/core/arrays/_mixins.pyi b/pandas-stubs/core/arrays/_mixins.pyi index c34cbd231..4141b6538 100644 --- a/pandas-stubs/core/arrays/_mixins.pyi +++ b/pandas-stubs/core/arrays/_mixins.pyi @@ -1,5 +1,15 @@ from pandas.core.arrays.base import ExtensionArray +from pandas.core.series import Series +from typing_extensions import Self from pandas._libs.arrays import NDArrayBacked +from pandas._typing import ( + AxisInt, + Scalar, +) -class NDArrayBackedExtensionArray(NDArrayBacked, ExtensionArray): ... +class NDArrayBackedExtensionArray(NDArrayBacked, ExtensionArray): + def argmin(self, axis: AxisInt = 0, skipna: bool = True) -> int: ... + def argmax(self, axis: AxisInt = 0, skipna: bool = True) -> int: ... + def insert(self, loc: int, item: Scalar) -> Self: ... + def value_counts(self, dropna: bool = True) -> Series[int]: ... diff --git a/pandas-stubs/core/arrays/arrow/__init__.pyi b/pandas-stubs/core/arrays/arrow/__init__.pyi index e69de29bb..50274a2de 100644 --- a/pandas-stubs/core/arrays/arrow/__init__.pyi +++ b/pandas-stubs/core/arrays/arrow/__init__.pyi @@ -0,0 +1,7 @@ +from pandas.core.arrays.arrow.accessors import ( + ListAccessor, + StructAccessor, +) +from pandas.core.arrays.arrow.array import ArrowExtensionArray + +__all__ = ["ArrowExtensionArray", "ListAccessor", "StructAccessor"] diff --git a/pandas-stubs/core/arrays/arrow/accessors.pyi b/pandas-stubs/core/arrays/arrow/accessors.pyi new file mode 100644 index 000000000..409d642c7 --- /dev/null +++ b/pandas-stubs/core/arrays/arrow/accessors.pyi @@ -0,0 +1,5 @@ +from abc import ABCMeta + +class ArrowAccessor(metaclass=ABCMeta): ... +class ListAccessor(ArrowAccessor): ... +class StructAccessor(ArrowAccessor): ... diff --git a/pandas-stubs/core/arrays/arrow/array.pyi b/pandas-stubs/core/arrays/arrow/array.pyi new file mode 100644 index 000000000..026fe1955 --- /dev/null +++ b/pandas-stubs/core/arrays/arrow/array.pyi @@ -0,0 +1,7 @@ +from pandas.core.arraylike import OpsMixin +from pandas.core.arrays._arrow_string_mixins import ArrowStringArrayMixin +from pandas.core.arrays.base import ExtensionArraySupportsAnyAll + +class ArrowExtensionArray( + OpsMixin, ExtensionArraySupportsAnyAll, ArrowStringArrayMixin +): ... diff --git a/pandas-stubs/core/arrays/base.pyi b/pandas-stubs/core/arrays/base.pyi index 09bf2b0cb..8814db2c3 100644 --- a/pandas-stubs/core/arrays/base.pyi +++ b/pandas-stubs/core/arrays/base.pyi @@ -85,7 +85,7 @@ class ExtensionArray: ) -> np.intp: ... def factorize(self, use_na_sentinel: bool = True) -> tuple[np_1darray, Self]: ... def repeat( - self, repeats: int | AnyArrayLikeInt | Sequence[int], axis: None = None + self, repeats: int | Sequence[int] | AnyArrayLikeInt, axis: None = None ) -> Self: ... def take( self, @@ -112,6 +112,8 @@ class ExtensionArray: **kwargs: Any, ) -> Self: ... +class ExtensionArraySupportsAnyAll(ExtensionArray): ... + class ExtensionOpsMixin: @classmethod def _add_arithmetic_ops(cls) -> None: ... diff --git a/pandas-stubs/core/arrays/floating.pyi b/pandas-stubs/core/arrays/floating.pyi index 78d72f875..682756167 100644 --- a/pandas-stubs/core/arrays/floating.pyi +++ b/pandas-stubs/core/arrays/floating.pyi @@ -1,4 +1,8 @@ -from pandas.core.arrays.numeric import NumericDtype +from pandas.core.arrays.numeric import ( + NumericArray, + NumericDtype, +) class Float32Dtype(NumericDtype): ... class Float64Dtype(NumericDtype): ... +class FloatingArray(NumericArray): ... diff --git a/pandas-stubs/core/arrays/numeric.pyi b/pandas-stubs/core/arrays/numeric.pyi index eacf8825b..5ea899dac 100644 --- a/pandas-stubs/core/arrays/numeric.pyi +++ b/pandas-stubs/core/arrays/numeric.pyi @@ -1,3 +1,11 @@ +from pandas.core.arrays.masked import BaseMaskedArray + +from pandas._libs.properties import cache_readonly + from pandas.core.dtypes.dtypes import BaseMaskedDtype class NumericDtype(BaseMaskedDtype): ... + +class NumericArray(BaseMaskedArray): + @cache_readonly + def dtype(self) -> NumericDtype: ... diff --git a/pandas-stubs/core/arrays/period.pyi b/pandas-stubs/core/arrays/period.pyi index 5eaf014dc..783702ce3 100644 --- a/pandas-stubs/core/arrays/period.pyi +++ b/pandas-stubs/core/arrays/period.pyi @@ -1,3 +1,5 @@ +from collections.abc import Sequence + from pandas import PeriodDtype from pandas.core.arrays.datetimelike import ( DatelikeOps, @@ -5,8 +7,13 @@ from pandas.core.arrays.datetimelike import ( ) from pandas._libs.tslibs import Timestamp +from pandas._libs.tslibs.offsets import ( + BaseOffset, + Tick, +) from pandas._libs.tslibs.period import Period from pandas._typing import ( + AnyArrayLike, NpDtype, PeriodFrequency, np_1darray, @@ -47,3 +54,9 @@ class PeriodArray(DatetimeLikeArrayMixin, DatelikeOps): self, freq: PeriodFrequency | None = None, how: str = ... ) -> Timestamp: ... def asfreq(self, freq: str | None = ..., how: str = "E") -> Period: ... + +def period_array( + data: Sequence[Period | str | None] | AnyArrayLike, + freq: str | Tick | BaseOffset | None = None, + copy: bool = False, +) -> PeriodArray: ... diff --git a/pandas-stubs/core/arrays/string_.pyi b/pandas-stubs/core/arrays/string_.pyi index 845870de7..556c92436 100644 --- a/pandas-stubs/core/arrays/string_.pyi +++ b/pandas-stubs/core/arrays/string_.pyi @@ -1,6 +1,7 @@ from typing import Literal -from pandas.core.arrays import PandasArray +from pandas.core.arrays.base import ExtensionArray +from pandas.core.arrays.numpy_ import NumpyExtensionArray from pandas._libs.missing import NAType @@ -11,7 +12,9 @@ class StringDtype(ExtensionDtype): @property def na_value(self) -> NAType: ... -class StringArray(PandasArray): +class BaseStringArray(ExtensionArray): ... + +class StringArray(BaseStringArray, NumpyExtensionArray): def __init__(self, values, copy: bool = ...) -> None: ... def __arrow_array__(self, type=...): ... def __setitem__(self, key, value) -> None: ... diff --git a/pandas-stubs/core/arrays/string_arrow.pyi b/pandas-stubs/core/arrays/string_arrow.pyi new file mode 100644 index 000000000..20be1de04 --- /dev/null +++ b/pandas-stubs/core/arrays/string_arrow.pyi @@ -0,0 +1,7 @@ +from pandas.core.arrays.arrow.array import ArrowExtensionArray +from pandas.core.arrays.string_ import BaseStringArray +from pandas.core.strings.object_array import ObjectStringArrayMixin + +class ArrowStringArray( + ObjectStringArrayMixin, ArrowExtensionArray, BaseStringArray +): ... From 1ec94470a69a6be97f305ba7c62fc80c6c2f2060 Mon Sep 17 00:00:00 2001 From: cmp0xff Date: Tue, 4 Nov 2025 12:45:15 +0100 Subject: [PATCH 3/4] removed disappeared classes --- pandas-stubs/core/arrays/numpy_.pyi | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/pandas-stubs/core/arrays/numpy_.pyi b/pandas-stubs/core/arrays/numpy_.pyi index 96a7a72a3..afe191746 100644 --- a/pandas-stubs/core/arrays/numpy_.pyi +++ b/pandas-stubs/core/arrays/numpy_.pyi @@ -1,22 +1,7 @@ -import numpy as np -from numpy.lib.mixins import NDArrayOperatorsMixin from pandas.core.arraylike import OpsMixin from pandas.core.arrays._mixins import NDArrayBackedExtensionArray -from pandas.core.arrays.base import ( - ExtensionArray, - ExtensionOpsMixin, -) from pandas.core.strings.object_array import ObjectStringArrayMixin -from pandas.core.dtypes.dtypes import ExtensionDtype - -class PandasDtype(ExtensionDtype): - @property - def numpy_dtype(self) -> np.dtype: ... - @property - def itemsize(self) -> int: ... - -class PandasArray(ExtensionArray, ExtensionOpsMixin, NDArrayOperatorsMixin): ... class NumpyExtensionArray( OpsMixin, NDArrayBackedExtensionArray, ObjectStringArrayMixin ): ... From 759079d6f58821171263f5bd1790b1dc86a7f33e Mon Sep 17 00:00:00 2001 From: cmp0xff Date: Tue, 4 Nov 2025 12:54:20 +0100 Subject: [PATCH 4/4] fixup --- pandas-stubs/arrays/__init__.pyi | 39 ++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/pandas-stubs/arrays/__init__.pyi b/pandas-stubs/arrays/__init__.pyi index 8dd78cc95..f7199f86e 100644 --- a/pandas-stubs/arrays/__init__.pyi +++ b/pandas-stubs/arrays/__init__.pyi @@ -1,12 +1,31 @@ from pandas.core.arrays import ( - BooleanArray as BooleanArray, - Categorical as Categorical, - DatetimeArray as DatetimeArray, - IntegerArray as IntegerArray, - IntervalArray as IntervalArray, - PandasArray as PandasArray, - PeriodArray as PeriodArray, - SparseArray as SparseArray, - StringArray as StringArray, - TimedeltaArray as TimedeltaArray, + ArrowExtensionArray, + ArrowStringArray, + BooleanArray, + Categorical, + DatetimeArray, + FloatingArray, + IntegerArray, + IntervalArray, + NumpyExtensionArray, + PeriodArray, + SparseArray, + StringArray, + TimedeltaArray, ) + +__all__ = [ + "ArrowExtensionArray", + "ArrowStringArray", + "BooleanArray", + "Categorical", + "DatetimeArray", + "FloatingArray", + "IntegerArray", + "IntervalArray", + "NumpyExtensionArray", + "PeriodArray", + "SparseArray", + "StringArray", + "TimedeltaArray", +]