This commit is contained in:
2025-09-07 22:09:54 +02:00
parent e1b817252c
commit 2fc0d000b6
7796 changed files with 2159515 additions and 933 deletions

View File

@ -0,0 +1,15 @@
from pandas.core.groupby.generic import (
DataFrameGroupBy as DataFrameGroupBy,
NamedAgg as NamedAgg,
SeriesGroupBy as SeriesGroupBy,
)
from pandas.core.groupby.groupby import GroupBy as GroupBy
from pandas.core.groupby.grouper import Grouper as Grouper
__all__ = [
"DataFrameGroupBy",
"NamedAgg",
"SeriesGroupBy",
"GroupBy",
"Grouper",
]

View File

@ -0,0 +1,56 @@
from collections.abc import Hashable
import dataclasses
from typing import (
Literal,
TypeAlias,
)
@dataclasses.dataclass(order=True, frozen=True)
class OutputKey:
label: Hashable
position: int
ReductionKernelType: TypeAlias = Literal[
"all",
"any",
"corrwith",
"count",
"first",
"idxmax",
"idxmin",
"last",
"max",
"mean",
"median",
"min",
"nunique",
"prod",
# as long as `quantile`'s signature accepts only
# a single quantile value, it's a reduction.
# GH#27526 might change that.
"quantile",
"sem",
"size",
"skew",
"std",
"sum",
"var",
]
TransformationKernelType: TypeAlias = Literal[
"bfill",
"cumcount",
"cummax",
"cummin",
"cumprod",
"cumsum",
"diff",
"ffill",
"fillna",
"ngroup",
"pct_change",
"rank",
"shift",
]
TransformReductionListType: TypeAlias = ReductionKernelType | TransformationKernelType

View File

@ -0,0 +1,466 @@
from collections.abc import (
Callable,
Hashable,
Iterable,
Iterator,
Sequence,
)
from typing import (
Any,
Concatenate,
Generic,
Literal,
NamedTuple,
Protocol,
TypeVar,
final,
overload,
)
from matplotlib.axes import Axes as PlotAxes
import numpy as np
from pandas.core.frame import DataFrame
from pandas.core.groupby.base import TransformReductionListType
from pandas.core.groupby.groupby import (
GroupBy,
GroupByPlot,
)
from pandas.core.series import Series
from typing_extensions import (
Self,
TypeAlias,
)
from pandas._libs.tslibs.timestamps import Timestamp
from pandas._typing import (
S2,
S3,
AggFuncTypeBase,
AggFuncTypeFrame,
ByT,
CorrelationMethod,
Dtype,
IndexLabel,
Level,
ListLike,
NsmallestNlargestKeep,
P,
Scalar,
TakeIndexer,
WindowingEngine,
WindowingEngineKwargs,
)
AggScalar: TypeAlias = str | Callable[..., Any]
class NamedAgg(NamedTuple):
column: str
aggfunc: AggScalar
class SeriesGroupBy(GroupBy[Series[S2]], Generic[S2, ByT]):
@overload
def aggregate( # pyrefly: ignore
self,
func: Callable[Concatenate[Series[S2], P], S3],
/,
*args,
engine: WindowingEngine = ...,
engine_kwargs: WindowingEngineKwargs = ...,
**kwargs,
) -> Series[S3]: ...
@overload
def aggregate(
self,
func: Callable[[Series], S3],
*args,
engine: WindowingEngine = ...,
engine_kwargs: WindowingEngineKwargs = ...,
**kwargs,
) -> Series[S3]: ...
@overload
def aggregate(
self,
func: list[AggFuncTypeBase],
/,
*args,
engine: WindowingEngine = ...,
engine_kwargs: WindowingEngineKwargs = ...,
**kwargs,
) -> DataFrame: ...
@overload
def aggregate(
self,
func: AggFuncTypeBase | None = ...,
/,
*args,
engine: WindowingEngine = ...,
engine_kwargs: WindowingEngineKwargs = ...,
**kwargs,
) -> Series: ...
agg = aggregate
@overload
def transform(
self,
func: Callable[Concatenate[Series[S2], P], Series[S3]],
/,
*args: Any,
engine: WindowingEngine = ...,
engine_kwargs: WindowingEngineKwargs = ...,
**kwargs: Any,
) -> Series[S3]: ...
@overload
def transform(
self,
func: Callable,
*args: Any,
**kwargs: Any,
) -> Series: ...
@overload
def transform(
self, func: TransformReductionListType, *args, **kwargs
) -> Series: ...
def filter(
self, func: Callable | str, dropna: bool = ..., *args, **kwargs
) -> Series: ...
def nunique(self, dropna: bool = ...) -> Series[int]: ...
# describe delegates to super() method but here it has keyword-only parameters
def describe( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride]
self,
*,
percentiles: Iterable[float] | None = ...,
include: Literal["all"] | list[Dtype] | None = ...,
exclude: list[Dtype] | None = ...,
) -> DataFrame: ...
@overload
def value_counts(
self,
normalize: Literal[False] = ...,
sort: bool = ...,
ascending: bool = ...,
bins: int | Sequence[int] | None = ...,
dropna: bool = ...,
) -> Series[int]: ...
@overload
def value_counts(
self,
normalize: Literal[True],
sort: bool = ...,
ascending: bool = ...,
bins: int | Sequence[int] | None = ...,
dropna: bool = ...,
) -> Series[float]: ...
def take(
self,
indices: TakeIndexer,
**kwargs,
) -> Series[S2]: ...
def skew(
self,
skipna: bool = True,
numeric_only: bool = False,
**kwargs,
) -> Series: ...
@property
def plot(self) -> GroupByPlot[Self]: ...
def nlargest(
self, n: int = 5, keep: NsmallestNlargestKeep = "first"
) -> Series[S2]: ...
def nsmallest(
self, n: int = 5, keep: NsmallestNlargestKeep = "first"
) -> Series[S2]: ...
def idxmin(self, skipna: bool = True) -> Series: ...
def idxmax(self, skipna: bool = True) -> Series: ...
def corr(
self,
other: Series,
method: CorrelationMethod = ...,
min_periods: int | None = ...,
) -> Series: ...
def cov(
self,
other: Series,
min_periods: int | None = None,
ddof: int | None = 1,
) -> Series: ...
@property
def is_monotonic_increasing(self) -> Series[bool]: ...
@property
def is_monotonic_decreasing(self) -> Series[bool]: ...
def hist(
self,
by: IndexLabel | None = None,
ax: PlotAxes | None = None,
grid: bool = True,
xlabelsize: float | str | None = None,
xrot: float | None = None,
ylabelsize: float | str | None = None,
yrot: float | None = None,
figsize: tuple[float, float] | None = None,
bins: int | Sequence[int] = 10,
backend: str | None = None,
legend: bool = False,
**kwargs,
) -> Series: ... # Series[Axes] but this is not allowed
@property
def dtype(self) -> Series: ...
def unique(self) -> Series: ...
# Overrides that provide more precise return types over the GroupBy class
@final # type: ignore[misc]
def __iter__( # pyright: ignore[reportIncompatibleMethodOverride]
self,
) -> Iterator[tuple[ByT, Series[S2]]]: ...
_TT = TypeVar("_TT", bound=Literal[True, False])
# ty ignore needed because of https://github.com/astral-sh/ty/issues/157#issuecomment-3017337945
class DFCallable1(Protocol[P]): # ty: ignore[invalid-argument-type]
def __call__(
self, df: DataFrame, /, *args: P.args, **kwargs: P.kwargs
) -> Scalar | list | dict: ...
class DFCallable2(Protocol[P]): # ty: ignore[invalid-argument-type]
def __call__(
self, df: DataFrame, /, *args: P.args, **kwargs: P.kwargs
) -> DataFrame | Series: ...
class DFCallable3(Protocol[P]): # ty: ignore[invalid-argument-type]
def __call__(self, df: Iterable, /, *args: P.args, **kwargs: P.kwargs) -> float: ...
class DataFrameGroupBy(GroupBy[DataFrame], Generic[ByT, _TT]):
# error: Overload 3 for "apply" will never be used because its parameters overlap overload 1
@overload # type: ignore[override]
def apply(
self,
func: DFCallable1[P],
/,
*args: P.args,
**kwargs: P.kwargs,
) -> Series: ...
@overload
def apply(
self,
func: DFCallable2[P],
/,
*args: P.args,
**kwargs: P.kwargs,
) -> DataFrame: ...
@overload
def apply(
self,
func: DFCallable3[P],
/,
*args: P.args,
**kwargs: P.kwargs,
) -> DataFrame: ...
# error: overload 1 overlaps overload 2 because of different return types
@overload
def aggregate(self, func: Literal["size"]) -> Series: ... # type: ignore[overload-overlap]
@overload
def aggregate(
self,
func: AggFuncTypeFrame | None = ...,
*args,
engine: WindowingEngine = ...,
engine_kwargs: WindowingEngineKwargs = ...,
**kwargs,
) -> DataFrame: ...
@overload
def aggregate(
self,
func: AggFuncTypeFrame | None = None,
/,
**kwargs,
) -> DataFrame: ...
agg = aggregate
@overload
def transform(
self,
func: Callable[Concatenate[DataFrame, P], DataFrame],
*args: Any,
engine: WindowingEngine = ...,
engine_kwargs: WindowingEngineKwargs = ...,
**kwargs: Any,
) -> DataFrame: ...
@overload
def transform(
self,
func: Callable,
*args: Any,
**kwargs: Any,
) -> DataFrame: ...
@overload
def transform(
self, func: TransformReductionListType, *args, **kwargs
) -> DataFrame: ...
def filter(
self, func: Callable, dropna: bool = ..., *args, **kwargs
) -> DataFrame: ...
@overload
def __getitem__(self, key: Scalar) -> SeriesGroupBy[Any, ByT]: ... # type: ignore[overload-overlap] # pyright: ignore[reportOverlappingOverload]
@overload
def __getitem__( # pyright: ignore[reportIncompatibleMethodOverride]
self, key: Iterable[Hashable]
) -> DataFrameGroupBy[ByT, _TT]: ...
def nunique(self, dropna: bool = True) -> DataFrame: ...
def idxmax(
self,
skipna: bool = True,
numeric_only: bool = False,
) -> DataFrame: ...
def idxmin(
self,
skipna: bool = True,
numeric_only: bool = False,
) -> DataFrame: ...
@overload
def boxplot(
self,
subplots: Literal[True] = ...,
column: IndexLabel | None = ...,
fontsize: float | str | None = ...,
rot: float = ...,
grid: bool = ...,
ax: PlotAxes | None = ...,
figsize: tuple[float, float] | None = ...,
layout: tuple[int, int] | None = ...,
sharex: bool = ...,
sharey: bool = ...,
backend: str | None = ...,
**kwargs,
) -> Series: ... # Series[PlotAxes] but this is not allowed
@overload
def boxplot(
self,
subplots: Literal[False],
column: IndexLabel | None = ...,
fontsize: float | str | None = ...,
rot: float = ...,
grid: bool = ...,
ax: PlotAxes | None = ...,
figsize: tuple[float, float] | None = ...,
layout: tuple[int, int] | None = ...,
sharex: bool = ...,
sharey: bool = ...,
backend: str | None = ...,
**kwargs,
) -> PlotAxes: ...
@overload
def boxplot(
self,
subplots: bool,
column: IndexLabel | None = ...,
fontsize: float | str | None = ...,
rot: float = ...,
grid: bool = ...,
ax: PlotAxes | None = ...,
figsize: tuple[float, float] | None = ...,
layout: tuple[int, int] | None = ...,
sharex: bool = ...,
sharey: bool = ...,
backend: str | None = ...,
**kwargs,
) -> PlotAxes | Series: ... # Series[PlotAxes]
@overload
def value_counts(
self: DataFrameGroupBy[ByT, Literal[True]],
subset: ListLike | None = ...,
normalize: Literal[False] = ...,
sort: bool = ...,
ascending: bool = ...,
dropna: bool = ...,
) -> Series[int]: ...
@overload
def value_counts(
self: DataFrameGroupBy[ByT, Literal[True]],
subset: ListLike | None,
normalize: Literal[True],
sort: bool = ...,
ascending: bool = ...,
dropna: bool = ...,
) -> Series[float]: ...
@overload
def value_counts(
self: DataFrameGroupBy[ByT, Literal[False]],
subset: ListLike | None = ...,
normalize: Literal[False] = ...,
sort: bool = ...,
ascending: bool = ...,
dropna: bool = ...,
) -> DataFrame: ...
@overload
def value_counts(
self: DataFrameGroupBy[ByT, Literal[False]],
subset: ListLike | None,
normalize: Literal[True],
sort: bool = ...,
ascending: bool = ...,
dropna: bool = ...,
) -> DataFrame: ...
def take(self, indices: TakeIndexer, **kwargs) -> DataFrame: ...
@overload
def skew(
self,
skipna: bool = ...,
numeric_only: bool = ...,
*,
level: Level,
**kwargs,
) -> DataFrame: ...
@overload
def skew(
self,
skipna: bool = ...,
numeric_only: bool = ...,
*,
level: None = ...,
**kwargs,
) -> Series: ...
@property
def plot(self) -> GroupByPlot[Self]: ...
def corr(
self,
method: str | Callable[[np.ndarray, np.ndarray], float] = ...,
min_periods: int = ...,
numeric_only: bool = False,
) -> DataFrame: ...
def cov(
self,
min_periods: int | None = ...,
ddof: int | None = 1,
numeric_only: bool = False,
) -> DataFrame: ...
def hist(
self,
column: IndexLabel | None = None,
by: IndexLabel | None = None,
grid: bool = True,
xlabelsize: float | str | None = None,
xrot: float | None = None,
ylabelsize: float | str | None = None,
yrot: float | None = None,
ax: PlotAxes | None = None,
sharex: bool = False,
sharey: bool = False,
figsize: tuple[float, float] | None = None,
layout: tuple[int, int] | None = None,
bins: int | Sequence[int] = 10,
backend: str | None = None,
legend: bool = False,
**kwargs,
) -> Series: ... # Series[Axes] but this is not allowed
@property
def dtypes(self) -> Series: ...
def __getattr__(self, name: str) -> SeriesGroupBy[Any, ByT]: ...
# Overrides that provide more precise return types over the GroupBy class
@final # type: ignore[misc]
def __iter__( # pyright: ignore[reportIncompatibleMethodOverride]
self,
) -> Iterator[tuple[ByT, DataFrame]]: ...
@overload
def size(self: DataFrameGroupBy[ByT, Literal[True]]) -> Series[int]: ...
@overload
def size(self: DataFrameGroupBy[ByT, Literal[False]]) -> DataFrame: ...
@overload
def size(self: DataFrameGroupBy[Timestamp, Literal[True]]) -> Series[int]: ...
@overload
def size(self: DataFrameGroupBy[Timestamp, Literal[False]]) -> DataFrame: ...

View File

@ -0,0 +1,393 @@
from collections.abc import (
Callable,
Hashable,
Iterable,
Iterator,
Sequence,
)
import datetime as dt
from typing import (
Any,
Generic,
Literal,
TypeVar,
final,
overload,
)
import numpy as np
from pandas.core.base import SelectionMixin
from pandas.core.frame import DataFrame
from pandas.core.groupby import (
generic,
)
from pandas.core.groupby.indexing import (
GroupByIndexingMixin,
GroupByNthSelector,
)
from pandas.core.indexers import BaseIndexer
from pandas.core.indexes.api import Index
from pandas.core.resample import (
DatetimeIndexResamplerGroupby,
PeriodIndexResamplerGroupby,
TimedeltaIndexResamplerGroupby,
)
from pandas.core.series import Series
from pandas.core.window import (
ExpandingGroupby,
ExponentialMovingWindowGroupby,
RollingGroupby,
)
from typing_extensions import (
Concatenate,
Self,
TypeAlias,
)
from pandas._libs.lib import _NoDefaultDoNotUse
from pandas._libs.tslibs import BaseOffset
from pandas._typing import (
S1,
AnyArrayLike,
Axis,
AxisInt,
CalculationMethod,
Dtype,
Frequency,
IndexLabel,
IntervalClosedType,
MaskType,
NDFrameT,
P,
RandomState,
Scalar,
T,
TimedeltaConvertibleTypes,
TimeGrouperOrigin,
TimestampConvention,
TimestampConvertibleTypes,
WindowingEngine,
WindowingEngineKwargs,
npt,
)
from pandas.plotting import PlotAccessor
_ResamplerGroupBy: TypeAlias = (
DatetimeIndexResamplerGroupby[NDFrameT] # ty: ignore[invalid-argument-type]
| PeriodIndexResamplerGroupby[NDFrameT] # ty: ignore[invalid-argument-type]
| TimedeltaIndexResamplerGroupby[NDFrameT] # ty: ignore[invalid-argument-type]
)
class GroupBy(BaseGroupBy[NDFrameT]):
def __getattr__(self, attr: str) -> Any: ...
def apply(self, func: Callable | str, *args, **kwargs) -> NDFrameT: ...
@final
@overload
def any(self: GroupBy[Series], skipna: bool = ...) -> Series[bool]: ...
@overload
def any(self: GroupBy[DataFrame], skipna: bool = ...) -> DataFrame: ...
@final
@overload
def all(self: GroupBy[Series], skipna: bool = ...) -> Series[bool]: ...
@overload
def all(self: GroupBy[DataFrame], skipna: bool = ...) -> DataFrame: ...
@final
@overload
def count(self: GroupBy[Series]) -> Series[int]: ...
@overload
def count(self: GroupBy[DataFrame]) -> DataFrame: ...
@final
def mean(
self,
numeric_only: bool = False,
engine: WindowingEngine = None,
engine_kwargs: WindowingEngineKwargs = None,
) -> NDFrameT: ...
@final
def median(self, numeric_only: bool = False) -> NDFrameT: ...
@final
@overload
def std(
self: GroupBy[Series],
ddof: int = ...,
engine: WindowingEngine = ...,
engine_kwargs: WindowingEngineKwargs = ...,
numeric_only: bool = ...,
) -> Series[float]: ...
@overload
def std(
self: GroupBy[DataFrame],
ddof: int = ...,
engine: WindowingEngine = ...,
engine_kwargs: WindowingEngineKwargs = ...,
numeric_only: bool = ...,
) -> DataFrame: ...
@final
@overload
def var(
self: GroupBy[Series],
ddof: int = ...,
engine: WindowingEngine = ...,
engine_kwargs: WindowingEngineKwargs = ...,
numeric_only: bool = ...,
) -> Series[float]: ...
@overload
def var(
self: GroupBy[DataFrame],
ddof: int = ...,
engine: WindowingEngine = ...,
engine_kwargs: WindowingEngineKwargs = ...,
numeric_only: bool = ...,
) -> DataFrame: ...
@final
@overload
def sem(
self: GroupBy[Series], ddof: int = ..., numeric_only: bool = ...
) -> Series[float]: ...
@overload
def sem(
self: GroupBy[DataFrame], ddof: int = ..., numeric_only: bool = ...
) -> DataFrame: ...
def size(self: GroupBy[Series]) -> Series[int]: ...
@final
def sum(
self,
numeric_only: bool = False,
min_count: int = 0,
engine: WindowingEngine = None,
engine_kwargs: WindowingEngineKwargs = None,
) -> NDFrameT: ...
@final
def prod(self, numeric_only: bool = False, min_count: int = 0) -> NDFrameT: ...
@final
def min(
self,
numeric_only: bool = False,
min_count: int = -1,
engine: WindowingEngine = None,
engine_kwargs: WindowingEngineKwargs = None,
) -> NDFrameT: ...
@final
def max(
self,
numeric_only: bool = False,
min_count: int = -1,
engine: WindowingEngine = None,
engine_kwargs: WindowingEngineKwargs = None,
) -> NDFrameT: ...
@final
def first(
self, numeric_only: bool = False, min_count: int = -1, skipna: bool = True
) -> NDFrameT: ...
@final
def last(
self, numeric_only: bool = False, min_count: int = -1, skipna: bool = True
) -> NDFrameT: ...
@final
def ohlc(self) -> DataFrame: ...
def describe(
self,
percentiles: Iterable[float] | None = ...,
include: Literal["all"] | list[Dtype] | None = ...,
exclude: list[Dtype] | None = ...,
) -> DataFrame: ...
@final
def resample(
self,
rule: Frequency | dt.timedelta,
how: str | None = ...,
fill_method: str | None = ...,
limit: int | None = ...,
kind: str | None = ...,
on: Hashable | None = ...,
*,
closed: Literal["left", "right"] | None = ...,
label: Literal["left", "right"] | None = ...,
axis: Axis = ...,
convention: TimestampConvention | None = ...,
origin: TimeGrouperOrigin | TimestampConvertibleTypes = ...,
offset: TimedeltaConvertibleTypes | None = ...,
group_keys: bool = ...,
**kwargs,
) -> _ResamplerGroupBy[NDFrameT]: ...
@final
def rolling(
self,
window: int | dt.timedelta | str | BaseOffset | BaseIndexer | None = ...,
min_periods: int | None = None,
center: bool | None = False,
win_type: str | None = None,
axis: Axis = 0,
on: str | Index | None = None,
closed: IntervalClosedType | None = None,
method: CalculationMethod = "single",
*,
selection: IndexLabel | None = None,
) -> RollingGroupby[NDFrameT]: ...
@final
def expanding(
self,
min_periods: int = ...,
axis: Axis = ...,
method: CalculationMethod = ...,
selection: IndexLabel | None = ...,
) -> ExpandingGroupby[NDFrameT]: ...
@final
def ewm(
self,
com: float | None = ...,
span: float | None = ...,
halflife: TimedeltaConvertibleTypes | None = ...,
alpha: float | None = ...,
min_periods: int | None = ...,
adjust: bool = ...,
ignore_na: bool = ...,
axis: Axis = ...,
times: str | np.ndarray | Series | np.timedelta64 | None = ...,
method: CalculationMethod = ...,
*,
selection: IndexLabel | None = ...,
) -> ExponentialMovingWindowGroupby[NDFrameT]: ...
@final
def ffill(self, limit: int | None = ...) -> NDFrameT: ...
@final
def bfill(self, limit: int | None = ...) -> NDFrameT: ...
@final
@property
def nth(self) -> GroupByNthSelector[Self]: ...
@final
def quantile(
self,
q: float | AnyArrayLike = 0.5,
interpolation: str = "linear",
numeric_only: bool = False,
) -> NDFrameT: ...
@final
def ngroup(self, ascending: bool = True) -> Series[int]: ...
@final
def cumcount(self, ascending: bool = True) -> Series[int]: ...
@final
def rank(
self,
method: str = "average",
ascending: bool = True,
na_option: str = "keep",
pct: bool = False,
axis: AxisInt | _NoDefaultDoNotUse = 0,
) -> NDFrameT: ...
@final
def cumprod(
self, axis: Axis | _NoDefaultDoNotUse = ..., *args, **kwargs
) -> NDFrameT: ...
@final
def cumsum(
self, axis: Axis | _NoDefaultDoNotUse = ..., *args, **kwargs
) -> NDFrameT: ...
@final
def cummin(
self,
axis: AxisInt | _NoDefaultDoNotUse = ...,
numeric_only: bool = ...,
**kwargs,
) -> NDFrameT: ...
@final
def cummax(
self,
axis: AxisInt | _NoDefaultDoNotUse = ...,
numeric_only: bool = ...,
**kwargs,
) -> NDFrameT: ...
@final
def shift(
self,
periods: int | Sequence[int] = 1,
freq: Frequency | None = ...,
axis: Axis | _NoDefaultDoNotUse = 0,
fill_value=...,
suffix: str | None = ...,
) -> NDFrameT: ...
@final
def diff(
self, periods: int = 1, axis: AxisInt | _NoDefaultDoNotUse = 0
) -> NDFrameT: ...
@final
def pct_change(
self,
periods: int = ...,
fill_method: Literal["bfill", "ffill"] | None | _NoDefaultDoNotUse = ...,
limit: int | None | _NoDefaultDoNotUse = ...,
freq=...,
axis: Axis | _NoDefaultDoNotUse = ...,
) -> NDFrameT: ...
@final
def head(self, n: int = ...) -> NDFrameT: ...
@final
def tail(self, n: int = ...) -> NDFrameT: ...
@final
def sample(
self,
n: int | None = None,
frac: float | None = None,
replace: bool = False,
weights: Sequence | Series | None = ...,
random_state: RandomState | None = ...,
) -> NDFrameT: ...
_GroupByT = TypeVar("_GroupByT", bound=GroupBy)
# GroupByPlot does not really inherit from PlotAccessor but it delegates
# to it using __call__ and __getattr__. We lie here to avoid repeating the
# whole stub of PlotAccessor
@final
class GroupByPlot(PlotAccessor, Generic[_GroupByT]):
def __init__(self, groupby: _GroupByT) -> None: ...
# The following methods are inherited from the fake parent class PlotAccessor
# def __call__(self, *args, **kwargs): ...
# def __getattr__(self, name: str): ...
class BaseGroupBy(SelectionMixin[NDFrameT], GroupByIndexingMixin):
@final
def __len__(self) -> int: ...
@final
def __repr__(self) -> str: ... # noqa: PYI029 __repr__ here is final
@final
@property
def groups(self) -> dict[Hashable, Index]: ...
@final
@property
def ngroups(self) -> int: ...
@final
@property
def indices(self) -> dict[Hashable, Index | npt.NDArray[np.int_] | list[int]]: ...
@overload
def pipe(
self,
func: Callable[Concatenate[Self, P], T],
*args: P.args,
**kwargs: P.kwargs,
) -> T: ...
@overload
def pipe(
self,
func: tuple[Callable[..., T], str],
*args: Any,
**kwargs: Any,
) -> T: ...
@final
def get_group(self, name) -> NDFrameT: ...
@final
def __iter__(self) -> Iterator[tuple[Hashable, NDFrameT]]: ...
@overload
def __getitem__(self: BaseGroupBy[DataFrame], key: Scalar) -> generic.SeriesGroupBy: ... # type: ignore[overload-overlap] # pyright: ignore[reportOverlappingOverload]
@overload
def __getitem__(
self: BaseGroupBy[DataFrame], key: Iterable[Hashable]
) -> generic.DataFrameGroupBy: ...
@overload
def __getitem__(
self: BaseGroupBy[Series[S1]],
idx: list[str] | Index | Series[S1] | MaskType | tuple[Hashable | slice, ...],
) -> generic.SeriesGroupBy: ...
@overload
def __getitem__(self: BaseGroupBy[Series[S1]], idx: Scalar) -> S1: ...

View File

@ -0,0 +1,74 @@
from collections.abc import (
Hashable,
Iterator,
)
from typing import (
final,
overload,
)
import numpy as np
from pandas import (
DataFrame,
Index,
Series,
)
from pandas.core.resample import TimeGrouper
from typing_extensions import Self
from pandas._libs.lib import _NoDefaultDoNotUse
from pandas._typing import (
ArrayLike,
Axis,
Frequency,
Incomplete,
KeysArgType,
Level,
ListLikeHashable,
npt,
)
from pandas.util._decorators import cache_readonly
class Grouper:
key: KeysArgType | None
level: Level | ListLikeHashable[Level] | None
freq: Frequency | None
axis: Axis
sort: bool
dropna: bool
binner: Incomplete
@overload
def __new__(
cls,
key: KeysArgType | None = ...,
level: Level | ListLikeHashable[Level] | None = ...,
axis: Axis | _NoDefaultDoNotUse = ...,
sort: bool = ...,
dropna: bool = ...,
) -> Self: ...
@overload
def __new__(cls, *args, freq: Frequency, **kwargs) -> TimeGrouper: ...
@final
def __repr__(self) -> str: ... # noqa: PYI029 __repr__ here is final
@final
class Grouping:
level: Level | None
obj: DataFrame | Series | None
in_axis: bool
grouping_vector: Incomplete
def __iter__(self) -> Iterator[Hashable]: ...
@cache_readonly
def name(self) -> Hashable: ...
@cache_readonly
def ngroups(self) -> int: ...
@cache_readonly
def indices(self) -> dict[Hashable, npt.NDArray[np.intp]]: ...
@property
def codes(self) -> npt.NDArray[np.signedinteger]: ...
@cache_readonly
def group_arraylike(self) -> ArrayLike: ...
@cache_readonly
def result_index(self) -> Index: ...
@cache_readonly
def group_index(self) -> Index: ...

View File

@ -0,0 +1,32 @@
from typing import (
Any,
Generic,
Literal,
TypeVar,
)
from pandas import (
DataFrame,
Series,
)
from pandas.core.groupby import groupby
from pandas._typing import PositionalIndexer
_GroupByT = TypeVar("_GroupByT", bound=groupby.GroupBy[Any])
class GroupByIndexingMixin: ...
class GroupByPositionalSelector:
groupby_object: groupby.GroupBy
def __getitem__(self, arg: PositionalIndexer | tuple) -> DataFrame | Series: ...
class GroupByNthSelector(Generic[_GroupByT]):
groupby_object: _GroupByT
def __call__(
self,
n: PositionalIndexer | tuple,
dropna: Literal["any", "all", None] = ...,
) -> DataFrame | Series: ...
def __getitem__(self, n: PositionalIndexer | tuple) -> DataFrame | Series: ...

View File

@ -0,0 +1,103 @@
from collections.abc import (
Callable,
Hashable,
Iterator,
)
from typing import (
Generic,
final,
)
import numpy as np
from pandas import (
Index,
Series,
)
from pandas.core.groupby import grouper
from pandas._typing import (
ArrayLike,
AxisInt,
Incomplete,
NDFrameT,
Shape,
T,
npt,
)
from pandas.util._decorators import cache_readonly
class BaseGrouper:
axis: Index
dropna: bool
@property
def groupings(self) -> list[grouper.Grouping]: ...
@property
def shape(self) -> Shape: ...
def __iter__(self) -> Iterator: ...
@property
def nkeys(self) -> int: ...
def get_iterator(
self, data: NDFrameT, axis: AxisInt = ...
) -> Iterator[tuple[Hashable, NDFrameT]]: ...
@final
@cache_readonly
def group_keys_seq(self): ...
@cache_readonly
def indices(self) -> dict[Hashable, npt.NDArray[np.intp]]: ...
@final
def result_ilocs(self) -> npt.NDArray[np.intp]: ...
@final
@property
def codes(self) -> list[npt.NDArray[np.signedinteger]]: ...
@property
def levels(self) -> list[Index]: ...
@property
def names(self) -> list: ...
@final
def size(self) -> Series: ...
@cache_readonly
def groups(self) -> dict[Hashable, np.ndarray]: ...
@final
@cache_readonly
def is_monotonic(self) -> bool: ...
@final
@cache_readonly
def has_dropped_na(self) -> bool: ...
@cache_readonly
def group_info(self) -> tuple[npt.NDArray[np.intp], npt.NDArray[np.intp], int]: ...
@cache_readonly
def codes_info(self) -> npt.NDArray[np.intp]: ...
@final
@cache_readonly
def ngroups(self) -> int: ...
@property
def reconstructed_codes(self) -> list[npt.NDArray[np.intp]]: ...
@cache_readonly
def result_index(self) -> Index: ...
@final
def get_group_levels(self) -> list[ArrayLike]: ...
@final
def agg_series(
self,
obj: Series,
func: Callable[[Series], object],
preserve_dtype: bool = ...,
) -> ArrayLike: ...
@final
def apply_groupwise(
self, f: Callable[[NDFrameT], T], data: NDFrameT, axis: AxisInt = ...
) -> tuple[list[T], bool]: ...
class BinGrouper(BaseGrouper):
bins: npt.NDArray[np.int64]
binlabels: Index
indexer: npt.NDArray[np.intp]
@cache_readonly
def indices(self) -> dict[Incomplete, list[int]]: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride]
class DataSplitter(Generic[NDFrameT]):
data: NDFrameT
labels: npt.NDArray[np.intp]
ngroups: int
axis: AxisInt
def __iter__(self) -> Iterator[NDFrameT]: ...