
    MhZ                    ,   S r SSKJr  SSKrSSKrSSKJrJrJrJ	r	  SSK
rSSKJrJr  SSKJs  Jr  SSKJrJrJrJrJr  SSKJr  SSKJr  SS	KJrJr  SS
K J!r!J"r"J#r#J$r$J%r%  SSK&J'r'J(r(  SSK)J*r*  SSK+J,r,  SSK-J.r.J/r/J0r0J1r1  SSK2J3r3  SSK4J5r5J6r6J7r7J8r8J9r9J:r:  \(       a  SSK;J<r<J=r=J>r>  SSK?J@r@  S$S jrAS rB " S S5      rC " S S5      rD " S S\D5      rES%S jrF " S S\\   5      rG " S S\G5      rH " S  S!\G5      rISS".             S&S# jjrJg)'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.
    )annotationsN)TYPE_CHECKINGCallableGenericfinal)NaTlib)	ArrayLikeAxisIntNDFrameTShapenptAbstractMethodError)cache_readonly)maybe_cast_pointwise_resultmaybe_downcast_to_dtype)ensure_float64ensure_int64ensure_platform_intensure_uint64is_1d_only_ea_dtype)isna
maybe_fill)	DataFrame)grouper)CategoricalIndexIndex
MultiIndexensure_index)Series)compress_group_indexdecons_obs_group_idsget_flattened_listget_group_indexget_group_index_sorterget_indexer_dict)HashableIteratorSequence)NDFramec                n    [        U [        R                  5      (       a  U[        :w  a  [	        S5      eg g )NzMust produce aggregated value)
isinstancenpndarrayobject
ValueError)objdtypes     I/var/www/html/env/lib/python3.13/site-packages/pandas/core/groupby/ops.pycheck_result_arrayr5   P   s4     #rzz""F? <==  #    c                    [        U S5      (       a0  U R                  n U R                  S:X  a  [        U 5      S:X  a  U S   n U $ )zV
Extract the result object, it might be a 0-dim ndarray
or a len-1 0-dim, or a scalar
_values   r   )hasattrr8   ndimlen)ress    r4   extract_resultr>   [   s=    
 sIkk88q=SX]a&CJr6   c                     \ rS rSr% Sr\" / SQ5      rS<S jr0 S\R                  " \
R                  SS9_S\R                  " \
R                  SS9_SS	_S
S_S\R                  " \
R                  SS9_S\R                  " \
R                  SS9_SS_SS_SS_SS_SS_S\R                  " \
R                  SS9_S\R                  " \
R                  SS9_SS_SS_SS _S!S"_S#S$S%S&S'S(.S).rS*\S+'   S!S,0r\S=S- j5       r\\R&                          S>S. j5       5       rS?S/ jrS@S0 jrSAS1 jrSAS2 jr\S3S3S4.             SBS5 jj5       r\              SBS6 j5       r\SCS7 j5       r\S8S9.           SDS: jj5       rS;rg3)EWrappedCythonOpi   a  
Dispatch logic for functions defined in _libs.groupby

Parameters
----------
kind: str
    Whether the operation is an aggregate or transform.
how: str
    Operation name, e.g. "mean".
has_dropped_na: bool
    True precisely when dropna=True and the grouper contains a null value.
)anyallrankcountsizeidxminidxmaxc                (    Xl         X l        X0l        g Nkindhowhas_dropped_na)selfrL   rM   rN   s       r4   __init__WrappedCythonOp.__init__}   s    	,r6   rB   )val_testrC   sum	group_sumprod
group_prodrG   )namerH   min	group_minmax	group_maxmean
group_meanmediangroup_median_float64var	group_varstdsemskew
group_skewfirst	group_nthlast
group_lastohlc
group_ohlcgroup_cumprodgroup_cumsumgroup_cummingroup_cummax
group_rank)cumprodcumsumcummincummaxrD   )	aggregate	transformzdict[str, dict]_CYTHON_FUNCTIONS   c                *    XR                   S   ;   a  gg)Nru   rv   )rw   )clsrM   s     r4   get_kind_from_how!WrappedCythonOp.get_kind_from_how   s    ''44r6   c                   UR                   nU R                  U   U   n[        U5      (       a  UnO[        [        U5      nU(       a  U$ U[
        R                  " [        5      :X  aM  US;   a  [        SU SU S35      eUS;   a  U$ US:X  a   U$ SUR                  ;  a  [        SU SU S35      eU$ [        SU5      e)	N)r^   rq   z2function is not implemented for this dtype: [how->z,dtype->])rb   rc   rG   rH   rd   r0   zPThis should not be reached. Please report a bug at github.com/pandas-dev/pandas/)
rW   rw   callablegetattr
libgroupbyr.   r3   r0   NotImplementedError__signatures__)rz   rL   rM   r3   
is_numeric	dtype_strftypefs           r4   _get_cython_function$WrappedCythonOp._get_cython_function   s    
 JJ	%%d+C0 E??A
E*AHbhhv&&++) E)A7  :: H !1!11) E)A7  H%0 r6   c                P   U R                   nUS;   a  [        U5      nU$ UR                  R                  S;   al  US;   d!  U R                  S:X  a  U R                  (       a  [        U5      nU$ US;   a2  UR                  R                  S:X  a  [        U5      nU$ [        U5      nU$ )z
Cast numeric dtypes to float64 for functions that only support that.

Parameters
----------
values : np.ndarray

Returns
-------
values : np.ndarray
)r^   rb   rc   rd   iu)r`   r\   rv   )rS   rj   rU   rr   rq   i)rM   r   r3   rL   rN   r   r   )rO   valuesrM   s      r4   _get_cython_vals WrappedCythonOp._get_cython_vals   s     hh22 $F+F"  \\$&o%		[(T-@-@ (/  DD<<$$+)&1F  +62Fr6   c                    U R                   nU R                  nU R                  R                  US5      nUS:X  a  X4nU$ US:  a  [	        S5      eUS:X  a  UR
                  nU$ U4UR
                  SS  -   nU$ )Nr9   rj   z<arity of more than 1 is not supported for the 'how' argumentrv   )rM   rL   _cython_aritygetr   shape)rO   ngroupsr   rM   rL   arity	out_shapes          r4   _get_output_shape!WrappedCythonOp._get_output_shape   s    hhyy""&&sA. &= (I  QY%N  [ I  !
V\\!"%55Ir6   c                    U R                   nUS:X  a  SnO6US;   a  SnO-UR                  S;   a  UR                   UR                   3nOSn[        R                  " U5      $ )NrD   float64rG   rH   intpiufcbr0   )rM   rL   itemsizer.   r3   )rO   r3   rM   	out_dtypes       r4   _get_out_dtypeWrappedCythonOp._get_out_dtype  s^    hh&=!I(( IzzW$$zzl5>>*:;	$	xx	""r6   c                L   U R                   nUS;   aE  U[        R                  " [        5      :X  a$  [        R                  " [        R                  5      $  U$ US;   aF  UR
                  S;   a  U$ UR
                  S;   a$  [        R                  " [        R                  5      $ U$ )z
Get the desired dtype of a result based on the
input dtype and how it was computed.

Parameters
----------
dtype : np.dtype

Returns
-------
np.dtype
    The desired dtype of the result.
)rS   rr   rS   rU   rq   )r\   r^   r`   rb   rc   fciub)rM   r.   r3   boolint64rL   r   )rO   r3   rM   s      r4   _get_result_dtype!WrappedCythonOp._get_result_dtype  s     hh==&xx)) '  ;;zzT!u$xx

++r6   N)maskresult_maskc          	        UR                   S:X  a^  US S S 24   nUb	  US S S 24   nUb	  US S S 24   nU R                  " U4UUUUUS.UD6n	U	R                  S   S:X  a  U	S   $ U	R                  $ U R                  " U4UUUUUS.UD6$ )Nr9   )	min_countr   comp_idsr   r   r   )r;   _call_cython_opr   T)
rO   r   r   r   r   r   r   kwargsvalues2dr=   s
             r4   _cython_op_ndim_compat&WrappedCythonOp._cython_op_ndim_compat6  s     ;;!dAgHD!G}&)$'2&&#!' C yy|q 1v 55L##
#
 
 	
r6   c               D   UnUR                   n	U	R                  S;   n
U	R                  S;   nU(       a  UR                  S5      nSn
O!U	R                  S:X  a  UR                  S5      nUR                   S:X  a  UR                  [        R
                  5      nU R                  S;   a~  Uc  [        U5      nU	[        :X  a3  US	   (       a)  UR                  5       (       a  UR                  5       nSX'   UR                  [        S
S9R                  [        R                  5      nSn
UR                  nUb  UR                  nUb  UR                  nU R                  X15      nU R                  U R                  U R                  UR                   U
5      nU R!                  U5      nU R#                  UR                   5      n[%        [        R&                  " XS95      nU R                  S:X  Ga  [        R(                  " U[        R*                  S9nU R                  S;   a  U" S!UUUUUUUUS.UD6  OU R                  S;   a%  U R                  S;   a  XS'   U" UUUU4UUUS.UD6  OU R                  S;   a#  U" S!UUUUUS.UD6  UR                  [        S
S9nOzU R                  S;   a/  U" S!UUUUUUS.UD6  U	[        :X  a  UR                  [        5      nO;[-        U R                   S35      eU R                  S:w  a  XgS'   U" S!UUUUUUS.UD6  U R                  S:X  a  U R                  S;  a  UR                   R                  S;   a  U(       dz  [/        U R                  S;   a  SOSU5      nWU:  nUR                  5       (       aB  Ub  UU   R1                  5       (       d   eO$UR                  S 5      n[        R2                  UU'   UR                  nU R                  U R4                  ;  a)  U R7                  UR                   5      n[9        UU5      nU$ UnU$ )"Nr   mMr   Tbuint8float16)rB   rC   skipnaF)copyr3   ru   )rG   rH   rX   rZ   r\   rh   rf   rS   )outcountsr   labelsr   r   r   is_datetimelike)rc   rb   r`   rj   rU   r^   )rb   rc   r   )r   r   r   )r   r   r   r   r   )rd   )r   r   r   r   r   r   z is not implementedrD   r   )r   r   r   r   r   r   r   r   )rS   rU   r   r9   r    )r3   rL   viewastyper.   float32rM   r   r0   rB   r   r   int8r   r   r   r   r   r   emptyzerosr   r   rZ   rC   nancast_blocklistr   r   )rO   r   r   r   r   r   r   r   orig_valuesr3   r   r   r   funcr   resultr   cutoffempty_groups	res_dtype	op_results                        r4   r   WrappedCythonOp._call_cython_opb  s    ZZ7*
**,[[)FJZZ3[[)F<<9$]]2::.F88~%|F|(#xxzz!''+]]4e]499"''BFJ66D&)mm**7;	((DHHfllJW&&v.''5	BHHY@A99#XXgRXX6Fxx 	 	  
!!#' +$3
 
 LL88~-0?,-		
 ( +	 	 ^+ !# +   t%8X% !!# +  F?#]]62F *TXXJ6I*JKK xx6!(3}%  /  99#8L(L ||  D($((o"=Q1iP%##%%".*<8<<>>>> "(y!9/1vv|,884...
 ..{/@/@AI/	BI  Ir6   c                    UR                   S:  a  [        S5      eUR                   S:X  a  US:X  d   U5       eg [        UR                  5      (       d	  US:X  d   eg g )N   z.number of dimensions is currently limited to 2r9   r   )r;   r   r   r3   )rO   axisr   s      r4   _validate_axisWrappedCythonOp._validate_axis   sX    ;;?%&VWW;;!19"d"9$V\\22 199 3r6   )r   c          	         U R                  X!5        [        U[        R                  5      (       d,  UR                  " SU R
                  U R                  UUUS.UD6$ U R                  " U4UUUSS.UD6$ )zG
Call our cython function, with appropriate pre- and post- processing.
)rM   rN   r   r   idsN)r   r   r   r   r   )r   r-   r.   r/   _groupby_oprM   rN   r   )rO   r   r   r   r   r   r   s          r4   cython_operation WrappedCythonOp.cython_operation  s     	D)&"**--%% HH#22#   **

 
 	
r6   )rN   rM   rL   )rL   strrM   r   rN   r   returnNone)rM   r   r   r   )rL   r   rM   r   r3   np.dtyper   r   )r   
np.ndarrayr   r   )r   intr   r   r   r   )r3   r   r   r   )r   r   r   r   r   r   r   r   r   npt.NDArray[np.bool_] | Noner   r   r   r   )r   r   r   r
   r   r   )r   r
   r   r   r   r   r   r   r   r   r   r
   )__name__
__module____qualname____firstlineno____doc__	frozensetr   rP   	functoolspartialr   group_any_allgroup_idxmin_idxmaxra   rw   __annotations__r   classmethodr{   cacher   r   r   r   r   r   r   r   r   r   __static_attributes__r   r6   r4   r@   r@   i   s    CN-
9$$Z%=%=N
9$$Z%=%=N
 ;
 L	

 i''
(F(FXV
 i''
(F(FXV
 ;
 ;
 L
 ,
 ;
 9$$Z%9%9F
 9$$Z%9%9F
 L
 [
  L!
" L#
( '$$$ 
)* : QKM  __'' ')1'?C'  'R#J&# 4  .248)
)
 	)

 )
 )
 +)
 2)
 
)
 )
V [[ 	[
 [ [ +[ 2[ 
[ [z    !
 !
 	!

 !
 !
 !
 
!
 !
r6   r@   c                     \ rS rSr% SrS\S'     S%         S&S jjr\S'S j5       r\S(S j5       r	S)S jr
\S*S	 j5       r S+     S,S
 jjr\S+S-S jj5       r\\S 5       5       r\S.S j5       r\S/S j5       r\\S0S j5       5       r\S1S j5       r\S2S j5       r\S3S j5       r\S4S j5       r\\S5S j5       5       r\\S5S j5       5       r\S6S j5       r\S/S j5       r\  S7S j5       r\\S*S j5       5       r\S8S j5       r\S9S j5       r\S:S j5       r \ S;         S<S jj5       r!\ S=       S>S jj5       r"\      S?S j5       r#\ S+       S@S  jj5       r$\\S/S! j5       5       r%\\S/S" j5       5       r&S#r'g$)ABaseGrouperi0  a`  
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

r   r   c                    [        U[        5      (       d   U5       eXl        [        U5      U l        X0l        X@l        g rJ   )r-   r   r   list
_groupings_sortdropna)rO   r   	groupingssortr   s        r4   rP   BaseGrouper.__init__B  s6     $&&,,&	26y/
r6   c                    U R                   $ rJ   )r   rO   s    r4   r   BaseGrouper.groupingsP  s    r6   c                :    [        S U R                   5       5      $ )Nc              3  8   #    U  H  oR                   v   M     g 7frJ   )r   ).0pings     r4   	<genexpr>$BaseGrouper.shape.<locals>.<genexpr>V  s     =nd\\ns   )tupler   r   s    r4   r   BaseGrouper.shapeT  s    =dnn===r6   c                ,    [        U R                  5      $ rJ   )iterindicesr   s    r4   __iter__BaseGrouper.__iter__X  s    DLL!!r6   c                ,    [        U R                  5      $ rJ   )r<   r   r   s    r4   nkeysBaseGrouper.nkeys[  s    4>>""r6   c              #  l   #    U R                  XS9nU R                  n[        XC5       Sh  vN   g N7f)j
Groupby iterator

Returns
-------
Generator yielding sequence of (name, subsetted object)
for each group
r   N)_get_splittergroup_keys_seqzip)rO   datar   splitterkeyss        r4   get_iteratorBaseGrouper.get_iterator_  s3      %%d%6""t&&&s   *424c           	     d    U R                   u  p4n[        UUUU R                  U R                  US9$ )z6
Returns
-------
Generator yielding subsetted objects
)
sorted_idssort_idxr   )
group_infor  _sorted_ids	_sort_idx)rO   r  r   r   _r   s         r4   r  BaseGrouper._get_splittern  s:     //''^^
 	
r6   c                    [        U R                  5      S:X  a  U R                  S   $ U R                  u  pn[	        XU R                  U R
                  5      $ Nr9   r   )r<   r   levelsr  r$   codesrO   r   r  r   s       r4   r  BaseGrouper.group_keys_seq  sI     t~~!#;;q>!"ooOCG &cDKKLLr6   c                b   [        U R                  5      S:X  a8  [        U R                  [        5      (       a  U R                  S   R
                  $ U R                   Vs/ s H  oR                  PM     nnU R                   Vs/ s H  oR                  PM     nn[        X#5      $ s  snf s  snf )z"dict {group name -> group indices}r9   r   )	r<   r   r-   result_indexr   r  r$  _group_indexr'   )rO   r  
codes_listr  s       r4   r  BaseGrouper.indices  s     t~~!#
43D3DFV(W(W>>!$,,,-1^^<^Tjj^
<.2nn=nd!!n=
11 ==s    B'B,c                   [        U R                  U R                  U R                  SS9n[	        XR                  S9u  pU R
                  (       a9  [        R                  " US:  5      n[        R                  " US:H  5      U   nX   n[        XR                  5      nU R
                  (       a  U[        R                  " WU5      -  nU$ )zB
Get the original integer locations of result_index in the input.
Tr   xnullr   r   r   )r%   r$  r   r   r"   rN   r.   whererr   r&   r   take)rO   group_indexr  r   	null_gapsr   s         r4   result_ilocsBaseGrouper.result_ilocs  s     &JJ

4
 .k

K88K1,-D		+"34T:I%+K'\\Bbggi00Fr6   c                X    U R                    Vs/ s H  oR                  PM     sn$ s  snf rJ   )r   r$  rO   r  s     r4   r$  BaseGrouper.codes  s"     (,~~6~t

~666   'c                X    U R                    Vs/ s H  oR                  PM     sn$ s  snf rJ   )r   r)  r7  s     r4   r#  BaseGrouper.levels  s"    .2nn=nd!!n===r9  c                X    U R                    Vs/ s H  oR                  PM     sn$ s  snf rJ   )r   rW   r7  s     r4   namesBaseGrouper.names  s     &*nn5nd		n555r9  c                    U R                   u  pnU(       a  [        R                  " XS:g     US9nO/ n[        X@R                  SSS9$ )z
Compute group sizes.
r   )	minlengthr   F)indexr3   r   )r  r.   bincountr!   r(  )rO   r   r  r   r   s        r4   rF   BaseGrouper.size  sD    
 //++c)n@CCc!2!2'NNr6   c                   [        U R                  5      S:X  a  U R                  S   R                  $ / nU R                   H_  nUR                  n[	        U[
        5      (       d  UR                  U5        M7  UR                  UR                  S   R                  5        Ma     [        R                  " U5      nU R                  R                  U5      $ )!dict {group name -> group labels}r9   r   )r<   r   groupsgrouping_vectorr-   r   appendr   from_arraysr   groupby)rO   
to_groupbyr  gvrA  s        r4   rF  BaseGrouper.groups  s     t~~!#>>!$+++J))!"k22%%b)%%bll1o&E&EF ' **:6E99$$U++r6   c                F    [        U R                  S   5      R                  $ Nr   )r   r  is_monotonic_increasingr   s    r4   is_monotonicBaseGrouper.is_monotonic  s     T__Q'(@@@r6   c                T    [        U R                  S   S:  R                  5       5      $ )z5
Whether grouper has null value(s) that are dropped.
r   )r   r  rB   r   s    r4   rN   BaseGrouper.has_dropped_na  s&     T__Q'!+00233r6   c                Z    U R                  5       u  p[        U5      n[        U5      nXU4$ rJ   )_get_compressed_codesr<   r   )rO   r   obs_group_idsr   s       r4   r  BaseGrouper.group_info  s2    "&"<"<">m$&x0//r6   c                &    U R                   u  n  nU$ rJ   )r  rO   r   r  s      r4   
codes_infoBaseGrouper.codes_info  s     OO	Q
r6   c                <   [        U R                  5      S:  a3  [        U R                  U R                  SSS9n[        XR                  S9$ U R                  S   nUR                  [        R                  " [        UR                  5      [        R                  S94$ )Nr9   Tr-  r/  r   r   )r<   r   r%   r$  r   r"   r   r.   aranger)  r   )rO   r2  r  s      r4   rV  !BaseGrouper._get_compressed_codes  sv    
 t~~")$**djjtSWXK'**EE ~~a zz299S):):%;277KKKr6   c                ,    [        U R                  5      $ rJ   )r<   r(  r   s    r4   r   BaseGrouper.ngroups  s     4$$%%r6   c                d    U R                   nU R                  u  p#n[        X#U R                  USS9$ )NT)r.  )r$  r  r#   r   )rO   r$  r   obs_idsr  s        r4   reconstructed_codesBaseGrouper.reconstructed_codes  s-    

//a#C$**e4PPr6   c                4   [        U R                  5      S:X  a5  U R                  S   R                  R                  U R                  S   5      $ U R
                  nU R                   Vs/ s H  o"R                  PM     nn[        X1SU R                  S9$ s  snf )Nr9   r   F)r#  r$  verify_integrityr=  )r<   r   _result_indexrenamer=  rd  r   )rO   r$  r  r#  s       r4   r(  BaseGrouper.result_index  s    t~~!#>>!$2299$**Q-HH((15@$$@djj
 	
 As   )Bc                0   [        U R                  5      S:X  a  U R                  S   R                  /$ / n[        U R                  U R                  5       H<  u  p#[        U5      nUR                  R                  U5      nUR                  U5        M>     U$ r"  )r<   r   _group_arrayliker  rd  r   r1  rH  )rO   	name_listr  r$  r#  s        r4   get_group_levelsBaseGrouper.get_group_levels  s     t~~!#NN1%6677	t~~t/G/GHKD'.E**//6FV$	 I r6   c           	         US;   d   e[        XU R                  S9nU R                  u  n  n	U R                  n
UR                  " SUUUUU
S.UD6$ )z+
Returns the values of a cython operation.
)rv   ru   rK   )r   r   r   r   r   r   )r@   rN   r  r   r   )rO   rL   r   rM   r   r   r   cy_opr   r  r   s              r4   _cython_operationBaseGrouper._cython_operation,  sn     1111T4CVCVWOO	Q,,%% 

 
 	
r6   c                    [        UR                  [        R                  5      (       d  SnU R	                  X5      n[
        R                  " USS9nU(       a  [        XQR                  SS9nU$ UnU$ )z
Parameters
----------
obj : Series
func : function taking a Series and returning a scalar-like
preserve_dtype : bool
    Whether the aggregation is known to be dtype-preserving.

Returns
-------
np.ndarray or ExtensionArray
TF)	try_float)numeric_only)	r-   r8   r.   r/   _aggregate_series_pure_pythonr	   maybe_convert_objectsr   r3   )rO   r2   r   preserve_dtyper   npvaluesr   s          r4   
agg_seriesBaseGrouper.agg_seriesH  si    " #++rzz22
 "N33C>,,VuE-h		PTUC 
 C
r6   c                   U R                   u    p4[        R                  " USS9nSnU R                  USS9n[	        U5       H:  u  pU" U	5      n
[        U
5      n
U(       d  [        XR                  5        SnXU'   M<     U$ )NOr   Fr   r  T)r  r.   r   r  	enumerater>   r5   r3   )rO   r2   r   r  r   r   initializedr  r   groupr=   s              r4   rw  )BaseGrouper._aggregate_series_pure_pythoni  s     1'-%%c%2!(+HAu+C %C"34"1I , r6   c                   SnU R                  X#S9nU R                  n/ n[        Xe5      nU H[  u  p[        R	                  U
SU	5        U
R
                  nU" U
5      nU(       d  [        XU5      (       d  SnUR                  U5        M]     [        U5      S:X  a&  [        USS 5      S;   a  U" UR                  S S 5        Xt4$ )NFr  rW   Tr   r   )rd   rS   rU   )r  r  r  r0   __setattr__axes_is_indexed_likerH  r<   r   iloc)rO   r   r  r   mutatedr  
group_keysresult_valueszippedkeyr  
group_axesr=   s                r4   apply_groupwiseBaseGrouper.apply_groupwise  s     %%d%6((
 Z* JC ufc2 JE(C#3CT#J#J  % ! z?aGAz4$@ E
 %
 diim%%r6   c                6    U R                   u  pn[        X5      $ rJ   )r  r&   r%  s       r4   r  BaseGrouper._sort_idx  s     //%c33r6   c                X    U R                   u  n  nUR                  U R                  5      $ rJ   )r  r1  r  rZ  s      r4   r  BaseGrouper._sorted_ids  s&     OO	Qxx''r6   )r   r   r   r   N)TT)
r   r   r   zSequence[grouper.Grouping]r   r   r   r   r   r   r   zlist[grouper.Grouping])r   r   )r   zIterator[Hashable]r   r   r   )r  r   r   r   r   z#Iterator[tuple[Hashable, NDFrameT]])r  r+   r   r   r   DataSplitter)r   z$dict[Hashable, npt.NDArray[np.intp]]r   npt.NDArray[np.intp])r   z#list[npt.NDArray[np.signedinteger]]r   zlist[Index]r   zlist[Hashable])r   r!   )r   zdict[Hashable, np.ndarray])r   r   r   z6tuple[npt.NDArray[np.intp], npt.NDArray[np.intp], int])r   z:tuple[npt.NDArray[np.signedinteger], npt.NDArray[np.intp]])r   zlist[npt.NDArray[np.intp]]r   r   )r   zlist[ArrayLike])r   )
rL   r   rM   r   r   r   r   r   r   r
   )F)r2   r!   r   r   ry  r   r   r
   )r2   r!   r   r   r   znpt.NDArray[np.object_])r   r   r  zDataFrame | Seriesr   r   r   ztuple[list, bool])(r   r   r   r   r   r   rP   propertyr   r   r	  r  r  r   r  r   r  r  r4  r$  r#  r=  rF   rF  rQ  rN   r  r[  rV  r   rd  r(  rn  rr  r{  rw  r  r  r  r   r   r6   r4   r   r   0  sn    K  . 	
  
   > >" # # /0''$+'	,' 
 
  M  M 2 2  4 7  7 > > 6 6 
O 
O , , A  A 4  4 0 0  
 
L	C
L 
L &  & Q Q
 
 
  $  

 	

 
 
 

 
6 BG!);?	 @ !)	  . EF$&$&!3$&;B$&	$& $&R 4  4
 (  (r6   r   c                     \ rS rSr% SrS\S'   S\S'    S SS jjr\S	 5       r\	SS
 j5       r
\SS j5       rSSS jjr\S 5       r\SS j5       r\SS j5       r\SS j5       r\	SS j5       r\	SS j5       r\	S S j5       rSrg)!
BinGrouperi  a  
This is an internal Grouper class

Parameters
----------
bins : the split index of binlabels to group the item of axis
binlabels : the label list
indexer : np.ndarray[np.intp], 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

Examples
--------
bins: [2, 4, 6, 8, 10]
binlabels: DatetimeIndex(['2005-01-01', '2005-01-03',
    '2005-01-05', '2005-01-07', '2005-01-09'],
    dtype='datetime64[ns]', freq='2D')

the group_info, which contains the label of each item in grouped
axis, the index of label in label list, group number, is

(array([0, 0, 1, 1, 2, 2, 3, 3, 4, 4]), array([0, 1, 2, 3, 4]), 5)

means that, the grouped axis has 10 items, can be grouped into 5
labels, the first and second items belong to the first label, the
third and forth items belong to the second label, and so on

znpt.NDArray[np.int64]binsr   	binlabelsNc                    [        U5      U l        [        U5      U l        X0l        [        U R                  5      [        U R                  5      :X  d   eg rJ   )r   r  r    r  indexerr<   )rO   r  r  r  s       r4   rP   BinGrouper.__init__  sB     !&	%i0 4>>"c$))n444r6   c                    [        U R                  U R                  5       VVs0 s H  u  pU[        Ld  M  X_M     nnnU$ s  snnf )rE  )r  r  r  r   )rO   r  valuer   s       r4   rF  BinGrouper.groups  sL     "$..$))<
<
#~ CJ< 	 

 
s
   AAc                    g)Nr9   r   r   s    r4   r  BinGrouper.nkeys  s     r6   c                    U R                   u  n  nU R                  b%  [        R                  " XR                  45      nX   nU$ rJ   )r  r  r.   lexsort)rO   r   r  sorters       r4   r[  BinGrouper.codes_info  s>     OO	Q<<#ZZll 34F+C
r6   c              #  &  ^#    US:X  a  U4S jnOU4S jn[        TR                  U   5      nSn[        U R                  U R                  5       H  u  pgU[
        La  Xs" XV5      4v   UnM     XT:  a  U R                  S   U" US5      4v   gg7f)r  r   c                    > TR                   X $ rJ   r  startedger  s     r4   <lambda>)BinGrouper.get_iterator.<locals>.<lambda>  s    5)>r6   c                ,   > TR                   S S 2X24   $ rJ   r  r  s     r4   r  r    s    1ej=)Ar6   r   N)r<   r  r  r  r  r   )rO   r  r   slicerlengthr  r  labels    `      r4   r  BinGrouper.get_iterator  s      19>FAFTYYt_%tyy$..9KDCVE000E :
 >..$fUD&999 s   BBc                    [         R                  " [        5      nSn[        U R                  U R
                  5       H-  u  p4X$:  d  M  U[        La  [        [        X$5      5      X'   UnM/     U$ rO  )collectionsdefaultdictr   r  r  r  r   range)rO   r  r   r  bins        r4   r  BinGrouper.indices  s[    ))$/dnndii8JEw#%)%-%8GN	 9
 r6   c                   U R                   n[        R                  " U[        R                  S9n[        R                  " [        R
                  SU R                  4   5      n[        U5      nU[        U R                  5      :X  a,  [        R                  " [        R                  " U5      U5      nO>[        R                  " [        R
                  S[        R                  " U5      4   U5      n[        U5      UU4$ )Nr   r   r   )
r   r.   r^  r   diffr_r  r   r<   repeat)rO   r   rW  repr   s        r4   r  BinGrouper.group_info(  s    ,,		'9ggbeeAtyyL)*!#&c$))n$yy7!3S9Hyyr299W+='=!>DH  )
 	
r6   c                    [         R                  S[         R                  " U R                  SS  U R                  S S :g  5      S-   4   /$ )Nr   r9   r   )r.   r  flatnonzeror  r   s    r4   rd  BinGrouper.reconstructed_codes:  sB     a		!"3B(GH1LLMNNr6   c                    [        U R                  5      S:w  a,  [        U R                  S   5      (       a  U R                  SS  $ U R                  $ )Nr   r9   )r<   r  r   r   s    r4   r(  BinGrouper.result_index?  sA    t~~!#T^^A->(?(?>>!"%%~~r6   c                    U R                   /$ rJ   )r  r   s    r4   r#  BinGrouper.levelsF  s    r6   c                0    U R                   R                  /$ rJ   )r  rW   r   s    r4   r=  BinGrouper.namesJ  s    ##$$r6   c                    U R                   nU R                  S   nUR                  U5      n[        R                  " X3SS UR
                  S9nU/$ )Nr   F)in_axisleveluniques)r  r  r1  r   Groupingr8   )rO   levr$  r   r  s        r4   r   BinGrouper.groupingsN  sL    nn"%Es{{
 vr6   )r  r  r  rJ   r   r   r  r  r  )r  r+   r   r   r  )r   zlist[np.ndarray]r  r  r  r  )r   r   r   r   r   r   rP   r   rF  r  r  r[  r  r  r  rd  r(  r#  r=  r   r   r   r6   r4   r  r    s    <   	5
 
5 	 	    :2 	 	 
 
" O O       % %  r6   r  c                    [        U [        5      (       a0  [        U5      S:  a  gU R                  U   R	                  X   5      $ [        U [
        5      (       a   U R                  U   R	                  X   5      $ g)Nr9   F)r-   r!   r<   r  equalsr   )r2   r  r   s      r4   r  r  Y  sc    #vt9q=xx~$$TZ00	C	#	#xx~$$TZ00r6   c                  h    \ rS rSrSS.             S
S jjrSS jr\SS j5       rSS jrSr	g	)r  ih  r   r  c                   Xl         [        U5      U l        X0l        XPl        X@l        X`l        [        U[        5      (       d   U5       eg rJ   )	r  r   r   r   _slabelsr  r   r-   r   )rO   r  r   r   r  r  r   s          r4   rP   DataSplitter.__init__i  sA     	)&1"!	$$$*d*$r6   c              #    #    U R                   nU R                  S:X  a  g [        R                  " U R                  U R                  5      u  p#[        X#5       H"  u  pEU R                  U[        XE5      5      v   M$     g 7frO  )_sorted_datar   r	   generate_slicesr  r  _chopslice)rO   sdatastartsendsr  ends         r4   r	  DataSplitter.__iter__}  sd     !!<<1 **4==$,,Gf+JE**UE%$566 ,s   A=A?c                ^    U R                   R                  U R                  U R                  S9$ )Nr  )r  r1  r  r   r   s    r4   r  DataSplitter._sorted_data  s!    yy~~dnn499~==r6   c                    [        U 5      erJ   r   )rO   r  	slice_objs      r4   r  DataSplitter._chop  s    !$''r6   )r  r  r   r  r   r   N)r  r   r   r  r   r   r  r  r  r  r   r   r   r   )r   r)   )r   r   )r  r  r   r+   )
r   r   r   r   rP   r	  r   r  r  r   r   r6   r4   r  r  h  sn     ++ %+ 	+ '+ )+ + 
+(7 > >(r6   r  c                      \ rS rSrSS jrSrg)SeriesSplitteri  c                    UR                   R                  U5      nUR                  X3R                  S9nUR                  Ul        UR                  USS9$ )Nr  rJ  method)_mgr	get_slice_constructor_from_mgrr  rW   _name__finalize__)rO   r  r  mgrsers        r4   r  SeriesSplitter._chop  sN    jj""9-))#HH)=JJ	i88r6   r   N)r  r!   r  r  r   r!   r   r   r   r   r  r   r   r6   r4   r  r    s    9r6   r  c                      \ rS rSrSS jrSrg)FrameSplitteri  c                    UR                   R                  USU R                  -
  S9nUR                  X3R                  S9nUR                  USS9$ )Nr9   r  r  rJ  r  )r  r  r   r  r  r  )rO   r  r  r  dfs        r4   r  FrameSplitter._chop  sO     jj""91tyy="A((88(<uY77r6   r   N)r  r   r  r  r   r   r  r   r6   r4   r  r    s    8r6   r  r  c          	     V    [        U [        5      (       a  [        nO[        nU" XX#XES9$ )N)r  r  r   )r-   r!   r  r  )r  r   r   r  r  r   klasss          r4   r  r    s1     $$2 gZ r6   r  )r   r   r   r   )r  r+   r   r  r   r   r  r  r  r  r   r   r   r  )Kr   
__future__r   r  r   typingr   r   r   r   numpyr.   pandas._libsr   r	   pandas._libs.groupby_libsrJ  r   pandas._typingr
   r   r   r   r   pandas.errorsr   pandas.util._decoratorsr   pandas.core.dtypes.castr   r   pandas.core.dtypes.commonr   r   r   r   r   pandas.core.dtypes.missingr   r   pandas.core.framer   pandas.core.groupbyr   pandas.core.indexes.apir   r   r   r    pandas.core.seriesr!   pandas.core.sortingr"   r#   r$   r%   r&   r'   collections.abcr(   r)   r*   pandas.core.genericr+   r5   r>   r@   r   r  r  r  r  r  r  r   r6   r4   <module>r     s:   #     * )  . 2 
 ( '  &    ,>D
 D
NF( F(R] ]@'(78$ '(T9\ 9	8L 	8& 
  
 # %  r6   