From 723f9f844254914c8eac0096021c7b8b3240e8d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20W=C3=B6rtwein?= Date: Thu, 5 Oct 2023 22:34:43 -0400 Subject: [PATCH 1/3] TYP: NDFrame.__round__ --- .pre-commit-config.yaml | 4 ++-- pandas-stubs/core/generic.pyi | 3 ++- tests/test_series.py | 6 ++++++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index dadc04e3d..d5c2791f7 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ repos: hooks: - id: isort - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.0.291 + rev: v0.0.292 hooks: - id: ruff args: [ @@ -23,7 +23,7 @@ repos: --fix ] - repo: https://github.com/codespell-project/codespell - rev: v2.2.5 + rev: v2.2.6 hooks: - id: codespell additional_dependencies: [ tomli ] diff --git a/pandas-stubs/core/generic.pyi b/pandas-stubs/core/generic.pyi index 5ff08dff1..d3143fbf9 100644 --- a/pandas-stubs/core/generic.pyi +++ b/pandas-stubs/core/generic.pyi @@ -19,6 +19,7 @@ from pandas import Index import pandas.core.indexing as indexing from pandas.core.series import Series import sqlalchemy.engine +from typing_extensions import Self from pandas._typing import ( S1, @@ -86,7 +87,7 @@ class NDFrame(indexing.IndexingMixin): @final def bool(self) -> _bool: ... def __abs__(self) -> NDFrame: ... - def __round__(self, decimals: int = ...) -> NDFrame: ... + def __round__(self, decimals: int = ...) -> Self: ... def keys(self): ... def __len__(self) -> int: ... def __contains__(self, key) -> _bool: ... diff --git a/tests/test_series.py b/tests/test_series.py index 49df893a2..1d260d7f2 100644 --- a/tests/test_series.py +++ b/tests/test_series.py @@ -2830,3 +2830,9 @@ def test_series_setitem_na() -> None: s2 = df["y"].copy() s2.loc[ind] = pd.NaT s2.iloc[[0, 2]] = pd.NaT + + +def test_round() -> None: + # GH 791 + check(assert_type(round(pd.DataFrame([])), pd.DataFrame), pd.DataFrame) + check(assert_type(round(pd.Series([1])), "pd.Series[int]"), pd.Series) From 5de800086c788a6e8ba654cc2b8d8485911b5b72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20W=C3=B6rtwein?= Date: Thu, 5 Oct 2023 22:55:28 -0400 Subject: [PATCH 2/3] more Self --- pandas-stubs/core/generic.pyi | 69 +++++++++++++++++------------------ tests/test_series.py | 2 +- 2 files changed, 34 insertions(+), 37 deletions(-) diff --git a/pandas-stubs/core/generic.pyi b/pandas-stubs/core/generic.pyi index d3143fbf9..f357f80d5 100644 --- a/pandas-stubs/core/generic.pyi +++ b/pandas-stubs/core/generic.pyi @@ -40,7 +40,6 @@ from pandas._typing import ( IgnoreRaise, IndexLabel, Level, - NDFrameT, ReplaceMethod, SortKind, StorageOptions, @@ -58,11 +57,11 @@ class NDFrame(indexing.IndexingMixin): __hash__: ClassVar[None] # type: ignore[assignment] def set_flags( - self: NDFrameT, + self, *, copy: bool = ..., allows_duplicate_labels: bool | None = ..., - ) -> NDFrameT: ... + ) -> Self: ... @property def attrs(self) -> dict[Hashable | None, Any]: ... @attrs.setter @@ -81,12 +80,12 @@ class NDFrame(indexing.IndexingMixin): def droplevel(self, level: Level, axis: AxisIndex = ...) -> NDFrame: ... def squeeze(self, axis=...): ... def equals(self, other: Series[S1]) -> _bool: ... - def __neg__(self: NDFrameT) -> NDFrameT: ... - def __pos__(self: NDFrameT) -> NDFrameT: ... + def __neg__(self) -> Self: ... + def __pos__(self) -> Self: ... def __nonzero__(self) -> None: ... @final def bool(self) -> _bool: ... - def __abs__(self) -> NDFrame: ... + def __abs__(self) -> Self: ... def __round__(self, decimals: int = ...) -> Self: ... def keys(self): ... def __len__(self) -> int: ... @@ -286,7 +285,7 @@ class NDFrame(indexing.IndexingMixin): ) -> _str: ... def take( self, indices, axis=..., is_copy: _bool | None = ..., **kwargs - ) -> NDFrame: ... + ) -> Self: ... def __delitem__(self, idx: Hashable) -> None: ... def get(self, key: object, default: Dtype | None = ...) -> Dtype: ... def reindex_like( @@ -296,7 +295,7 @@ class NDFrame(indexing.IndexingMixin): copy: _bool = ..., limit=..., tolerance=..., - ) -> NDFrame: ... + ) -> Self: ... @overload def drop( self, @@ -311,7 +310,7 @@ class NDFrame(indexing.IndexingMixin): ) -> None: ... @overload def drop( - self: NDFrame, + self, labels: Hashable | Sequence[Hashable] = ..., *, axis: Axis = ..., @@ -320,10 +319,10 @@ class NDFrame(indexing.IndexingMixin): level: Level | None = ..., inplace: Literal[False] = ..., errors: IgnoreRaise = ..., - ) -> NDFrame: ... + ) -> Self: ... @overload def drop( - self: NDFrame, + self, labels: Hashable | Sequence[Hashable] = ..., *, axis: Axis = ..., @@ -332,9 +331,9 @@ class NDFrame(indexing.IndexingMixin): level: Level | None = ..., inplace: _bool = ..., errors: IgnoreRaise = ..., - ) -> NDFrame | None: ... - def add_prefix(self, prefix: _str) -> NDFrame: ... - def add_suffix(self, suffix: _str) -> NDFrame: ... + ) -> Self | None: ... + def add_prefix(self, prefix: _str) -> Self: ... + def add_suffix(self, suffix: _str) -> Self: ... def sort_index( self, *, @@ -353,9 +352,9 @@ class NDFrame(indexing.IndexingMixin): like: _str | None = ..., regex: _str | None = ..., axis=..., - ) -> NDFrame: ... - def head(self: NDFrameT, n: int = ...) -> NDFrameT: ... - def tail(self: NDFrameT, n: int = ...) -> NDFrameT: ... + ) -> Self: ... + def head(self, n: int = ...) -> Self: ... + def tail(self, n: int = ...) -> Self: ... def pipe( self, func: Callable[..., T] | tuple[Callable[..., T], str], *args, **kwargs ) -> T: ... @@ -365,18 +364,18 @@ class NDFrame(indexing.IndexingMixin): def values(self) -> ArrayLike: ... @property def dtypes(self): ... - def copy(self: NDFrameT, deep: _bool = ...) -> NDFrameT: ... - def __copy__(self, deep: _bool = ...) -> NDFrame: ... - def __deepcopy__(self, memo=...) -> NDFrame: ... + def copy(self, deep: _bool = ...) -> Self: ... + def __copy__(self, deep: _bool = ...) -> Self: ... + def __deepcopy__(self, memo=...) -> Self: ... def infer_objects(self) -> NDFrame: ... def convert_dtypes( - self: NDFrameT, + self, infer_objects: _bool = ..., convert_string: _bool = ..., convert_integer: _bool = ..., convert_boolean: _bool = ..., dtype_backend: DtypeBackend = ..., - ) -> NDFrameT: ... + ) -> Self: ... def fillna( self, value=..., @@ -404,7 +403,7 @@ class NDFrame(indexing.IndexingMixin): def notnull(self) -> NDFrame: ... def clip( self, lower=..., upper=..., *, axis=..., inplace: _bool = ..., **kwargs - ) -> NDFrame: ... + ) -> Self: ... def asfreq( self, freq, @@ -412,14 +411,14 @@ class NDFrame(indexing.IndexingMixin): how: Literal["start", "end"] | None = ..., normalize: _bool = ..., fill_value=..., - ) -> NDFrame: ... - def at_time(self, time, asof: _bool = ..., axis=...) -> NDFrame: ... + ) -> Self: ... + def at_time(self, time, asof: _bool = ..., axis=...) -> Self: ... def between_time( self, start_time, end_time, axis=..., - ) -> NDFrame: ... + ) -> Self: ... def first(self, offset) -> NDFrame: ... def last(self, offset) -> NDFrame: ... def rank( @@ -451,13 +450,11 @@ class NDFrame(indexing.IndexingMixin): level=..., try_cast: _bool = ..., ): ... - def shift(self, periods=..., freq=..., axis=..., fill_value=...) -> NDFrame: ... - def slice_shift(self, periods: int = ..., axis=...) -> NDFrame: ... - def tshift(self, periods: int = ..., freq=..., axis=...) -> NDFrame: ... - def truncate( - self, before=..., after=..., axis=..., copy: _bool = ... - ) -> NDFrame: ... - def tz_convert(self, tz, axis=..., level=..., copy: _bool = ...) -> NDFrame: ... + def shift(self, periods=..., freq=..., axis=..., fill_value=...) -> Self: ... + def slice_shift(self, periods: int = ..., axis=...) -> Self: ... + def tshift(self, periods: int = ..., freq=..., axis=...) -> Self: ... + def truncate(self, before=..., after=..., axis=..., copy: _bool = ...) -> Self: ... + def tz_convert(self, tz, axis=..., level=..., copy: _bool = ...) -> Self: ... def tz_localize( self, tz, @@ -466,8 +463,8 @@ class NDFrame(indexing.IndexingMixin): copy: _bool = ..., ambiguous=..., nonexistent: str = ..., - ) -> NDFrame: ... - def abs(self) -> NDFrame: ... + ) -> Self: ... + def abs(self) -> Self: ... def describe( self, percentiles=..., @@ -477,6 +474,6 @@ class NDFrame(indexing.IndexingMixin): ) -> NDFrame: ... def pct_change( self, periods=..., fill_method=..., limit=..., freq=..., **kwargs - ) -> NDFrame: ... + ) -> Self: ... def first_valid_index(self): ... def last_valid_index(self): ... diff --git a/tests/test_series.py b/tests/test_series.py index 1d260d7f2..54ac982f2 100644 --- a/tests/test_series.py +++ b/tests/test_series.py @@ -2835,4 +2835,4 @@ def test_series_setitem_na() -> None: def test_round() -> None: # GH 791 check(assert_type(round(pd.DataFrame([])), pd.DataFrame), pd.DataFrame) - check(assert_type(round(pd.Series([1])), "pd.Series[int]"), pd.Series) + check(assert_type(round(pd.Series([1], dtype=int)), "pd.Series[int]"), pd.Series) From a3436277130ec8d75a01bbc1a8f91e98234fc568 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20W=C3=B6rtwein?= Date: Fri, 6 Oct 2023 09:39:35 -0400 Subject: [PATCH 3/3] a few more Selfs --- pandas-stubs/core/generic.pyi | 13 +++++-------- pandas-stubs/core/series.pyi | 4 +--- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/pandas-stubs/core/generic.pyi b/pandas-stubs/core/generic.pyi index f357f80d5..9c9cb0dd5 100644 --- a/pandas-stubs/core/generic.pyi +++ b/pandas-stubs/core/generic.pyi @@ -74,10 +74,7 @@ class NDFrame(indexing.IndexingMixin): def ndim(self) -> int: ... @property def size(self) -> int: ... - def swapaxes( - self, axis1: AxisIndex, axis2: AxisIndex, copy: _bool = ... - ) -> NDFrame: ... - def droplevel(self, level: Level, axis: AxisIndex = ...) -> NDFrame: ... + def droplevel(self, level: Level, axis: AxisIndex = ...) -> Self: ... def squeeze(self, axis=...): ... def equals(self, other: Series[S1]) -> _bool: ... def __neg__(self) -> Self: ... @@ -358,7 +355,7 @@ class NDFrame(indexing.IndexingMixin): def pipe( self, func: Callable[..., T] | tuple[Callable[..., T], str], *args, **kwargs ) -> T: ... - def __finalize__(self, other, method=..., **kwargs) -> NDFrame: ... + def __finalize__(self, other, method=..., **kwargs) -> Self: ... def __setattr__(self, name: _str, value) -> None: ... @property def values(self) -> ArrayLike: ... @@ -367,7 +364,7 @@ class NDFrame(indexing.IndexingMixin): def copy(self, deep: _bool = ...) -> Self: ... def __copy__(self, deep: _bool = ...) -> Self: ... def __deepcopy__(self, memo=...) -> Self: ... - def infer_objects(self) -> NDFrame: ... + def infer_objects(self) -> Self: ... def convert_dtypes( self, infer_objects: _bool = ..., @@ -419,8 +416,8 @@ class NDFrame(indexing.IndexingMixin): end_time, axis=..., ) -> Self: ... - def first(self, offset) -> NDFrame: ... - def last(self, offset) -> NDFrame: ... + def first(self, offset) -> Self: ... + def last(self, offset) -> Self: ... def rank( self, axis=..., diff --git a/pandas-stubs/core/series.pyi b/pandas-stubs/core/series.pyi index f7a5e4713..d9dbda45c 100644 --- a/pandas-stubs/core/series.pyi +++ b/pandas-stubs/core/series.pyi @@ -1138,9 +1138,7 @@ class Series(IndexOpsMixin[S1], NDFrame): def swapaxes( self, axis1: AxisIndex, axis2: AxisIndex, copy: _bool = ... ) -> Series[S1]: ... - def droplevel( - self, level: Level | list[Level], axis: AxisIndex = ... - ) -> DataFrame: ... + def droplevel(self, level: Level | list[Level], axis: AxisIndex = ...) -> Self: ... def pop(self, item: Hashable) -> S1: ... def squeeze(self, axis: AxisIndex | None = ...) -> Scalar: ... def __abs__(self) -> Series[S1]: ...