Skip to content

Commit 8a52340

Browse files
authored
Type DataFrame methods: boxplot, hist, pivot_table (#1472)
* Type `DataFrame` methods: `__dataframe__`, `first`, `last`, `asfreq`, `where` * add 'mean' default, correct 'All' default, specify
1 parent 2bc8049 commit 8a52340

File tree

4 files changed

+284
-67
lines changed

4 files changed

+284
-67
lines changed

pandas-stubs/core/frame.pyi

Lines changed: 81 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ from pandas.core.indexing import (
5555
_LocIndexer,
5656
)
5757
from pandas.core.reshape.pivot import (
58+
_PivotAggFunc,
5859
_PivotTableColumnsTypes,
5960
_PivotTableIndexTypes,
6061
_PivotTableValuesTypes,
@@ -124,6 +125,7 @@ from pandas._typing import (
124125
Level,
125126
ListLike,
126127
ListLikeExceptSeriesAndStr,
128+
ListLikeHashable,
127129
ListLikeU,
128130
MaskType,
129131
MergeHow,
@@ -167,6 +169,7 @@ from pandas._typing import (
167169

168170
from pandas.io.formats.style import Styler
169171
from pandas.plotting import PlotAccessor
172+
from pandas.plotting._core import _BoxPlotT
170173

171174
_T_MUTABLE_MAPPING_co = TypeVar(
172175
"_T_MUTABLE_MAPPING_co", bound=MutableMapping, covariant=True
@@ -1361,10 +1364,12 @@ class DataFrame(NDFrame, OpsMixin, _GetItemHack):
13611364
) -> Self: ...
13621365
def pivot_table(
13631366
self,
1364-
values: _PivotTableValuesTypes = ...,
1365-
index: _PivotTableIndexTypes = ...,
1366-
columns: _PivotTableColumnsTypes = ...,
1367-
aggfunc="mean",
1367+
values: _PivotTableValuesTypes = None,
1368+
index: _PivotTableIndexTypes = None,
1369+
columns: _PivotTableColumnsTypes = None,
1370+
aggfunc: (
1371+
_PivotAggFunc | Sequence[_PivotAggFunc] | Mapping[Hashable, _PivotAggFunc]
1372+
) = "mean",
13681373
fill_value: Scalar | None = None,
13691374
margins: _bool = False,
13701375
dropna: _bool = True,
@@ -1696,8 +1701,9 @@ class DataFrame(NDFrame, OpsMixin, _GetItemHack):
16961701
def plot(self) -> PlotAccessor: ...
16971702
def hist(
16981703
self,
1699-
column: _str | list[_str] | None = None,
17001704
by: _str | ListLike | None = None,
1705+
bins: int | list = 10,
1706+
*,
17011707
grid: _bool = True,
17021708
xlabelsize: float | str | None = None,
17031709
xrot: float | None = None,
@@ -1708,24 +1714,88 @@ class DataFrame(NDFrame, OpsMixin, _GetItemHack):
17081714
sharey: _bool = False,
17091715
figsize: tuple[float, float] | None = None,
17101716
layout: tuple[int, int] | None = None,
1711-
bins: int | list = 10,
17121717
backend: _str | None = None,
1718+
legend: bool = False,
17131719
**kwargs: Any,
1714-
): ...
1720+
) -> npt.NDArray[np.object_]: ...
1721+
1722+
# Keep in sync with `pd.plotting.boxplot`
1723+
@overload
17151724
def boxplot(
17161725
self,
1717-
column: _str | list[_str] | None = None,
1718-
by: _str | ListLike | None = None,
1726+
by: None = None,
17191727
ax: PlotAxes | None = None,
17201728
fontsize: float | _str | None = None,
17211729
rot: float = 0,
17221730
grid: _bool = True,
17231731
figsize: tuple[float, float] | None = None,
17241732
layout: tuple[int, int] | None = None,
1725-
return_type: Literal["axes", "dict", "both"] | None = None,
1733+
*,
1734+
return_type: Literal["axes"] | None = None,
17261735
backend: _str | None = None,
17271736
**kwargs: Any,
1728-
): ...
1737+
) -> PlotAxes: ...
1738+
@overload
1739+
def boxplot(
1740+
self,
1741+
by: None = None,
1742+
ax: PlotAxes | None = None,
1743+
fontsize: float | _str | None = None,
1744+
rot: float = 0,
1745+
grid: _bool = True,
1746+
figsize: tuple[float, float] | None = None,
1747+
layout: tuple[int, int] | None = None,
1748+
*,
1749+
return_type: Literal["dict"],
1750+
backend: _str | None = None,
1751+
**kwargs: Any,
1752+
) -> dict[str, PlotAxes]: ...
1753+
@overload
1754+
def boxplot(
1755+
self,
1756+
by: None = None,
1757+
ax: PlotAxes | None = None,
1758+
fontsize: float | _str | None = None,
1759+
rot: float = 0,
1760+
grid: _bool = True,
1761+
figsize: tuple[float, float] | None = None,
1762+
layout: tuple[int, int] | None = None,
1763+
*,
1764+
return_type: Literal["both"],
1765+
backend: _str | None = None,
1766+
**kwargs: Any,
1767+
) -> _BoxPlotT: ...
1768+
@overload
1769+
def boxplot(
1770+
self,
1771+
by: Hashable | ListLikeHashable,
1772+
ax: PlotAxes | None = None,
1773+
fontsize: float | _str | None = None,
1774+
rot: float = 0,
1775+
grid: _bool = True,
1776+
figsize: tuple[float, float] | None = None,
1777+
layout: tuple[int, int] | None = None,
1778+
*,
1779+
return_type: None = None,
1780+
backend: _str | None = None,
1781+
**kwargs: Any,
1782+
) -> PlotAxes: ...
1783+
@overload
1784+
def boxplot(
1785+
self,
1786+
by: Hashable | ListLikeHashable,
1787+
ax: PlotAxes | None = None,
1788+
fontsize: float | _str | None = None,
1789+
rot: float = 0,
1790+
grid: _bool = True,
1791+
figsize: tuple[float, float] | None = None,
1792+
layout: tuple[int, int] | None = None,
1793+
*,
1794+
return_type: Literal["axes", "dict", "both"],
1795+
backend: _str | None = None,
1796+
**kwargs: Any,
1797+
) -> Series: ...
1798+
17291799
sparse = ...
17301800

17311801
# The rest of these are remnants from the

pandas-stubs/core/reshape/pivot.pyi

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ from collections.abc import (
66
)
77
import datetime
88
from typing import (
9+
Any,
910
Literal,
1011
TypeAlias,
1112
overload,
@@ -64,54 +65,54 @@ _ExtendedAnyArrayLike: TypeAlias = AnyArrayLike | ArrayLike
6465
@overload
6566
def pivot_table(
6667
data: DataFrame,
67-
values: _PivotTableValuesTypes = ...,
68-
index: _PivotTableIndexTypes = ...,
69-
columns: _PivotTableColumnsTypes = ...,
68+
values: _PivotTableValuesTypes = None,
69+
index: _PivotTableIndexTypes = None,
70+
columns: _PivotTableColumnsTypes = None,
7071
aggfunc: (
7172
_PivotAggFunc | Sequence[_PivotAggFunc] | Mapping[Hashable, _PivotAggFunc]
72-
) = ...,
73-
fill_value: Scalar | None = ...,
74-
margins: bool = ...,
75-
dropna: bool = ...,
76-
margins_name: str = ...,
77-
observed: bool = ...,
78-
sort: bool = ...,
73+
) = "mean",
74+
fill_value: Scalar | None = None,
75+
margins: bool = False,
76+
dropna: bool = True,
77+
margins_name: Hashable = "All",
78+
observed: bool = True,
79+
sort: bool = True,
7980
) -> DataFrame: ...
8081

8182
# Can only use Index or ndarray when index or columns is a Grouper
8283
@overload
8384
def pivot_table(
8485
data: DataFrame,
85-
values: _PivotTableValuesTypes = ...,
86+
values: _PivotTableValuesTypes = None,
8687
*,
8788
index: Grouper,
88-
columns: _PivotTableColumnsTypes | Index | npt.NDArray = ...,
89+
columns: _PivotTableColumnsTypes | npt.NDArray[Any] | Index = None,
8990
aggfunc: (
9091
_PivotAggFunc | Sequence[_PivotAggFunc] | Mapping[Hashable, _PivotAggFunc]
91-
) = ...,
92-
fill_value: Scalar | None = ...,
93-
margins: bool = ...,
94-
dropna: bool = ...,
95-
margins_name: str = ...,
96-
observed: bool = ...,
97-
sort: bool = ...,
92+
) = "mean",
93+
fill_value: Scalar | None = None,
94+
margins: bool = False,
95+
dropna: bool = True,
96+
margins_name: Hashable = "All",
97+
observed: bool = True,
98+
sort: bool = True,
9899
) -> DataFrame: ...
99100
@overload
100101
def pivot_table(
101102
data: DataFrame,
102-
values: _PivotTableValuesTypes = ...,
103-
index: _PivotTableIndexTypes | Index | npt.NDArray = ...,
103+
values: _PivotTableValuesTypes = None,
104+
index: _PivotTableIndexTypes | npt.NDArray[Any] | Index = None,
104105
*,
105106
columns: Grouper,
106107
aggfunc: (
107108
_PivotAggFunc | Sequence[_PivotAggFunc] | Mapping[Hashable, _PivotAggFunc]
108-
) = ...,
109-
fill_value: Scalar | None = ...,
110-
margins: bool = ...,
111-
dropna: bool = ...,
112-
margins_name: str = ...,
113-
observed: bool = ...,
114-
sort: bool = ...,
109+
) = "mean",
110+
fill_value: Scalar | None = None,
111+
margins: bool = False,
112+
dropna: bool = True,
113+
margins_name: Hashable = "All",
114+
observed: bool = True,
115+
sort: bool = True,
115116
) -> DataFrame: ...
116117
def pivot(
117118
data: DataFrame,

pandas-stubs/plotting/_core.pyi

Lines changed: 64 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ from pandas._typing import (
2727
HashableT1,
2828
HashableT2,
2929
HashableT3,
30+
ListLikeHashable,
3031
npt,
3132
)
3233

@@ -39,50 +40,87 @@ _SingleColor: TypeAlias = (
3940
)
4041
_PlotAccessorColor: TypeAlias = str | list[_SingleColor] | dict[HashableT, _SingleColor]
4142

43+
# Keep in sync with `DataFrame.boxplot`
4244
@overload
4345
def boxplot(
4446
data: DataFrame,
45-
column: Hashable | list[HashableT1] | None = ...,
46-
by: Hashable | list[HashableT2] | None = ...,
47-
ax: Axes | None = ...,
48-
fontsize: float | str | None = ...,
49-
rot: float = ...,
50-
grid: bool = ...,
51-
figsize: tuple[float, float] | None = ...,
52-
layout: tuple[int, int] | None = ...,
53-
return_type: Literal["axes"] | None = ...,
47+
column: Hashable | ListLikeHashable,
48+
by: None = None,
49+
ax: Axes | None = None,
50+
fontsize: float | str | None = None,
51+
rot: float = 0,
52+
grid: bool = True,
53+
figsize: tuple[float, float] | None = None,
54+
layout: tuple[int, int] | None = None,
55+
*,
56+
return_type: Literal["axes"] | None = None,
57+
backend: str | None = None,
5458
**kwargs: Any,
5559
) -> Axes: ...
5660
@overload
5761
def boxplot(
5862
data: DataFrame,
59-
column: Hashable | list[HashableT1] | None = ...,
60-
by: Hashable | list[HashableT2] | None = ...,
61-
ax: Axes | None = ...,
62-
fontsize: float | str | None = ...,
63-
rot: float = ...,
64-
grid: bool = ...,
65-
figsize: tuple[float, float] | None = ...,
66-
layout: tuple[int, int] | None = ...,
63+
column: Hashable | ListLikeHashable,
64+
by: None = None,
65+
ax: Axes | None = None,
66+
fontsize: float | str | None = None,
67+
rot: float = 0,
68+
grid: bool = True,
69+
figsize: tuple[float, float] | None = None,
70+
layout: tuple[int, int] | None = None,
6771
*,
6872
return_type: Literal["dict"],
73+
backend: str | None = None,
6974
**kwargs: Any,
70-
) -> dict[str, list[Line2D]]: ...
75+
) -> dict[str, Axes]: ...
7176
@overload
7277
def boxplot(
7378
data: DataFrame,
74-
column: Hashable | list[HashableT1] | None = ...,
75-
by: Hashable | list[HashableT2] | None = ...,
76-
ax: Axes | None = ...,
77-
fontsize: float | str | None = ...,
78-
rot: float = ...,
79-
grid: bool = ...,
80-
figsize: tuple[float, float] | None = ...,
81-
layout: tuple[int, int] | None = ...,
79+
column: Hashable | ListLikeHashable,
80+
by: None = None,
81+
ax: Axes | None = None,
82+
fontsize: float | str | None = None,
83+
rot: float = 0,
84+
grid: bool = True,
85+
figsize: tuple[float, float] | None = None,
86+
layout: tuple[int, int] | None = None,
8287
*,
8388
return_type: Literal["both"],
89+
backend: str | None = None,
8490
**kwargs: Any,
8591
) -> _BoxPlotT: ...
92+
@overload
93+
def boxplot(
94+
data: DataFrame,
95+
column: Hashable | ListLikeHashable,
96+
by: Hashable | ListLikeHashable,
97+
ax: Axes | None = None,
98+
fontsize: float | str | None = None,
99+
rot: float = 0,
100+
grid: bool = True,
101+
figsize: tuple[float, float] | None = None,
102+
layout: tuple[int, int] | None = None,
103+
*,
104+
return_type: None = None,
105+
backend: str | None = None,
106+
**kwargs: Any,
107+
) -> Axes: ...
108+
@overload
109+
def boxplot(
110+
data: DataFrame,
111+
column: Hashable | ListLikeHashable,
112+
by: Hashable | ListLikeHashable,
113+
ax: Axes | None = None,
114+
fontsize: float | str | None = None,
115+
rot: float = 0,
116+
grid: bool = True,
117+
figsize: tuple[float, float] | None = None,
118+
layout: tuple[int, int] | None = None,
119+
*,
120+
return_type: Literal["axes", "dict", "both"],
121+
backend: str | None = None,
122+
**kwargs: Any,
123+
) -> Series: ...
86124

87125
class PlotAccessor:
88126
def __init__(self, data: Series | DataFrame) -> None: ...

0 commit comments

Comments
 (0)