
     -i                    0   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	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/J0r0J1r1J2r2  SSK3J4r4  SSK5J6r6J7r7J8r8J9r9J:r:J;r;  \(       a  SSK<J=r=J>r>J?r?  SSK@JArA  S$S jrBS rC " S S5      rD " S S5      rE " S S\E5      rFS%S jrG " S S\	\   5      rH " S S\H5      rI " S  S!\H5      rJSS".             S&S# jjrKg)'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Any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     J/var/www/html/venv/lib/python3.13/site-packages/pandas/core/groupby/ops.pycheck_result_arrayr6   Q   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   )hasattrr9   ndimlen)ress    r5   extract_resultr?   \   s=    
 sIkk88q=SX]a&CJr7   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SAS/ jrSBS0 jrSCS1 jrSCS2 jr\S3S3S4S5.               SDS6 jj5       r\S4S7.               SDS8 jj5       r\SES9 j5       r\S:S;.           SFS< jj5       rS=rg3)GWrappedCythonOpj   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)selfrM   rN   rO   s       r5   __init__WrappedCythonOp.__init__~   s    	,r7   rC   )val_testrD   sum	group_sumprod
group_prodrH   )namerI   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cummaxrE   )	aggregate	transformzdict[str, dict]_CYTHON_FUNCTIONS   c                *    XR                   S   ;   a  gg)Nrv   rw   )rx   )clsrN   s     r5   get_kind_from_how!WrappedCythonOp.get_kind_from_how   s    ''44r7   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_   rr   z2function is not implemented for this dtype: [how->z,dtype->])rc   rd   rH   rI   re   r1   zPThis should not be reached. Please report a bug at github.com/pandas-dev/pandas/)
rX   rx   callablegetattr
libgroupbyr/   r4   r1   NotImplementedError__signatures__)r{   rM   rN   r4   
is_numeric	dtype_strftypefs           r5   _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 r7   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_   rc   rd   re   iu)ra   r]   rw   )rT   rk   rV   rs   rr   i)rN   r   r4   rM   rO   r   r   )rP   valuesrN   s      r5   _get_cython_vals WrappedCythonOp._get_cython_vals   s     hh22 $F+F"  \\$&o%		[(T-@-@ (/  DD<<$$+)&1F  +62Fr7   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$ )Nr:   rk   z<arity of more than 1 is not supported for the 'how' argumentrw   )rN   rM   _cython_aritygetr   shape)rP   ngroupsr   rN   rM   arity	out_shapes          r5   _get_output_shape!WrappedCythonOp._get_output_shape   s    hhyy""&&sA. &= (I  QY%N  [ I  !
V\\!"%55Ir7   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      $ )NrE   float64rH   rI   intpiufcbr1   )rN   rM   itemsizer/   r4   )rP   r4   rN   	out_dtypes       r5   _get_out_dtypeWrappedCythonOp._get_out_dtype  s^    hh&=!I(( IzzW$$zzl5>>*:;	$	xx	""r7   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.
)rT   rs   rT   rV   rr   )r]   r_   ra   rc   rd   fciub)rN   r/   r4   boolint64rM   r   )rP   r4   rN   s      r5   _get_result_dtype!WrappedCythonOp._get_result_dtype  s     hh==&xx)) '  ;;zzT!u$xx

++r7   Nr   )maskresult_maskinitialc          
        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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US.UD6$ )Nr:   )	min_countr   comp_idsr   r   r   r   )r<   _call_cython_opr   T)rP   r   r   r   r   r   r   r   kwargsvalues2dr>   s              r5   _cython_op_ndim_compat&WrappedCythonOp._cython_op_ndim_compat7  s     ;;!dAgHD!G}&)$'2&&	#!'	 	C yy|q 1v 55L##	
#	
 	
 		
r7   )r   c               l   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 R                  S:X  a  XxS'   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  XhS'   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)rC   rD   skipnaF)copyr4   rv   )rH   rI   rY   r[   r]   ri   rg   rT   rT   r   )outcountsr   labelsr   r   r   is_datetimelike)rd   rc   ra   rk   rV   r_   )rc   rd   r   )r   r   r   )r   r   r   r   r   )re   )r   r   r   r   r   r   z is not implementedrE   r   )r   r   r   r   r   r   r   r   )rT   rV   r   r:   r    )r4   rM   viewastyper/   float32rN   r   r1   rC   r   r   int8r   r   r   r   r   r   emptyzerosr   r   r[   rD   nancast_blocklistr   r   )rP   r   r   r   r   r   r   r   r   orig_valuesr4   r   r   r   funcr   resultr   cutoffempty_groups	res_dtype	op_results                         r5   r   WrappedCythonOp._call_cython_opf  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 	 	 88u$ )09% 
!!#' +$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r7   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 2r:   r   )r<   r   r   r4   )rP   axisr   s      r5   _validate_axisWrappedCythonOp._validate_axis	  sX    ;;?%&VWW;;!19"d"9$V\\22 199 3r7   )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.
)rN   rO   r   r   idsN)r   r   r   r   r   )r   r.   r/   r0   _groupby_oprN   rO   r   )rP   r   r   r   r   r   r   s          r5   cython_operation WrappedCythonOp.cython_operation  s     	D)&"**--%% HH#22#   **

 
 	
r7   )rO   rN   rM   )rM   strrN   r   rO   r   returnNone)rN   r   r   r   )rM   r   rN   r   r4   np.dtyper   r   )r   
np.ndarrayr   r   )r   intr   r   r   r   )r4   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   r   r   )__name__
__module____qualname____firstlineno____doc__	frozensetr   rQ   	functoolspartialr   group_any_allgroup_idxmin_idxmaxrb   rx   __annotations__r   classmethodr|   cacher   r   r   r   r   r   r   r   r   r   __static_attributes__r   r7   r5   rA   rA   j   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,
 ,
 
,
 ,
\  `` 	`
 ` ` +` 2` ` 
` `D    !
 !
 	!

 !
 !
 !
 
!
 !
r7   rA   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BaseGrouperi9  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 rK   )r.   r   r   list
_groupings_sortdropna)rP   r   	groupingssortr   s        r5   rQ   BaseGrouper.__init__K  s6     $&&,,&	26y/
r7   c                    U R                   $ rK   )r   rP   s    r5   r   BaseGrouper.groupingsY  s    r7   c                :    [        S U R                   5       5      $ )Nc              3  8   #    U  H  oR                   v   M     g 7frK   )r   ).0pings     r5   	<genexpr>$BaseGrouper.shape.<locals>.<genexpr>_  s     =nd\\ns   )tupler   r   s    r5   r   BaseGrouper.shape]  s    =dnn===r7   c                ,    [        U R                  5      $ rK   )iterindicesr   s    r5   __iter__BaseGrouper.__iter__a  s    DLL!!r7   c                ,    [        U R                  5      $ rK   )r=   r   r   s    r5   nkeysBaseGrouper.nkeysd  s    4>>""r7   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)rP   datar   splitterkeyss        r5   get_iteratorBaseGrouper.get_iteratorh  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)rP   r  r   r   _r   s         r5   r  BaseGrouper._get_splitterw  s:     //''^^
 	
r7   c                    [        U R                  5      S:X  a  U R                  S   $ U R                  u  pn[	        XU R                  U R
                  5      $ Nr:   r   )r=   r   levelsr  r%   codesrP   r   r!  r   s       r5   r  BaseGrouper.group_keys_seq  sI     t~~!#;;q>!"ooOCG &cDKKLLr7   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}r:   r   )	r=   r   r.   result_indexr   r
  r&  _group_indexr(   )rP   r  
codes_listr  s       r5   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#   rO   r/   wherers   r'   r   take)rP   group_indexr!  r   	null_gapsr   s         r5   result_ilocsBaseGrouper.result_ilocs  s     &JJ

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

K88K1,-D		+"34T:I%+K'\\Bbggi00Fr7   c                X    U R                    Vs/ s H  oR                  PM     sn$ s  snf rK   )r   r&  rP   r  s     r5   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 rK   )r   r+  r9  s     r5   r%  BaseGrouper.levels  s"    .2nn=nd!!n===r;  c                X    U R                    Vs/ s H  oR                  PM     sn$ s  snf rK   )r   rX   r9  s     r5   namesBaseGrouper.names  s     &*nn5nd		n555r;  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)indexr4   r   )r  r/   bincountr"   r*  )rP   r   r!  r   r   s        r5   rG   BaseGrouper.size  sD    
 //++c)n@CCc!2!2'NNr7   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}r:   r   )r=   r   groupsgrouping_vectorr.   r   appendr    from_arraysr   groupby)rP   
to_groupbyr  gvrC  s        r5   rH  BaseGrouper.groups  s     t~~!#>>!$+++J))!"k22%%b)%%bll1o&E&EF ' **:6E99$$U++r7   c                F    [        U R                  S   5      R                  $ Nr   )r   r  is_monotonic_increasingr   s    r5   is_monotonicBaseGrouper.is_monotonic  s     T__Q'(@@@r7   c                T    [        U R                  S   S:  R                  5       5      $ )z5
Whether grouper has null value(s) that are dropped.
r   )r   r  rC   r   s    r5   rO   BaseGrouper.has_dropped_na  s&     T__Q'!+00233r7   c                Z    U R                  5       u  p[        U5      n[        U5      nXU4$ rK   )_get_compressed_codesr=   r   )rP   r   obs_group_idsr   s       r5   r  BaseGrouper.group_info  s2    "&"<"<">m$&x0//r7   c                &    U R                   u  n  nU$ rK   )r  rP   r   r!  s      r5   
codes_infoBaseGrouper.codes_info  s     OO	Q
r7   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$ )Nr:   Tr/  r1  r   r   )r=   r   r&   r&  r   r#   r   r/   aranger+  r   )rP   r4  r  s      r5   rX  !BaseGrouper._get_compressed_codes  sv    
 t~~")$**djjtSWXK'**EE ~~a zz299S):):%;277KKKr7   c                ,    [        U R                  5      $ rK   )r=   r*  r   s    r5   r   BaseGrouper.ngroups  s     4$$%%r7   c                d    U R                   nU R                  u  p#n[        X#U R                  USS9$ )NT)r0  )r&  r  r$   r   )rP   r&  r   obs_idsr!  s        r5   reconstructed_codesBaseGrouper.reconstructed_codes  s-    

//a#C$**e4PPr7   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 )Nr:   r   F)r%  r&  verify_integrityr?  )r=   r   _result_indexrenamer?  rf  r    )rP   r&  r  r%  s       r5   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  rf  r   r3  rJ  )rP   	name_listr  r&  r%  s        r5   get_group_levelsBaseGrouper.get_group_levels"  s     t~~!#NN1%6677	t~~t/G/GHKD'.E**//6FV$	 I r7   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.
)rw   rv   rL   )r   r   r   r   r   r   )rA   rO   r  r   r   )rP   rM   r   rN   r   r   r   cy_opr   r!  r   s              r5   _cython_operationBaseGrouper._cython_operation5  sn     1111T4CVCVWOO	Q,,%% 

 
 	
r7   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.   r9   r/   r0   _aggregate_series_pure_pythonr
   maybe_convert_objectsr   r4   )rP   r3   r   preserve_dtyper   npvaluesr   s          r5   
agg_seriesBaseGrouper.agg_seriesQ  si    " #++rzz22
 "N33C>,,VuE-h		PTUC 
 C
r7   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?   r6   r4   )rP   r3   r   r!  r   r   initializedr  r   groupr>   s              r5   ry  )BaseGrouper._aggregate_series_pure_pythonr  s     1'-%%c%2!(+HAu+C %C"34"1I , r7   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  rX   Tr   r   )re   rT   rV   )r  r  r  r1   __setattr__axes_is_indexed_likerJ  r=   r   iloc)rP   r   r  r   mutatedr  
group_keysresult_valueszippedkeyr  
group_axesr>   s                r5   apply_groupwiseBaseGrouper.apply_groupwise  s     %%d%6((
 Z* JC ufc2 JE(C#3CT#J#J  % ! z?aGAz4$@ E
 %
 diim%%r7   c                6    U R                   u  pn[        X5      $ rK   )r  r'   r'  s       r5   r   BaseGrouper._sort_idx  s     //%c33r7   c                X    U R                   u  n  nUR                  U R                  5      $ rK   )r  r3  r   r\  s      r5   r  BaseGrouper._sorted_ids  s&     OO	Qxx''r7   )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   )
rM   r   rN   r   r   r   r   r   r   r   )F)r3   r"   r   r   r{  r   r   r   )r3   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   rQ   propertyr   r   r  r  r  r   r  r   r  r
  r6  r&  r%  r?  rG   rH  rS  rO   r  r]  rX  r   rf  r*  rp  rt  r}  ry  r  r   r  r   r   r7   r5   r   r   9  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
 (  (r7   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 rK   )r   r  r!   r  indexerr=   )rP   r  r  r  s       r5   rQ   BinGrouper.__init__  sB     !&	%i0 4>>"c$))n444r7   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 )rG  )r  r  r  r	   )rP   r  valuer   s       r5   rH  BinGrouper.groups  sL     "$..$))<
<
#~ CJ< 	 

 
s
   AAc                    g)Nr:   r   r   s    r5   r  BinGrouper.nkeys  s     r7   c                    U R                   u  n  nU R                  b%  [        R                  " XR                  45      nX   nU$ rK   )r  r  r/   lexsort)rP   r   r!  sorters       r5   r]  BinGrouper.codes_info  s>     OO	Q<<#ZZll 34F+C
r7   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 $ rK   r  startedger  s     r5   <lambda>)BinGrouper.get_iterator.<locals>.<lambda>  s    5)>r7   c                ,   > TR                   S S 2X24   $ rK   r  r  s     r5   r  r    s    1ej=)Ar7   r   N)r=   r  r  r  r  r	   )rP   r  r   slicerlengthr  r  labels    `      r5   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$ rQ  )collectionsdefaultdictr   r  r  r  r	   range)rP   r
  r   r  bins        r5   r
  BinGrouper.indices%  s[    ))$/dnndii8JEw#%)%-%8GN	 9
 r7   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)rP   r   rY  repr   s        r5   r  BinGrouper.group_info1  s    ,,		'9ggbeeAtyyL)*!#&c$))n$yy7!3S9Hyyr299W+='=!>DH  )
 	
r7   c                    [         R                  S[         R                  " U R                  SS  U R                  S S :g  5      S-   4   /$ )Nr   r:   r   )r/   r  flatnonzeror  r   s    r5   rf  BinGrouper.reconstructed_codesC  sB     a		!"3B(GH1LLMNNr7   c                    [        U R                  5      S:w  a,  [        U R                  S   5      (       a  U R                  SS  $ U R                  $ )Nr   r:   )r=   r  r   r   s    r5   r*  BinGrouper.result_indexH  sA    t~~!#T^^A->(?(?>>!"%%~~r7   c                    U R                   /$ rK   )r  r   s    r5   r%  BinGrouper.levelsO  s    r7   c                0    U R                   R                  /$ rK   )r  rX   r   s    r5   r?  BinGrouper.namesS  s    ##$$r7   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  r3  r   Groupingr9   )rP   levr&  r   r  s        r5   r   BinGrouper.groupingsW  sL    nn"%Es{{
 vr7   )r  r  r  rK   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   rQ   r   rH  r  r  r]  r  r
  r  rf  r*  r%  r?  r   r   r   r7   r5   r  r    s    <   	5
 
5 	 	    :2 	 	 
 
" O O       % %  r7   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)Nr:   F)r.   r"   r=   r  equalsr   )r3   r  r   s      r5   r  r  b  sc    #vt9q=xx~$$TZ00	C	#	#xx~$$TZ00r7   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  iq  r   r  c                   Xl         [        U5      U l        X0l        XPl        X@l        X`l        [        U[        5      (       d   U5       eg rK   )	r  r   r   r   _slabelsr   r   r.   r   )rP   r  r   r   r  r  r   s          r5   rQ   DataSplitter.__init__r  sA     	)&1"!	$$$*d*$r7   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rQ  )_sorted_datar   r
   generate_slicesr  r  _chopslice)rP   sdatastartsendsr  ends         r5   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  r3  r   r   r   s    r5   r  DataSplitter._sorted_data  s!    yy~~dnn499~==r7   c                    [        U 5      erK   r   )rP   r  	slice_objs      r5   r  DataSplitter._chop  s    !$''r7   )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   rQ   r  r   r  r  r   r   r7   r5   r  r  q  sn     ++ %+ 	+ '+ )+ + 
+(7 > >(r7   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  rL  method)_mgr	get_slice_constructor_from_mgrr  rX   _name__finalize__)rP   r  r  mgrsers        r5   r  SeriesSplitter._chop  sN    jj""9-))#HH)=JJ	i88r7   r   N)r  r"   r  r  r   r"   r   r   r   r   r  r   r   r7   r5   r  r    s    9r7   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$ )Nr:   r  r  rL  r  )r  r  r   r  r  r  )rP   r  r  r  dfs        r5   r  FrameSplitter._chop  sO     jj""91tyy="A((88(<uY77r7   r   N)r  r   r  r  r   r   r  r   r7   r5   r   r     s    8r7   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          r5   r  r    s1     $$2 gZ r7   r  )r   r   r   r   )r  r,   r   r  r   r   r  r  r  r  r   r   r   r  )Lr   
__future__r   r  r   typingr   r   r   r   r   numpyr/   pandas._libsr	   r
   pandas._libs.groupby_libsrL  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,   r6   r?   rA   r   r  r  r  r  r   r  r   r7   r5   <module>r     s:   #     * )  . 2 
 ( '  &    ,>L
 L
^F( F(R] ]@'(78$ '(T9\ 9	8L 	8& 
  
 # %  r7   