diff --git a/pandas-stubs/_typing.pyi b/pandas-stubs/_typing.pyi index 5cef91fd..7b2b0081 100644 --- a/pandas-stubs/_typing.pyi +++ b/pandas-stubs/_typing.pyi @@ -3,6 +3,7 @@ from collections.abc import ( Callable, Hashable, Iterator, + KeysView, Mapping, MutableSequence, Sequence, @@ -796,9 +797,6 @@ SliceType: TypeAlias = Hashable | None num: TypeAlias = complex -# AxesData is used for data for Index -AxesData: TypeAlias = Axes | dict - DtypeNp = TypeVar("DtypeNp", bound=np.dtype[np.generic]) KeysArgType: TypeAlias = Any ListLikeT = TypeVar("ListLikeT", bound=ListLike) @@ -853,6 +851,9 @@ IndexingInt: TypeAlias = ( int | np.int_ | np.integer | np.unsignedinteger | np.signedinteger | np.int8 ) +# AxesData is used for data for Index +AxesData: TypeAlias = Mapping[S3, Any] | Axes | KeysView + # Any plain Python or numpy function Function: TypeAlias = np.ufunc | Callable[..., Any] # Use a distinct HashableT in shared types to avoid conflicts with diff --git a/pandas-stubs/core/series.pyi b/pandas-stubs/core/series.pyi index 1982d54b..ffe9338b 100644 --- a/pandas-stubs/core/series.pyi +++ b/pandas-stubs/core/series.pyi @@ -111,6 +111,7 @@ from pandas._typing import ( AnyArrayLike, ArrayLike, Axes, + AxesData, Axis, AxisColumn, AxisIndex, @@ -252,7 +253,7 @@ class Series(IndexOpsMixin[S1], NDFrame): def __new__( cls, data: npt.NDArray[np.float64], - index: Axes | None = ..., + index: AxesData | None = ..., dtype: Dtype = ..., name: Hashable = ..., copy: bool = ..., @@ -261,7 +262,7 @@ class Series(IndexOpsMixin[S1], NDFrame): def __new__( # type: ignore[overload-overlap] # pyright: ignore[reportOverlappingOverload] cls, data: Sequence[Never], - index: Axes | None = ..., + index: AxesData | None = ..., dtype: Dtype = ..., name: Hashable = ..., copy: bool = ..., @@ -270,7 +271,7 @@ class Series(IndexOpsMixin[S1], NDFrame): def __new__( cls, data: Sequence[list[_str]], - index: Axes | None = ..., + index: AxesData | None = ..., dtype: Dtype = ..., name: Hashable = ..., copy: bool = ..., @@ -279,7 +280,7 @@ class Series(IndexOpsMixin[S1], NDFrame): def __new__( cls, data: Sequence[_str], - index: Axes | None = ..., + index: AxesData | None = ..., dtype: Dtype = ..., name: Hashable = ..., copy: bool = ..., @@ -295,7 +296,7 @@ class Series(IndexOpsMixin[S1], NDFrame): | datetime | date ), - index: Axes | None = ..., + index: AxesData | None = ..., dtype: TimestampDtypeArg = ..., name: Hashable = ..., copy: bool = ..., @@ -304,7 +305,7 @@ class Series(IndexOpsMixin[S1], NDFrame): def __new__( cls, data: _ListLike, - index: Axes | None = ..., + index: AxesData | None = ..., *, dtype: TimestampDtypeArg, name: Hashable = ..., @@ -314,7 +315,7 @@ class Series(IndexOpsMixin[S1], NDFrame): def __new__( cls, data: PeriodIndex | Sequence[Period], - index: Axes | None = ..., + index: AxesData | None = ..., dtype: PeriodDtype = ..., name: Hashable = ..., copy: bool = ..., @@ -329,7 +330,7 @@ class Series(IndexOpsMixin[S1], NDFrame): | np.timedelta64 | timedelta ), - index: Axes | None = ..., + index: AxesData | None = ..., dtype: TimedeltaDtypeArg = ..., name: Hashable = ..., copy: bool = ..., @@ -343,7 +344,7 @@ class Series(IndexOpsMixin[S1], NDFrame): | Sequence[Interval[_OrderableT]] | dict[HashableT1, Interval[_OrderableT]] ), - index: Axes | None = ..., + index: AxesData | None = ..., dtype: Literal["Interval"] = ..., name: Hashable = ..., copy: bool = ..., @@ -352,7 +353,7 @@ class Series(IndexOpsMixin[S1], NDFrame): def __new__( # type: ignore[overload-overlap] cls, data: Scalar | _ListLike | dict[HashableT1, Any] | None, - index: Axes | None = ..., + index: AxesData | None = ..., *, dtype: type[S1], name: Hashable = ..., @@ -362,7 +363,7 @@ class Series(IndexOpsMixin[S1], NDFrame): def __new__( # type: ignore[overload-overlap] # pyright: ignore[reportOverlappingOverload] cls, data: Sequence[bool], - index: Axes | None = ..., + index: AxesData | None = ..., dtype: Dtype = ..., name: Hashable = ..., copy: bool = ..., @@ -371,7 +372,7 @@ class Series(IndexOpsMixin[S1], NDFrame): def __new__( # type: ignore[overload-overlap] cls, data: Sequence[int], - index: Axes | None = ..., + index: AxesData | None = ..., dtype: Dtype = ..., name: Hashable = ..., copy: bool = ..., @@ -380,7 +381,7 @@ class Series(IndexOpsMixin[S1], NDFrame): def __new__( cls, data: Sequence[float], - index: Axes | None = ..., + index: AxesData | None = ..., dtype: Dtype = ..., name: Hashable = ..., copy: bool = ..., @@ -389,7 +390,7 @@ class Series(IndexOpsMixin[S1], NDFrame): def __new__( # type: ignore[overload-cannot-match] # pyright: ignore[reportOverlappingOverload] cls, data: Sequence[int | float], - index: Axes | None = ..., + index: AxesData | None = ..., dtype: Dtype = ..., name: Hashable = ..., copy: bool = ..., @@ -398,7 +399,7 @@ class Series(IndexOpsMixin[S1], NDFrame): def __new__( cls, data: S1 | _ListLike[S1] | dict[HashableT1, S1] | dict_keys[S1, Any], - index: Axes | None = ..., + index: AxesData | None = ..., dtype: Dtype = ..., name: Hashable = ..., copy: bool = ..., @@ -415,7 +416,7 @@ class Series(IndexOpsMixin[S1], NDFrame): | NAType | None ) = ..., - index: Axes | None = ..., + index: AxesData | None = ..., dtype: Dtype = ..., name: Hashable = ..., copy: bool = ..., diff --git a/tests/test_series.py b/tests/test_series.py index 3f25d981..b71f6498 100644 --- a/tests/test_series.py +++ b/tests/test_series.py @@ -868,7 +868,7 @@ def test_types_scalar_arithmetic() -> None: def test_types_complex_arithmetic() -> None: - # GH 103 + """Test adding complex number to pd.Series[float] GH 103.""" c = 1 + 1j s = pd.Series([1.0, 2.0, 3.0]) x = s + c @@ -3922,3 +3922,22 @@ def test_series_unstack() -> None: ), pd.DataFrame, ) + + +def test_series_index_type() -> None: + index = {"a": 3, "c": 4} + lst = [1, 2] + + check( + assert_type(pd.Series(lst, index=index), "pd.Series[int]"), + pd.Series, + np.integer, + ) + check( + assert_type(pd.Series([1, 2], index=index.keys()), "pd.Series[int]"), + pd.Series, + np.integer, + ) + + if TYPE_CHECKING_INVALID_USAGE: + t = pd.Series([1, 2], index="ab") # type: ignore[call-overload] # pyright: ignore[reportCallIssue, reportArgumentType]