3
���hЁ � @ s d Z ddlZddlmZmZmZmZmZ ddlZ ddl
mZmZm
Z
ddljjZddljjZddlmZmZmZ ddlmZ ddlmZ ddlmZ dd lm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ dd
l0m1Z1m2Z2 ddl3j4j5Z5ddl6m7Z7 ddl8j4j9Z:ddl;m<Z< dd
l=m>Z> ddl?m@Z@mAZA ddlBmCZCmDZDmEZE ddlFmGZG ddlHmIZImJZJmKZKmLZLmMZMmNZN ddlOmPZPmQZQmRZRmSZS G dd� d�ZTG dd� deT�ZUeVd�dd�ZWG dd� d�ZXG dd� deX�ZYG dd� deX�ZZd#ee j[e\e\eXd �d!d"�Z]dS )$a
Provide classes to perform the groupby aggregate operations.
These are not exposed to the user and provide implementations of the grouping
operations, primarily in cython. These classes (BaseGrouper and BinGrouper)
are contained *in* the SeriesGroupBy and DataFrameGroupBy objects.
� N)�List�Optional�Sequence�Tuple�Type)�NaT�iNaT�lib)�F�
FrameOrSeries�Label)�AbstractMethodError)�cache_readonly)�maybe_cast_result)�ensure_float64�ensure_int64�ensure_int_or_float�ensure_platform_int�
is_bool_dtype�is_categorical_dtype�is_complex_dtype�is_datetime64_any_dtype�is_datetime64tz_dtype�is_extension_array_dtype�is_integer_dtype�is_numeric_dtype�is_period_dtype� is_sparse�is_timedelta64_dtype�needs_i8_conversion)�_maybe_fill�isna)�SelectionMixin)� DataFrame)�NDFrame)�base�grouper)�Index�
MultiIndex�ensure_index)�Series)�compress_group_index�decons_obs_group_ids�get_flattened_iterator�get_group_index�get_group_index_sorter�get_indexer_dict)�NUMBA_FUNC_CACHE�generate_numba_func�maybe_use_numba�split_for_numbac @ s e Zd ZdZdxedeeeeej d�dd�Z e
ed d
�dd��Ze
e
ed
f d
�dd��Zdd� Ze
ed
�dd��Zdyeed�dd�Zdzeedd�dd�Zdd� Zdd� Zd{eeed �d!d"�Zed#d$� �Ze
eej d
�d%d&��Ze
ee d
�d'd(��Ze
ee d
�d)d*��Zed
�d+d,�Z ed-d.� �Z!eed
�d/d0��Z"ed1d2� �Z#eejd
�d3d4��Z$e
ejejf d
�d5d6�Z%eed
�d7d8��Z&e
eej d
�d9d:��Z'eed
�d;d<��Z(ee d
�d=d>�Z)d?d@dAdBdCdDdEdFdGdHdI�
dJdKdLdMdNdO�dP�Z*dQdRiZ+dQdSdTdUdVgiZ,dWdX� Z-e.e.ejedY�dZd[�Z/e.e.ejedY�d\d]�Z0d}e.e.eee
ejeee. f d_�d`da�Z1de.eee
ejeee. f db�dcdd�Z2d�e.ede�dfdg�Z3d�edh�didj�Z4edk�dldm�Z5dnddo�eee.dp�dqdr�Z6eeds�dtdu�Z7dnddo�eee.dp�dvdw�Z8dS )��BaseGroupera�
This is an internal Grouper class, which actually holds
the generated groups
Parameters
----------
axis : Index
groupings : Sequence[Grouping]
all the grouping instances to handle in this grouper
for example for grouper list to groupby, need to pass the list
sort : bool, default True
whether this grouper will give sorted result or not
group_keys : bool, default True
mutated : bool, default False
indexer : intp array, optional
the indexer created by Grouper
some groupers (TimeGrouper) will sort its axis and its
group_info is also sorted, so need the indexer to reorder
TFNzSequence[grouper.Grouping])�axis� groupings�sort�
group_keys�mutated�indexerc C sR t |t�st|��t|�dk | _| _|| _t|�| _|| _ || _
|| _|| _d S )N� )
�
isinstancer' |