
    I j                       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  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-  SSK.J/r/J0r0J1r1J2r2  SSK3J4r4  SSK5J6r6J7r7J8r8J9r9J:r:  \(       a  SSK;J<r<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      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AnyGenericfinal)NaTlib)	ArrayLikeAxisIntNDFrameTShapenptAbstractMethodError)cache_readonly)maybe_downcast_to_dtype)ensure_float64ensure_int64ensure_platform_intensure_uint64is_1d_only_ea_dtype)isna
maybe_fill)Categorical)	DataFrame)grouper)CategoricalIndexIndex
MultiIndexensure_index)Series)compress_group_indexdecons_obs_group_idsget_group_indexget_group_index_sorterget_indexer_dict)Callable	GeneratorHashableIterator)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     h/root/GenerationalWealth/GenerationalWealth/venv/lib/python3.13/site-packages/pandas/core/groupby/ops.pycheck_result_arrayr5   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   )hasattrr8   ndimlen)ress    r4   extract_resultr>   \   s=    
 sIkk88q=SX]a&CJr6   c                  6   \ 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$0ES%S&S'S(S)S*.S+.rS,\S-'   S#S.0r\SAS/ j5       r\\R&                          SBS0 j5       5       rSCS1 jrSDS2 jrSES3 jrSES4 jr\S5S5S6S7.               SFS8 jj5       r\S6S9.               SFS: jj5       r\SGS; j5       r\S<S=.           SHS> jj5       rS?rg5)I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)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kurt
group_kurt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)Nrw   rx   )ry   )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;   a   U$ SUR                  ;  a  [        SU SU S35      eU$ [        SU5      e)	N)r^   rs   z2function is not implemented for this dtype: [how->z,dtype->])rb   rc   rG   rH   rd   rf   r0   zPThis should not be reached. Please report a bug at github.com/pandas-dev/pandas/)
rW   ry   callablegetattr
libgroupbyr.   r3   r0   NotImplementedError__signatures__)r|   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   rf   iu)r`   r\   rx   )rS   rl   rU   rt   rs   i)rM   r   r3   rL   rN   r   r   )rO   valuesrM   s      r4   _get_cython_vals WrappedCythonOp._get_cython_vals   s     hh:: $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/UR
                  SS  Q7nU$ )Nr9   rl   z<arity of more than 1 is not supported for the 'how' argumentrx   )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  !46<<#34I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ZZ7" ::,u~~&67I I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   rt   rS   rU   rs   )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   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$ )Nr9   )	min_countr   comp_idsr   r   r   r   )r;   _call_cython_opr   T)rO   r   r   r   r   r   r   r   kwargsvalues2dr=   s              r4   _cython_op_ndim_compat&WrappedCythonOp._cython_op_ndim_compat7  s     ;;!dAgHD!G}&)$'2&&	#!'	 	C yy|q 1v 55L##	
#	
 	
 		
r6   )r   c                  Un	UR                   n
U
R                  S;   nU
R                  S;   nU R                  S;   a  Uc  [        U5      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;   as  U
[        :X  a6  US	   (       a,  Ub)  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   mM)rB   rC   r   Tbuint8float16skipnaFcopyr3   rw   )	rG   rH   rX   rZ   r\   rj   rh   rS   r^   rS   r   )outcountsr   labelsr   r   r   is_datetimelike)rc   rb   r`   rl   rU   )rb   rc   r   )r   r   r   )r   r   r   r   r   r   )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   rM   r   viewastyper.   float32r0   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   r   orig_valuesr3   r   r   r   funcr   resultr   cutoffempty_groups	res_dtype	op_results                         r4   r   WrappedCythonOp._call_cython_opf  s4    ZZ7*
**,88~%|F|[[)FJZZ3[[)F<<9$]]2::.F88~%(#'DHHJJ!''+]]4e]499"''BFJ66D&)mm**7;	((DHHfllJW&&v.''5	BHHY@A99#XXgRXX6Fxx 
 
 88u$ )09% 
!!#' +$3
 
 BB88~-0?,-		
 ( +	 	 ^+ !# +   t%8-- !!# +  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   r   r
   )__name__
__module____qualname____firstlineno____doc__	frozensetr   rP   	functoolspartialr   group_any_allgroup_idxmin_idxmaxra   ry   __annotations__r   classmethodr}   cacher   r   r   r   r   r   r   r   r   r   __static_attributes__r   r6   r4   r@   r@   j   sH    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#
$ L%
* '$$$ 
+* < QKM  __'' ')1'?C'  'R#J&#4  .248,
,
 	,

 ,
 ,
 +,
 2,
 ,
 
,
 ,
\  cc 	c
 c c +c 2c c 
c cJ    !
 !
 	!

 !
 !
 !
 
!
 !
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r	\S)S j5       r
S*S	 jr\S+S
 j5       r\S,S j5       r\\S-S j5       5       r\S.S j5       r\S/S j5       r\S0S j5       r\S1S j5       r\S2S j5       r\\S3S j5       5       r\\S3S j5       5       r\S-S j5       r\\S)S j5       5       r\S4S j5       r\S-S j5       r\S5S j5       r\S6S j5       r\S6S j5       r          S7S jr        S8S jr \S9S j5       r!\ S:         S;S jj5       r"\ S<       S=S jj5       r#\      S>S  j5       r$\      S?S! j5       r%\\S-S" j5       5       r&S#r'g$)@BaseGrouperi<  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                l    [        U[        5      (       d   U5       eXl        X l        X0l        X@l        g rJ   )r-   r   r   
_groupings_sortdropna)rO   r   	groupingssortr   s        r4   rP   BaseGrouper.__init__N  s0     $&&,,&	#
r6   c                    U R                   $ rJ   )r   rO   s    r4   r   BaseGrouper.groupings\  s    r6   c                ,    [        U R                  5      $ rJ   )iterindicesr   s    r4   __iter__BaseGrouper.__iter__`  s    DLL!!r6   c                ,    [        U R                  5      $ rJ   )r<   r   r   s    r4   nkeysBaseGrouper.nkeysc  s    4>>""r6   c              #  n   #    U R                  U5      nU R                  n[        X2SS9 Sh  vN   g N7f)j
Groupby iterator

Returns
-------
Generator yielding sequence of (name, subsetted object)
for each group
TstrictN)_get_splitterresult_indexzip)rO   datasplitterkeyss       r4   get_iteratorBaseGrouper.get_iteratorg  s2      %%d+  td333s   +535c                    [        U[        5      (       a  [        nO[        nU" UU R                  U R
                  U R                  S9$ )z6
Returns
-------
Generator yielding subsetted objects
)
sorted_idssort_idx)r-   r!   SeriesSplitterFrameSplitterr   _sorted_idsresult_ilocs)rO   r  klasss      r4   r  BaseGrouper._get_splitteru  sF     dF##(6E "ELL''&&	
 	
r6   c                   [        U R                  5      S:X  a9  [        U R                  [        5      (       a  U R                  S   R
                  nO:U R                   Vs/ s H  o"R                  PM     nn[        X0R                  5      nU R                  (       d  [        U R                  [        5      nU(       db  U R                  R                  (       aG  UR                  5        VVs0 s H(  u  pV[        U5      (       a  [        R                  OUU_M*     nnnU$ U(       a5  UR                  5        VVs0 s H  u  pV[!        S U 5       5      U_M     nnnU$ s  snf s  snnf s  snnf )z"dict {group name -> group indices}r9   r   c              3  f   #    U  H'  n[        U5      (       a  [        R                  OUv   M)     g 7frJ   )r   r.   r   ).0comps     r4   	<genexpr>&BaseGrouper.indices.<locals>.<genexpr>  s!     ISTDJJ"&&D8Ss   /1)r<   r   r-   r  r   r  codesr&   levelsr   r   hasnansitemsr   r.   r   tuple)rO   r   ping
codes_listhas_mikeyvalues          r4   r  BaseGrouper.indices  s$    t~~!#
43D3DFV(W(W^^A&..F15@**J@%j++>F{{ 1 1:>Fd//77JP,,.JXJCd3iiBFFS%7.    
 '-lln '5
 ISII5P&4   ! A

s   !E-/E$;E*c                2   U R                   n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.
r   r   )r   rN   r.   wherert   r%   r   take)rO   r   r   	null_gapsr   s        r4   r  BaseGrouper.result_ilocs  sw     hh88C1H%D		#),T2I)C'\\: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                    [        U R                  5      S:  a  [        U R                  R                  5      $ U R                  /$ Nr9   )r<   r   listr  r&  r   s    r4   r&  BaseGrouper.levels  s9    t~~"))0011%%&&r6   c                X    U R                    Vs/ s H  oR                  PM     sn$ s  snf rJ   )r   rW   r6  s     r4   namesBaseGrouper.names  s     &*nn5nd		n555r8  c                    U R                   nU R                  nU(       a  [        R                  " XS:g     US9nO/ n[	        X0R
                  SSS9$ )z
Compute group sizes.
r   )	minlengthr   F)indexr3   r   )r   r   r.   bincountr!   r  )rO   r   r   r   s       r4   rF   BaseGrouper.size  sI    
 hh,,++c)n@CCc!2!2'NNr6   c                   [        U R                  5      S:X  a  U R                  S   R                  $ U R                  u  pUR                  n[
        R                  " U[        [        U5      5      S9nUR                  5       R                  5        VVs0 s H#  u  pVX5   U R                  R                  U5      _M%     nnnU$ s  snnf )!dict {group name -> group labels}r9   r   )
categories)r<   r   groupsresult_index_and_idsr8   r   
from_codesrange_reverse_indexerr(  r   r2  )rO   r  r   r   rG  group
axis_ilocsr   s           r4   rH  BaseGrouper.groups  s     t~~!#>>!$+++ 55%% ++CE#lBS<TU
 &0%@%@%B%H%H%J
 &K! M499>>*55%J 	 

 
s   *Cc                >    [        U R                  SS9R                  $ )NFr   )r   r   is_monotonic_increasingr   s    r4   is_monotonicBaseGrouper.is_monotonic  s     TXXE*BBBr6   c                N    [        U R                  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      TXX\&&())r6   c                    U R                   $ rJ   r   r   s    r4   
codes_infoBaseGrouper.codes_info  s     xxr6   c                ,    [        U R                  5      $ rJ   )r<   r  r   s    r4   r   BaseGrouper.ngroups  s     4$$%%r6   c                     U R                   S   $ )Nr   rI  r   s    r4   r  BaseGrouper.result_index       ((++r6   c                     U R                   S   $ r:  r]  r   s    r4   r   BaseGrouper.ids  r_  r6   c           
     Z   U R                    Vs/ s H"  n[        R                  " UR                  SS9PM$     nnU R                    Vs/ s H&  oR                  =(       d    UR
                  (       + PM(     nnU R                    Vs/ s H  oR                  PM     nn[        [        U R                   USS95       H8  u  nu  pUR
                  (       d  M  UR                  UR                  5      X%'   M:     [        U R                   5      S:X  a4  US   nU R                  S   Ul        [        U R                  S   5      nXx4$ [!        U5      (       a,  U R#                  X R                  U R                  U5      u  pxXx4$ [%        U5      (       d+  U R'                  X R                  U R                  5      u  pxXx4$ U R                  n	U R                    Vs/ s H  oR                  PM     n
n[        U5       VVs/ s H  u  pU(       d  M  UPM     nnn[        U5       VVs/ s H  u  pU(       a  M  UPM     nnnU R#                  U Vs/ s H  oU   PM	     snU Vs/ s H  oU   PM	     snU Vs/ s H  oU   PM	     snU Vs/ s H  oU   PM	     snS9u  nnU R'                  U Vs/ s H  oU   PM	     snU Vs/ s H  oU   PM	     snU Vs/ s H  oU   PM	     snS9u  nn[(        R*                  " [(        R,                  " UR                  [        U5      5      [(        R.                  " UR                  [        U5      SS	9/SS	9n[(        R0                  " X-   SS
9u  nn[3        [5        UR6                  5      [5        UR6                  5      -   U[5        UR                  5      [5        UR                  5      -   S9R9                  U5      n[        U5      U-  U-   n[%        U5      (       a  [        U5      n[        [;        U5      S5       VVs/ s H  u  nnU(       a  M  UU-
  PM     nnn[        U5      S:  a   UR=                  U5      R?                  5       nOUR?                  5       nURA                  U5      n[(        R0                  " USS
9u  nn[        U5      nURA                  U5      nOs[C        USS9u  nn[        U5      n[(        R*                  " U[(        RD                  " [(        RF                  " [        U5      5      U5      /5      nURA                  U5      nU RH                  (       a!  [(        RJ                  " US:  US:  -  SU5      nXx4$ s  snf s  snf s  snf s  snf s  snnf s  snnf s  snf s  snf s  snf s  snf s  snf s  snf s  snf s  snnf )NFr   Tr  r9   r   )r&  r%  r>  sorts)r&  r%  r>  r   return_indexr   r   )&r   r   _with_inferuniques	_observed_passed_categoricalr   	enumerater  set_categories
_orig_catsr<   r>  rW   r   r%  rC   _ob_index_and_idsrB   _unob_index_and_idsr.   concatenatetilerepeatuniquer   r;  r&  reorder_levelsreversed_drop_level_numbersargsortr2  r"   deletearanger   r1  )rO   r*  r&  obsrc  klevelr  r   r>  r%  idxob
ob_indicesunob_indicesob_indexob_ids
unob_indexunob_idsresult_index_codes_rB  n_levelsr   drop_levelssorterri  takers                               r4   rI   BaseGrouper.result_index_and_ids  s    EINN
DRDEdll7N 	 
 HL~~
GUtNN:$":":::~ 	 
 )-77 )#dnnfT*R SA}'''!00A	 !T t~~!#!!9L $

1L%djjm4CP   O XX $ 6 6

DJJ!LL   G S $ 8 8TZZ XLD    JJE,0NN;NDZZNE;-6s^B^'#r#^JB/8~H~GCRC~LH#55/9:zsz:-78ZcSzZ8-78ZcSzZ8-78ZcSzZ8	  6  Hf $(#;#;/;<|s|<-9:\cSz\:-9:\cSz\: $< $ J "$GGJ,,c(m<IIhnnc*oAF " yy!:NHAu%J--.hoo1FF(:++,tHNN/CC nU#	  j/F*X5C5zzu: &/x%B%B	T #HsN%B  
 {#a')==kJRRTF)113F+00899V$?5)#.jjo  4CeDW)#.bii		#l2C(DgNO  ,007{{hh
x!|<b#F  o

 8& <BH:888 =::0se   )U$-U)U.U39U8
U8!U>2U>
VV	
2VV+V?V
V"V'+	V'c                `    [        S U R                   5       5      (       a  U $ U R                  $ )Nc              3  8   #    U  H  oR                   v   M     g 7frJ   )rj  )r!  r*  s     r4   r#  /BaseGrouper.observed_grouper.<locals>.<genexpr>e  s     9.$~~.   )rC   r   _observed_grouperr   s    r4   observed_grouperBaseGrouper.observed_grouperc  s(    9$..999K%%%r6   c                    U R                    Vs/ s H  oR                  PM     nn[        U R                  X R                  U R
                  S9nU$ s  snf )N)r   r   )r   observed_groupingr   r   r   r   )rO   r*  r   r   s       r4   r  BaseGrouper._observed_grouperj  sC    8<G++	GdiiDKKX Hs   Ac                  ^ [        U4S jTSS   5       5      nU(       a  TS   OSn[        S U 5       5      n[        X'SSS9n[        XS9u  p[	        U	5      n	[        XXrSS	9n[        UUUSS
9nU(       d  [        U5      S:  a  [        T5      n[        [        T5      S5       VVs/ s H  u  pU(       a  M  X-
  PM     nnn[        U5      S:  a   UR                  U5      R                  5       nOUR                  5       nUR                  U5      n[        R                  " USS9u  nn[        R                  " U	S:H  SUR                  U	5      5      n	[	        U	5      n	X4$ s  snnf )Nc              3  4   >#    U  H  nTS    U:H  v   M     g7f)r   Nr   )r!  r   rc  s     r4   r#  0BaseGrouper._ob_index_and_ids.<locals>.<genexpr>w  s      HidqT!1is   r9   r   Fc              3  8   #    U  H  n[        U5      v   M     g 7frJ   r<   r!  r}  s     r4   r#  r  y       5fUc%jjfr  Tr   xnullrg  )r  )r&  r%  r>  verify_integrityre  r   )rC   r)  r$   r"   r   r#   r   r<   rl  rv  rw  rx  r2  r.   rt  r1  )rO   r&  r%  r>  rc  consistent_sortingsort_in_compressr   group_indexr  obs_group_idsob_index_codesr  r  r~  r   r  r  r  rB  s       `               r4   ro  BaseGrouper._ob_index_and_idsp  sf    ! HeABi HH'958u5f55%eTJ 4[ X$V,-5t
  "	
 "c(ma&75zH "+8E?A!>!>IC !>  
 ;!#!55kBJJL!))+}}V,Hyyd;HAuXXflB

60BCF$V,s   +E'<E'c                    [        S U 5       5      n[        X$SSS9n[        R                  " XS9n[	        U5      nXe4$ )Nc              3  8   #    U  H  n[        U5      v   M     g 7frJ   r  r  s     r4   r#  2BaseGrouper._unob_index_and_ids.<locals>.<genexpr>  r  r  Tr  )r>  )r)  r$   r   from_productr   )rO   r&  r%  r>  r   r  r  s          r4   rp  BaseGrouper._unob_index_and_ids  sE     5f55"5d$G,,VA
&x0##r6   c              #     #    U R                   n[        U R                  5      S:X  a  Uv   g [        UR                  S-
  SS5       H  nUR                  U5      v   M     g 7f)Nr9   r   )r  r<   r   rK  nlevelsget_level_values)rO   r  r}  s      r4   get_group_levelsBaseGrouper.get_group_levels  sY      ((t~~!#|33a7R@"33E:: As   A A"c           	         US;   d   e[        XU R                  S9nUR                  " SUUUU R                  U R                  S.UD6$ )z+
Returns the values of a cython operation.
)rx   rw   rK   )r   r   r   r   r   r   )r@   rN   r   r   r   )rO   rL   r   rM   r   r   r   cy_ops           r4   _cython_operationBaseGrouper._cython_operation  s^     1111T4CVCVW%% 
XXLL
 
 	
r6   c                Z    U R                  X5      nUR                  R                  U5      $ )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
)_aggregate_series_pure_pythonarray_cast_pointwise_result)rO   r2   r   preserve_dtyper   s        r4   
agg_seriesBaseGrouper.agg_series  s)      33C>yy//77r6   c                    [         R                  " U R                  SS9nSnU R                  U5      n[	        U5       H:  u  pgU" U5      n[        U5      nU(       d  [        XR                  5        SnXU'   M<     U$ )NOr   FT)r.   r   r   r  rl  r>   r5   r3   )	rO   r2   r   r   initializedr  r   rM  r=   s	            r4   r  )BaseGrouper._aggregate_series_pure_python  ss     $,,c2%%c*!(+HAu+C %C"34"1I , r6   c                   SnU R                  U5      nU R                  n/ n[        XTSS9nU HZ  u  p[        R	                  U	SU5        U	R
                  n
U" U	5      nU(       d  [        X5      (       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        Xc4$ )NFTr  rW   r   r   )rd   rf   rS   rU   )r  r  r  r0   __setattr__axes_is_indexed_likeappendr<   r   iloc)rO   r   r  mutatedr  
group_keysresult_valueszippedr-  rM  
group_axesr=   s               r4   apply_groupwiseBaseGrouper.apply_groupwise  s     %%d+&&
 Z$7 JC ufc2 JE(C#3C#D#D  % ! z?aGAz4$@ E
 %
 diim%%r6   c                    U R                   R                  U R                  5      n[        U SS5      (       a  XS:     nU$ )Nr   Tr   )r   r2  r  r   )rO   r   s     r4   r  BaseGrouper._sorted_ids   s<     t00144((aK(Fr6   )r   r   r   r   N)TT)
r   r   r   list[grouper.Grouping]r   r   r   r   r   r   r   r  )r   zIterator[Hashable]r   r   )r  r   r   z#Iterator[tuple[Hashable, NDFrameT]])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   list[Index]r   list[Hashable])r   r!   )r   zdict[Hashable, Index]r   r   )r   r   )r   z"tuple[Index, npt.NDArray[np.intp]])r   r   )
r&  r  r%  list[npt.NDArray[np.intp]]r>  r  rc  z
list[bool]r   'tuple[MultiIndex, npt.NDArray[np.intp]])r&  r  r%  r  r>  r  r   r  )r   zGenerator[Index])r   )
rL   r   rM   r   r   r   r   r   r   r
   )F)r2   r!   r   r'   r  r   r   r
   )r2   r!   r   r'   r   znpt.NDArray[np.object_])r   r'   r  zDataFrame | Seriesr   ztuple[list, bool])(r   r   r   r   r   r   rP   propertyr   r  r  r  r   r  r   r  r  r%  r&  r>  rF   rH  rR  rN   rX  r   r  r   rI  r  r  ro  rp  r  r  r  r  r  r  r   r   r6   r4   r   r   <  sb    K  * 	
  
  " # #4 
 
&  0   . 7 7 ' ' 6 6 O O   C  C *  *   &  & , , , , X! X!t & &  
& &  *&  	& 
 &  
1& P
$
$ *
$ 	
$
 
1
$ ; ;  

 	

 
 
 

 
2 BG88!)8;?8	8 8$ !)	  * %&%&!3%&	%& %&T   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 jr\S 5       r\SS j5       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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__L  sB     !&	%i0 4>>"c$))n444r6   c                    [        U R                  U R                  SS9 VVs0 s H  u  pU[        Ld  M  X_M     nnnU$ s  snnf )rF  Tr  )r  r  r  r   )rO   r-  r.  r   s       r4   rH  BinGrouper.groupsZ  sN     "$..$))DI
I
#~ CJI 	 

 
s
   AAc                    gr:  r   r   s    r4   r  BinGrouper.nkeysf  s     r6   c                    U R                   nU R                  b%  [        R                  " XR                  45      nX   nU$ rJ   )r   r  r.   lexsort)rO   r   r  s      r4   rX  BinGrouper.codes_infok  s8     hh<<#ZZll 34F+C
r6   c              #     ^#    U4S jnSn[        U R                  U R                  SS9 H  u  pEU[        La  XR" X45      4v   UnM     U[	        T5      :  a  U R                  S   U" US5      4v   gg7f)r  c                    > TR                   X $ rJ   )r  )startedger  s     r4   <lambda>)BinGrouper.get_iterator.<locals>.<lambda>}  s    TYYu%:r6   r   Tr  r   N)r  r  r  r   r<   )rO   r  slicerr  r  labels    `    r4   r  BinGrouper.get_iteratort  s{      ; !tyy$..FKDCVE000E G
 3t9..$fUD&999 s   A2A5c                    [         R                  " [        5      nSn[        U R                  U R
                  SS9 H-  u  p4X$:  d  M  U[        La  [        [        X$5      5      X'   UnM/     U$ Nr   Tr  )collectionsdefaultdictr;  r  r  r  r   rK  )rO   r  r   r  bins        r4   r  BinGrouper.indices  s^    ))$/dnndiiEJEw#%)%-%8GN	 F
 r6   c                    U R                   /$ rJ   rW  r   s    r4   r%  BinGrouper.codes  s    zr6   c                D   U R                   n[        U R                   5      S:w  a"  [        U R                   S   5      (       a  USS  n[        U5      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      nX4$ )Nr   r9   r   )
r  r<   r   r.   diffr_r  r   rs  rz  )rO   r  r   repr   s        r4   rI  BinGrouper.result_index_and_ids  s    ~~t~~!#T^^A->(?(?'+Ll#ggbeeAtyyL)*!#&c$))n$))BIIg.4C))BEE"bii&8"893?C!#&  r6   c                    U R                   /$ rJ   )r  r   s    r4   r&  BinGrouper.levels  s    r6   c                0    U R                   R                  /$ rJ   )r  rW   r   s    r4   r>  BinGrouper.names  s    ##$$r6   c                    U R                   nU R                  nUR                  U5      n[        R                  " X3SS UR
                  S9nU/$ )NF)in_axisr}  ri  )r  r   r2  r   Groupingr8   )rO   levr%  r   r*  s        r4   r   BinGrouper.groupings  sG    nn%Es{{
 vr6   c                    U $ rJ   r   r   s    r4   r  BinGrouper.observed_grouper  s    r6   )r  r  r  rJ   r   r   r  r  )r  r+   )r   r  r  r  r  )r   r  )r   r   r   r   r   r   rP   r   rH  r  r  rX  r  r  r%  rI  r&  r>  r   r  r   r   r6   r4   r  r  *  s    <   	5
 
5 	 	    :( 	 	   ! !"     % %    r6   r  c                    [        U [        5      (       a.  [        U5      S:  a  gU R                  R	                  US   5      $ [        U [
        5      (       a  U R                  R	                  US   5      $ g)Nr9   Fr   )r-   r!   r<   rB  equalsr   )r2   r  s     r4   r  r    s_    #vt9q=yyQ((	C	#	#yyQ((r6   c                  Z    \ rS rSr          SS jrS	S jr\S
S j5       rSS jrSr	g)r  i  c               4    Xl         X l        X@l        X0l        g rJ   )r  r   _slabels	_sort_idx)rO   r  r   r  r  s        r4   rP   DataSplitter.__init__  s     	"!r6   c              #     #    U R                   S:X  a  g [        R                  " U R                  U R                   5      u  pU R                  n[        XSS9 H"  u  pEU R                  U[        XE5      5      v   M$     g 7fr  )r   r	   generate_slicesr  _sorted_datar  _chopslice)rO   startsendssdatar  ends         r4   r  DataSplitter.__iter__  sf     <<1 **4==$,,G!!f48JE**UE%$566 9s   A<A>c                J    U R                   R                  U R                  SS9$ )Nr   rd  )r  r2  r  r   s    r4   r  DataSplitter._sorted_data  s    yy~~dnn1~55r6   c                    [        U 5      erJ   r   )rO   r  	slice_objs      r4   r  DataSplitter._chop  s    !$''r6   )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   rP   r  r   r  r  r   r   r6   r4   r  r    sU    "" "
 '" )" 
"	7 6 6(r6   r  c                      \ rS rSrSS jrSrg)r  i  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  groupby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)r  i  c                    UR                   R                  USS9nUR                  X3R                  S9nUR	                  USS9$ )Nr9   rd  r%  r&  r'  )r)  r*  r+  r  r-  )rO   r  r!  r.  dfs        r4   r  FrameSplitter._chop  sG     jj""91"5((88(<uY77r6   r   N)r  r   r!  r  r   r   r1  r   r6   r4   r  r    s    8r6   r  r  r  )Kr   
__future__r   r  r   typingr   r   r   r   numpyr.   pandas._libsr   r	   pandas._libs.groupby_libsr&  r   pandas._typingr
   r   r   r   r   pandas.errorsr   pandas.util._decoratorsr   pandas.core.dtypes.castr   pandas.core.dtypes.commonr   r   r   r   r   pandas.core.dtypes.missingr   r   pandas.core.arraysr   pandas.core.framer   pandas.core.groupbyr   pandas.core.indexes.apir   r   r   r    pandas.core.seriesr!   pandas.core.sortingr"   r#   r$   r%   r&   collections.abcr'   r(   r)   r*   pandas.core.genericr+   r5   r>   r@   r   r  r  r  r  r  r   r6   r4   <module>rJ     s    #     * )  . 2 
 + ' '  &    ,>O
 O
dk k\T Tn(78$ (D9\ 98L 8r6   