diff --git a/pandas-stubs/core/indexes/base.pyi b/pandas-stubs/core/indexes/base.pyi index 1bfe42f88..88d29c218 100644 --- a/pandas-stubs/core/indexes/base.pyi +++ b/pandas-stubs/core/indexes/base.pyi @@ -73,7 +73,7 @@ class Index(IndexOpsMixin[S1]): *, dtype: Literal["int"] | type_t[int | np.integer] = ..., copy: bool = ..., - name=..., + name: Hashable = ..., tupleize_cols: bool = ..., **kwargs, ) -> Index[int]: ... @@ -84,7 +84,7 @@ class Index(IndexOpsMixin[S1]): *, dtype: Literal["int"] | type_t[int | np.integer], copy: bool = ..., - name=..., + name: Hashable = ..., tupleize_cols: bool = ..., **kwargs, ) -> Index[int]: ... @@ -95,7 +95,7 @@ class Index(IndexOpsMixin[S1]): *, dtype: Literal["float"] | type_t[float | np.floating] = ..., copy: bool = ..., - name=..., + name: Hashable = ..., tupleize_cols: bool = ..., **kwargs, ) -> Index[float]: ... @@ -106,7 +106,7 @@ class Index(IndexOpsMixin[S1]): *, dtype: Literal["float"] | type_t[float | np.floating], copy: bool = ..., - name=..., + name: Hashable = ..., tupleize_cols: bool = ..., **kwargs, ) -> Index[float]: ... @@ -121,7 +121,7 @@ class Index(IndexOpsMixin[S1]): *, dtype: Literal["complex"] | type_t[complex | np.complexfloating] = ..., copy: bool = ..., - name=..., + name: Hashable = ..., tupleize_cols: bool = ..., **kwargs, ) -> Index[complex]: ... @@ -132,7 +132,7 @@ class Index(IndexOpsMixin[S1]): *, dtype: Literal["complex"] | type_t[complex | np.complexfloating], copy: bool = ..., - name=..., + name: Hashable = ..., tupleize_cols: bool = ..., **kwargs, ) -> Index[complex]: ... @@ -144,7 +144,7 @@ class Index(IndexOpsMixin[S1]): *, dtype: TimestampDtypeArg = ..., copy: bool = ..., - name=..., + name: Hashable = ..., tupleize_cols: bool = ..., **kwargs, ) -> DatetimeIndex: ... @@ -155,7 +155,7 @@ class Index(IndexOpsMixin[S1]): *, dtype: TimestampDtypeArg, copy: bool = ..., - name=..., + name: Hashable = ..., tupleize_cols: bool = ..., **kwargs, ) -> DatetimeIndex: ... @@ -166,7 +166,7 @@ class Index(IndexOpsMixin[S1]): *, dtype: PeriodDtype = ..., copy: bool = ..., - name=..., + name: Hashable = ..., tupleize_cols: bool = ..., **kwargs, ) -> PeriodIndex: ... @@ -177,7 +177,7 @@ class Index(IndexOpsMixin[S1]): *, dtype: PeriodDtype, copy: bool = ..., - name=..., + name: Hashable = ..., tupleize_cols: bool = ..., **kwargs, ) -> PeriodIndex: ... @@ -188,7 +188,7 @@ class Index(IndexOpsMixin[S1]): *, dtype: TimedeltaDtypeArg = ..., copy: bool = ..., - name=..., + name: Hashable = ..., tupleize_cols: bool = ..., **kwargs, ) -> TimedeltaIndex: ... @@ -199,7 +199,7 @@ class Index(IndexOpsMixin[S1]): *, dtype: TimedeltaDtypeArg, copy: bool = ..., - name=..., + name: Hashable = ..., tupleize_cols: bool = ..., **kwargs, ) -> TimedeltaIndex: ... @@ -210,7 +210,7 @@ class Index(IndexOpsMixin[S1]): *, dtype: Literal["Interval"] = ..., copy: bool = ..., - name=..., + name: Hashable = ..., tupleize_cols: bool = ..., **kwargs, ) -> IntervalIndex[Interval[_OrderableT]]: ... @@ -221,7 +221,7 @@ class Index(IndexOpsMixin[S1]): *, dtype: Literal["Interval"], copy: bool = ..., - name=..., + name: Hashable = ..., tupleize_cols: bool = ..., **kwargs, ) -> IntervalIndex[Interval[Any]]: ... @@ -233,7 +233,7 @@ class Index(IndexOpsMixin[S1]): *, dtype: type[S1] = ..., copy: bool = ..., - name=..., + name: Hashable = ..., tupleize_cols: bool = ..., **kwargs, ) -> Self: ... @@ -244,7 +244,7 @@ class Index(IndexOpsMixin[S1]): *, dtype: type[S1], copy: bool = ..., - name=..., + name: Hashable = ..., tupleize_cols: bool = ..., **kwargs, ) -> Self: ... @@ -256,7 +256,7 @@ class Index(IndexOpsMixin[S1]): *, dtype=..., copy: bool = ..., - name=..., + name: Hashable = ..., tupleize_cols: bool = ..., **kwargs, ) -> Self: ... @@ -277,14 +277,14 @@ class Index(IndexOpsMixin[S1]): self, indices, axis: int = ..., allow_fill: bool = ..., fill_value=..., **kwargs ): ... def repeat(self, repeats, axis=...): ... - def copy(self, name=..., deep: bool = ...) -> Self: ... + def copy(self, name: Hashable = ..., deep: bool = ...) -> Self: ... def __copy__(self, **kwargs): ... def __deepcopy__(self, memo=...): ... def format( self, name: bool = ..., formatter: Callable | None = ..., na_rep: _str = ... ) -> list[_str]: ... def to_flat_index(self): ... - def to_series(self, index=..., name=...) -> Series: ... + def to_series(self, index=..., name: Hashable = ...) -> Series: ... def to_frame(self, index: bool = ..., name=...) -> DataFrame: ... @property def name(self): ... @@ -341,7 +341,7 @@ class Index(IndexOpsMixin[S1]): def intersection(self, other: list[S1] | Self, sort: bool = ...) -> Self: ... def difference(self, other: list | Index, sort: bool | None = None) -> Self: ... def symmetric_difference( - self, other: list[S1] | Self, result_name=..., sort=... + self, other: list[S1] | Self, result_name: Hashable = ..., sort=... ) -> Self: ... def get_loc( self, diff --git a/pandas-stubs/core/indexes/category.pyi b/pandas-stubs/core/indexes/category.pyi index 24efa77b8..18b3e1153 100644 --- a/pandas-stubs/core/indexes/category.pyi +++ b/pandas-stubs/core/indexes/category.pyi @@ -1,4 +1,7 @@ -from collections.abc import Iterable +from collections.abc import ( + Hashable, + Iterable, +) from typing import Literal import numpy as np @@ -22,7 +25,7 @@ class CategoricalIndex(ExtensionIndex[S1], accessor.PandasDelegate): ordered=..., dtype=..., copy: bool = ..., - name=..., + name: Hashable = ..., ) -> Self: ... def equals(self, other): ... @property diff --git a/pandas-stubs/core/indexes/datetimes.pyi b/pandas-stubs/core/indexes/datetimes.pyi index 5e89a8d8f..20160c725 100644 --- a/pandas-stubs/core/indexes/datetimes.pyi +++ b/pandas-stubs/core/indexes/datetimes.pyi @@ -9,7 +9,10 @@ from datetime import ( ) from typing import overload -from _typing import TimeZones +from _typing import ( + Frequency, + TimeZones, +) import numpy as np from pandas import ( DataFrame, @@ -29,6 +32,7 @@ from pandas._typing import ( AnyArrayLike, ArrayLike, DateAndDatetimeLike, + Dtype, IntervalClosedType, TimeUnit, ) @@ -41,14 +45,14 @@ class DatetimeIndex(DatetimeTimedeltaMixin[Timestamp], DatetimeIndexProperties): def __init__( self, data: ArrayLike | AnyArrayLike | list | tuple, - freq=..., - tz=..., + freq: Frequency = ..., + tz: TimeZones = ..., ambiguous: str = ..., dayfirst: bool = ..., yearfirst: bool = ..., - dtype=..., + dtype: Dtype = ..., copy: bool = ..., - name=..., + name: Hashable = ..., ) -> None: ... def __array__(self, dtype=...) -> np.ndarray: ... def __reduce__(self): ... @@ -70,7 +74,7 @@ class DatetimeIndex(DatetimeTimedeltaMixin[Timestamp], DatetimeIndexProperties): def __sub__( self, other: datetime | Timestamp | DatetimeIndex ) -> TimedeltaIndex: ... - def to_series(self, index=..., name=...) -> TimestampSeries: ... + def to_series(self, index=..., name: Hashable = ...) -> TimestampSeries: ... def snap(self, freq: str = ...): ... def slice_indexer(self, start=..., end=..., step=...): ... def searchsorted(self, value, side: str = ..., sorter=...): ... diff --git a/pandas-stubs/core/indexes/multi.pyi b/pandas-stubs/core/indexes/multi.pyi index 95b1ede35..75ecd850b 100644 --- a/pandas-stubs/core/indexes/multi.pyi +++ b/pandas-stubs/core/indexes/multi.pyi @@ -9,6 +9,7 @@ from typing import ( overload, ) +from _typing import SequenceNotStr import numpy as np import pandas as pd from pandas.core.indexes.base import Index @@ -29,33 +30,29 @@ class MultiIndex(Index[Any]): levels=..., codes=..., sortorder=..., - names=..., + names: SequenceNotStr[Hashable] = ..., dtype=..., copy=..., - name=..., + name: SequenceNotStr[Hashable] = ..., verify_integrity: bool = ..., _set_identity: bool = ..., ) -> Self: ... - def __init__( - self, - levels=..., - codes=..., - sortorder=..., - names=..., - dtype=..., - copy=..., - name=..., - verify_integrity: bool = ..., - _set_identity: bool = ..., - ) -> None: ... @classmethod - def from_arrays(cls, arrays, sortorder=..., names=...) -> Self: ... + def from_arrays( + cls, arrays, sortorder=..., names: SequenceNotStr[Hashable] = ... + ) -> Self: ... @classmethod - def from_tuples(cls, tuples, sortorder=..., names=...) -> Self: ... + def from_tuples( + cls, tuples, sortorder=..., names: SequenceNotStr[Hashable] = ... + ) -> Self: ... @classmethod - def from_product(cls, iterables, sortorder=..., names=...) -> Self: ... + def from_product( + cls, iterables, sortorder=..., names: SequenceNotStr[Hashable] = ... + ) -> Self: ... @classmethod - def from_frame(cls, df, sortorder=..., names=...) -> Self: ... + def from_frame( + cls, df, sortorder=..., names: SequenceNotStr[Hashable] = ... + ) -> Self: ... @property def shape(self): ... @property # Should be read-only diff --git a/pandas-stubs/core/indexes/period.pyi b/pandas-stubs/core/indexes/period.pyi index a2884a37a..88cea196a 100644 --- a/pandas-stubs/core/indexes/period.pyi +++ b/pandas-stubs/core/indexes/period.pyi @@ -26,7 +26,7 @@ class PeriodIndex(DatetimeIndexOpsMixin[pd.Period], PeriodIndexFieldOps): tz=..., dtype=..., copy: bool = ..., - name=..., + name: Hashable = ..., **fields, ): ... @property diff --git a/pandas-stubs/core/indexes/range.pyi b/pandas-stubs/core/indexes/range.pyi index b7569fd23..776daea15 100644 --- a/pandas-stubs/core/indexes/range.pyi +++ b/pandas-stubs/core/indexes/range.pyi @@ -1,4 +1,7 @@ -from collections.abc import Sequence +from collections.abc import ( + Hashable, + Sequence, +) from typing import overload import numpy as np @@ -19,10 +22,10 @@ class RangeIndex(Index[int]): step: int = ..., dtype=..., copy: bool = ..., - name=..., + name: Hashable = ..., ): ... @classmethod - def from_range(cls, data, name=..., dtype=...): ... + def from_range(cls, data, name: Hashable = ..., dtype=...): ... def __reduce__(self): ... @property def start(self) -> int: ... @@ -46,7 +49,7 @@ class RangeIndex(Index[int]): def __contains__(self, key: int | np.integer) -> bool: ... def get_indexer(self, target, method=..., limit=..., tolerance=...): ... def tolist(self): ... - def copy(self, name=..., deep: bool = ..., dtype=..., **kwargs): ... + def copy(self, name: Hashable = ..., deep: bool = ..., dtype=..., **kwargs): ... def min(self, axis=..., skipna: bool = ..., *args, **kwargs): ... def max(self, axis=..., skipna: bool = ..., *args, **kwargs): ... def argsort(self, *args, **kwargs): ... diff --git a/pandas-stubs/core/indexes/timedeltas.pyi b/pandas-stubs/core/indexes/timedeltas.pyi index 921f9e842..93bf32aff 100644 --- a/pandas-stubs/core/indexes/timedeltas.pyi +++ b/pandas-stubs/core/indexes/timedeltas.pyi @@ -76,7 +76,7 @@ class TimedeltaIndex(DatetimeTimedeltaMixin[Timedelta], TimedeltaIndexProperties @property def inferred_type(self) -> str: ... def insert(self, loc, item): ... - def to_series(self, index=..., name=...) -> TimedeltaSeries: ... + def to_series(self, index=..., name: Hashable = ...) -> TimedeltaSeries: ... def timedelta_range( start: TimedeltaConvertibleTypes = ..., diff --git a/tests/test_indexes.py b/tests/test_indexes.py index 25285d954..06d6d0d14 100644 --- a/tests/test_indexes.py +++ b/tests/test_indexes.py @@ -64,6 +64,21 @@ def test_multiindex_get_level_values() -> None: check(assert_type(i1, pd.Index), pd.Index) +def test_multiindex_constructor() -> None: + check( + assert_type( + pd.MultiIndex([[1], [4]], codes=[[0], [0]], name=["a", "b"]), pd.MultiIndex + ), + pd.MultiIndex, + ) + check( + assert_type( + pd.MultiIndex([[1], [4]], codes=[[0], [0]], names=["a", "b"]), pd.MultiIndex + ), + pd.MultiIndex, + ) + + def test_index_tolist() -> None: i1 = pd.Index([1, 2, 3]) check(assert_type(i1.tolist(), list[int]), list, int) @@ -1053,6 +1068,22 @@ def test_index_constructors(): pd.Index(flist, dtype=np.float16) +def test_datetime_index_constructor() -> None: + check(assert_type(pd.DatetimeIndex(["2020"]), pd.DatetimeIndex), pd.DatetimeIndex) + check( + assert_type(pd.DatetimeIndex(["2020"], name="ts"), pd.DatetimeIndex), + pd.DatetimeIndex, + ) + check( + assert_type(pd.DatetimeIndex(["2020"], freq="D"), pd.DatetimeIndex), + pd.DatetimeIndex, + ) + check( + assert_type(pd.DatetimeIndex(["2020"], tz="Asia/Kathmandu"), pd.DatetimeIndex), + pd.DatetimeIndex, + ) + + def test_iter() -> None: # GH 723 with pytest_warns_bounded(