Skip to content

Commit 2f22555

Browse files
nanne-abenNanne Aben
andauthored
Type annotations for pipe (#55)
* Add type annotations for pipe() * add annotations in other places as well * fix formatting of import statement * update * format test Co-authored-by: Nanne Aben <[email protected]>
1 parent 24384b5 commit 2f22555

File tree

7 files changed

+53
-11
lines changed

7 files changed

+53
-11
lines changed

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def list_packages(source_path: str = src_path) -> None:
2121
setup(
2222
name="pandas-stubs",
2323
package_dir={"": src_path},
24-
version="1.1.0.11",
24+
version="1.1.0.12",
2525
description="Type annotations for Pandas",
2626
long_description=(open("README.md").read()
2727
if os.path.exists("README.md") else ""),

tests/snippets/test_frame.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,3 +500,21 @@ def test_types_from_dict() -> None:
500500
pd.DataFrame.from_dict({'a': {'row1': 2}, 'b': {'row2': 4, 'row1': 4}})
501501
pd.DataFrame.from_dict({'a': (1, 2, 3), 'b': (2, 4, 5)})
502502
pd.DataFrame.from_dict(data={'col_1': {'a': 1}, 'col_2': {'a': 1, 'b': 2}}, orient="columns")
503+
504+
505+
def test_pipe() -> None:
506+
def foo(df: pd.DataFrame) -> pd.DataFrame:
507+
return df
508+
509+
df1: pd.DataFrame = pd.DataFrame({'a': [1]}).pipe(foo)
510+
511+
df2: pd.DataFrame = (
512+
pd.DataFrame({'price': [10, 11, 9, 13, 14, 18, 17, 19], 'volume': [50, 60, 40, 100, 50, 100, 40, 50]})
513+
.assign(week_starting=pd.date_range('01/01/2018', periods=8, freq='W'))
514+
.resample('M', on='week_starting')
515+
.pipe(foo)
516+
)
517+
518+
df3: pd.DataFrame = pd.DataFrame({'a': [1], 'b': [1]}).groupby('a').pipe(foo)
519+
520+
df4: pd.DataFrame = pd.DataFrame({'a': [1], 'b': [1]}).style.pipe(foo)

third_party/3/pandas/core/common.pyi

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from pandas._typing import T as T
22

3-
from typing import Any, Collection, Iterable, Optional, Union
3+
from typing import Any, Collection, Iterable, Optional, Union, Callable, Tuple, TypeVar, overload
44

55
class SettingWithCopyError(ValueError): ...
66
class SettingWithCopyWarning(Warning): ...
@@ -33,5 +33,10 @@ def apply_if_callable(maybe_callable: Any, obj: Any, **kwargs: Any) -> Any: ...
3333
def dict_compat(d: Any) -> Any: ...
3434
def standardize_mapping(into: Any) -> Any: ...
3535
def random_state(state: Optional[Any] = ...) -> Any: ...
36-
def pipe(obj: Any, func: Any, *args: Any, **kwargs: Any) -> Any: ...
3736
def get_rename_function(mapper: Any) -> Any: ...
37+
38+
PipeReturn = TypeVar("PipeReturn")
39+
@overload
40+
def pipe(obj: Any, func: Union[Callable[..., PipeReturn], Tuple[Callable[..., PipeReturn], str]], *args: Any, **kwargs: Any) -> PipeReturn: ...
41+
@overload
42+
def pipe(obj: Any, func: PipeReturn, *args: Any, **kwargs: Any) -> PipeReturn: ...

third_party/3/pandas/core/generic.pyi

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ from __future__ import annotations
22

33
import sys
44
from typing import Any, Callable, Dict, Hashable, List, Mapping, Optional, Sequence, Tuple, TypeVar, Union, AnyStr, overload
5+
from pandas.core.resample import Resampler
56

67
if sys.version_info >= (3, 8):
78
from typing import Literal
@@ -24,6 +25,7 @@ from pandas.core.internals import BlockManager
2425
bool_t = bool
2526

2627
Self = TypeVar('Self', bound=NDFrame)
28+
PipeReturn = TypeVar('PipeReturn')
2729

2830
class NDFrame(PandasObject, SelectionMixin, indexing.IndexingMixin):
2931
__array_priority__: int = ...
@@ -110,7 +112,10 @@ class NDFrame(PandasObject, SelectionMixin, indexing.IndexingMixin):
110112
def head(self, n: int = ...) -> FrameOrSeries: ...
111113
def tail(self, n: int = ...) -> FrameOrSeries: ...
112114
def sample(self, n: int = ..., frac: float = ..., replace: bool_t = ..., weights: Union[str, ArrayLike] = ..., random_state: Union[int, np.random.RandomState] = ..., axis: Optional[AxisOption] = ...) -> FrameOrSeries: ...
113-
def pipe(self, func: Any, *args: Any, **kwargs: Any) -> Any: ...
115+
@overload
116+
def pipe(self: Any, func: Union[Callable[..., PipeReturn], Tuple[Callable[..., PipeReturn], str]], *args: Any, **kwargs: Any) -> PipeReturn: ...
117+
@overload
118+
def pipe(self: Any, func: PipeReturn, *args: Any, **kwargs: Any) -> PipeReturn: ...
114119
def __finalize__(self, other: Any, method: Any = ..., **kwargs: Any) -> FrameOrSeries: ...
115120
@property
116121
def values(self) -> np.ndarray: ...
@@ -140,7 +145,7 @@ class NDFrame(PandasObject, SelectionMixin, indexing.IndexingMixin):
140145
def asfreq(self, freq: Any, method: Any = ..., how: Optional[str]=..., normalize: bool_t=..., fill_value: Any = ...) -> FrameOrSeries: ...
141146
def at_time(self, time: Any, asof: bool_t=..., axis: Any = ...) -> FrameOrSeries: ...
142147
def between_time(self, start_time: Any, end_time: Any, include_start: bool_t=..., include_end: bool_t=..., axis: Any = ...) -> FrameOrSeries: ...
143-
def resample(self, rule: Any, axis: Any = ..., closed: Optional[str]=..., label: Optional[str]=..., convention: str=..., kind: Optional[str]=..., loffset: Any = ..., base: int=..., on: Any = ..., level: Any = ..., origin: Union[Timestamp, str] = ..., offset: Union[Timedelta, str] = ...) -> Any: ...
148+
def resample(self, rule: Any, axis: Any = ..., closed: Optional[str]=..., label: Optional[str]=..., convention: str=..., kind: Optional[str]=..., loffset: Any = ..., base: int=..., on: Any = ..., level: Any = ..., origin: Union[Timestamp, str] = ..., offset: Union[Timedelta, str] = ...) -> Resampler: ...
144149
def first(self, offset: Any) -> FrameOrSeries: ...
145150
def last(self, offset: Any) -> FrameOrSeries: ...
146151
def rank(self, axis: Any = ..., method: str=..., numeric_only: Optional[bool_t]=..., na_option: str=..., ascending: bool_t=..., pct: bool_t=...) -> FrameOrSeries: ...

third_party/3/pandas/core/groupby/groupby.pyi

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ from pandas.core.series import Series as Series
1515
from pandas.core.sorting import get_group_index_sorter as get_group_index_sorter
1616
from pandas.errors import AbstractMethodError as AbstractMethodError
1717
from pandas.util._decorators import Appender as Appender, Substitution as Substitution, cache_readonly as cache_readonly
18-
from typing import Any, List, Optional, Union, Hashable, Callable, Mapping
18+
from typing import Any, List, Optional, Union, Hashable, Callable, Mapping, TypeVar, Tuple, overload
19+
20+
PipeReturn = TypeVar('PipeReturn')
1921

2022

2123
class GroupByPlot(PandasObject):
@@ -53,7 +55,10 @@ class _GroupBy(PandasObject, SelectionMixin):
5355
@property
5456
def indices(self) -> Any: ...
5557
def __getattr__(self, attr: str) -> Any: ...
56-
def pipe(self, func: Any, *args: Any, **kwargs: Any) -> Any: ...
58+
@overload
59+
def pipe(self: Any, func: Union[Callable[..., PipeReturn], Tuple[Callable[..., PipeReturn], str]], *args: Any, **kwargs: Any) -> PipeReturn: ...
60+
@overload
61+
def pipe(self: Any, func: PipeReturn, *args: Any, **kwargs: Any) -> PipeReturn: ...
5762
plot: Any = ...
5863
def get_group(self, name: Any, obj: Optional[Any] = ...) -> Any: ...
5964
def __iter__(self) -> Any: ...

third_party/3/pandas/core/resample.pyi

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ from pandas.core.groupby.grouper import Grouper as Grouper
55
from pandas.core.indexes.datetimes import DatetimeIndex as DatetimeIndex
66
from pandas.core.indexes.period import PeriodIndex as PeriodIndex
77
from pandas.core.indexes.timedeltas import TimedeltaIndex as TimedeltaIndex
8-
from typing import Any, Optional
8+
from typing import Any, Optional, TypeVar, Union, Callable, Tuple, overload
9+
10+
PipeReturn = TypeVar('PipeReturn')
911

1012
class Resampler(_GroupBy, ShallowMixin):
1113
groupby: Any = ...
@@ -26,7 +28,10 @@ class Resampler(_GroupBy, ShallowMixin):
2628
def obj(self) -> Any: ...
2729
@property
2830
def ax(self) -> Any: ...
29-
def pipe(self, func: Any, *args: Any, **kwargs: Any) -> Any: ...
31+
@overload
32+
def pipe(self: Any, func: Union[Callable[..., PipeReturn], Tuple[Callable[..., PipeReturn], str]], *args: Any, **kwargs: Any) -> PipeReturn: ...
33+
@overload
34+
def pipe(self: Any, func: PipeReturn, *args: Any, **kwargs: Any) -> PipeReturn: ...
3035
def aggregate(self, func: Any, *args: Any, **kwargs: Any) -> Any: ...
3136
agg: Any = ...
3237
apply: Any = ...

third_party/3/pandas/io/formats/style.pyi

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
from pandas._config import get_option as get_option
22
from pandas.util._decorators import Appender as Appender
3-
from typing import Any, Optional
3+
from typing import Any, Optional, Callable, TypeVar, Tuple, Union, overload
44

55
jinja2: Any
66
has_mpl: bool
77
no_mpl_message: str
8+
PipeReturn = TypeVar('PipeReturn')
89

910
class Styler:
1011
loader: Any = ...
@@ -51,4 +52,7 @@ class Styler:
5152
def highlight_min(self, subset: Optional[Any] = ..., color: str = ..., axis: int = ...) -> Any: ...
5253
@classmethod
5354
def from_custom_template(cls, searchpath: Any, name: Any) -> Any: ...
54-
def pipe(self, func: Any, *args: Any, **kwargs: Any) -> Any: ...
55+
@overload
56+
def pipe(self: Any, func: Union[Callable[..., PipeReturn], Tuple[Callable[..., PipeReturn], str]], *args: Any, **kwargs: Any) -> PipeReturn: ...
57+
@overload
58+
def pipe(self: Any, func: PipeReturn, *args: Any, **kwargs: Any) -> PipeReturn: ...

0 commit comments

Comments
 (0)