3
���h � @ s� d Z ddlmZmZ ddlZddlmZ ddlmZ ddl Z ddl m
Z
mZmZm
Z
mZmZmZmZmZmZmZmZmZmZ ddlZddlZddlmZ ddlmZmZ dd l m!Z!m"Z"m#Z# dd
l$m%Z%m&Z&m'Z'm(Z(m)Z) ddl*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 ddl4m5Z5m6Z6 dd
l7m8Z8m9Z9m:Z: ddl;j<j=Z=ddl>m?Z?m@Z@ ddlAj<jBZCddlDmEZE ddlFmGZG ddlHmIZImJZJmKZK ddlLmMZM ddlNmOZOmPZPmQZQmRZRmSZS ddlTmUZUmVZVmWZW ddlXj<jYjMZZddl[m\Z\m]Z] ddl^m_Z_ ddl`maZambZbmcZcmdZd ddlemfZf e
�rddl[mgZg edddg�Zheeiedef f Zje jkd�Zleiee d�d d!�Zmee eei d"�d#d$�Znene_eMjo�G d%d&� d&eOe_ ��ZpeneGeMjq�G d'd(� d(eOeG ��ZreGeGd)�d*d+�ZsdS ),z�
Define the SeriesGroupBy and DataFrameGroupBy
classes that hold the groupby interfaces (and some implementations).
These are user facing as the result of the ``df.groupby(...)`` operations,
which here returns a DataFrameGroupBy object.
� )�abc�
namedtupleN)�partial)�dedent)�
TYPE_CHECKING�Any�Callable�Dict� FrozenSet�Iterable�List�Mapping�Optional�Sequence�Tuple�Type�Union�cast)�lib)�
FrameOrSeries�FrameOrSeriesUnion)�Appender�Substitution�doc)�maybe_cast_result�maybe_cast_result_dtype�maybe_convert_objects�maybe_downcast_numeric�maybe_downcast_to_dtype) �ensure_int64�ensure_platform_int�is_bool�is_integer_dtype�is_interval_dtype�is_numeric_dtype�is_object_dtype� is_scalar�needs_i8_conversion)�isna�notna)�maybe_mangle_lambdas�reconstruct_func�validate_func_kwargs)� DataError�SpecificationError)�!create_series_with_explicit_dtype)� DataFrame)�ABCDataFrame� ABCSeries�NDFrame)�base)�GroupBy�
_agg_template�_apply_docs�_transform_template�get_groupby)�Index�
MultiIndex�all_indexes_same)�BlockManager�
make_block)�Series)�NUMBA_FUNC_CACHE�generate_numba_func�maybe_use_numba�split_for_numba)�boxplot_frame_groupby)�Block�NamedAgg�columnZaggfunc.�ScalarResult)�name�klassc s0 � fdd�}t |� �}|jpd|_� |_t|�S )z�
Create a property for a GroupBy subclass to dispatch to DataFrame/Series.
Parameters
----------
name : str
klass : {DataFrame, Series}
Returns
-------
property
c s
| j � �S )N)Z
_make_wrapper)�self)rI � �=/tmp/pip-build-5_djhm0z/pandas/pandas/core/groupby/generic.py�propt s zgenerate_property.<locals>.prop� )�getattr�__doc__�__name__�property)rI rJ rN Z
parent_methodrL )rI rM �generate_propertyf s
rT )rJ � allowlistc s � �fdd�}|S )a�
Create GroupBy member defs for DataFrame/Series names in a allowlist.
Parameters
----------
klass : DataFrame or Series class
class where members are defined.
allowlist : frozenset[str]
Set of names of klass methods to be constructed
Returns
-------
class decorator
Notes
-----
Since we don't want to override methods explicitly defined in the
base class, any such name is skipped.
c s4 x.� D ]&}t | |�rqt|��}t| ||� qW | S )N)�hasattrrT �setattr)�clsrI rN )rU rJ rL rM �pinner� s
z*pin_allowlisted_properties.<locals>.pinnerrL )rJ rU rY rL )rU rJ rM �pin_allowlisted_properties} s rZ c s� e Zd ZejZee d�dd�Ze dd� �Z
ed�Ze
ed jded d
��� fdd��Zeeed
d�d=ddd�dd��ZeZdd� Zeejeeejf f ee eeef d�dd�Zeejeeejf f ee eeef d�dd�Zeejeeejf f ed�dd�Z d>eee!e" e#e$d�dd �Z%d!d"� Z&e'd
d#�e
e(�ddd�d$d%���Z)d&dd�d'd(�Z*ed�d)d*�Z+d?d,d-�Z,d@e#ed.�d/d0�Z-eej.�d1d2� �Z.dAd3d4�Z/ed�d5d6�Z0d7d8� Z1dBd;d<�Z2� Z3S )C�
SeriesGroupBy)�returnc c s | j V d S )N)�
_selected_obj)rK rL rL rM �_iterate_slices� s zSeriesGroupBy._iterate_slicesc C s | j dkr| jjS | j S dS )z�
since we are a series, we by definition only have
a single name, but may be the result of a selection or
the name of our object
N)�
_selection�objrI )rK rL rL rM �_selection_name� s
zSeriesGroupBy._selection_namea�
Examples
--------
>>> s = pd.Series([1, 2, 3, 4])
>>> s
0 1
1 2
2 3
3 4
dtype: int64
>>> s.groupby([1, 1, 2, 2]).min()
1 1
2 3
dtype: int64
>>> s.groupby([1, 1, 2, 2]).agg('min')
1 1
2 3
dtype: int64
>>> s.groupby([1, 1, 2, 2]).agg(['min', 'max'])
min max
1 1 2
2 3 4
The output column names can be controlled by passing
the desired column names and aggregations as keyword arguments.
>>> s.groupby([1, 1, 2, 2]).agg(
... minimum='min',
... maximum='max',
... )
minimum maximum
1 1 2
2 3 4�templateZseriesZseries_examples)�input�examplesc s t � j|f|�|�S )N)�super�apply)rK �func�args�kwargs)� __class__rL rM rf � s zSeriesGroupBy.applyr? )rd rJ N)�engine�
engine_kwargsc
O sl |d k}d }|r t |�\}}i }t|t�r:t| |�||�S t|tj�rdt|�}| j|�}|rb||_n�| j |�} | r�| r�| r�t| | �� S | j
jdkr�| j|f|�||d�|��S y| j|f|�||d�|��S t
tfk
r� | j|f|�|�}
Y nX tt|
�| j
jd d�}t|
|td�}| j�s0td� t|t��rhddlm} ||j� ddd � |j� D �d
�}|S )N� )rk rl r )rI )�index�dtype_if_emptyzWarning, ignoring as_index=True)�concatc S s g | ]
}|j �qS rL )�label)�.0�keyrL rL rM �
<listcomp> s z+SeriesGroupBy.aggregate.<locals>.<listcomp>)�axis�keys)r, �
isinstance�strrP r r r* �_aggregate_multiple_funcs�columns�_get_cython_func�grouper�nkeys�_python_agg_general�
ValueError�KeyError�_aggregate_namedr: �sorted�namesr/ �object�as_index�print�dictZpandasrp �valuesrv )
rK rg rk rl rh ri �
relabelingrz �retZcyfunc�resultrn rp rL rL rM � aggregate� s@
zSeriesGroupBy.aggregatec
C s( t |t�r4t | jt�rtd��t|j� �}|j� }n^tdd� |D ��rbdd� |D �}t t
|� �}n0g }x |D ]}|jtj
|�p�|� qlW t
||�}i }xVt|�D ]J\}\}}| }|| jkr�tj|�}|j� ||_|j|�|tj||d�< |