
    OwgZ                       d Z ddlmZ ddlZddlZddlmZmZmZm	Z	 ddl
ZddlmZmZ ddlmc mZ ddlmZmZmZmZmZ ddlmZ ddlmZ dd	lmZmZ dd
l m!Z!m"Z"m#Z#m$Z$m%Z% ddl&m'Z'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: erddl;m<Z<m=Z=m>Z> ddl?m@Z@ d$dZAd ZB G d d      ZC G d d      ZD G d deD      ZEd%dZF G d dee         ZG G d deG      ZH G d  d!eG      ZIdd"	 	 	 	 	 	 	 	 	 	 	 	 	 d&d#ZJy)'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                b    t        | t        j                        r|t        k7  rt	        d      y y )NzMust produce aggregated value)
isinstancenpndarrayobject
ValueError)objdtypes     N/var/www/horilla/myenv/lib/python3.12/site-packages/pandas/core/groupby/ops.pycheck_result_arrayr5   P   s1     #rzz"F? <==  #    c                z    t        | d      r.| j                  } | j                  dk(  rt        |       dk(  r| d   } | S )zb
    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                      e Zd ZU dZ eg d      Zd:dZi d ej                  e	j                  d      d ej                  e	j                  d      ddd	d
d ej                  e	j                  d      d ej                  e	j                  d      ddddddddddd ej                  e	j                  d      d ej                  e	j                  d      ddddddd d!d"d#d$d%d&d'd(Zd)ed*<   d d+iZed;d,       Zeej$                  	 	 	 	 	 	 	 	 d<d-              Zd=d.Zd>d/Zd?d0Zd?d1Zed2d2d3	 	 	 	 	 	 	 	 	 	 	 	 	 d@d4       Ze	 	 	 	 	 	 	 	 	 	 	 	 	 	 d@d5       ZedAd6       Zed7d8	 	 	 	 	 	 	 	 	 	 	 dBd9       Zy2)CWrappedCythonOpaB  
    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                .    || _         || _        || _        y Nkindhowhas_dropped_na)selfrK   rL   rM   s       r4   __init__zWrappedCythonOp.__init__}   s    	,r6   rA   )val_testrB   sum	group_sumprod
group_prodrF   )namerG   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cummaxrC   )	aggregate	transformzdict[str, dict]_CYTHON_FUNCTIONS   c                (    || j                   d   v ryy)Nrs   rt   )ru   )clsrL   s     r4   get_kind_from_howz!WrappedCythonOp.get_kind_from_how   s    #''44r6   c                ^   |j                   }| j                  |   |   }t        |      r|}nt        t        |      }|r|S |t        j                  t              k(  rF|dv rt        d| d| d      |dv r|S |dk(  r	 |S d|j                  vrt        d| d| d      |S t        d|      )	N)r\   ro   z2function is not implemented for this dtype: [how->z,dtype->])r`   ra   rF   rG   rb   r0   zPThis should not be reached. Please report a bug at github.com/pandas-dev/pandas/)
rU   ru   callablegetattr
libgroupbyr.   r3   r0   NotImplementedError__signatures__)rx   rK   rL   r3   
is_numeric	dtype_strftypefs           r4   _get_cython_functionz$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                2   | j                   }|dv rt        |      }|S |j                  j                  dv ra|dv s| j                  dk(  r| j                  rt        |      }|S |dv r1|j                  j                  dk(  rt        |      }|S t        |      }|S )z
        Cast numeric dtypes to float64 for functions that only support that.

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

        Returns
        -------
        values : np.ndarray
        )r\   r`   ra   rb   iu)r^   rZ   rt   )rQ   rh   rS   rp   ro   i)rL   r   r3   rK   rM   r   r   )rN   valuesrL   s      r4   _get_cython_valsz WrappedCythonOp._get_cython_vals   s     hh22 $F+F"  \\$&o%		[(T-@-@ (/  DD<<$$+)&1F  +62Fr6   c                    | j                   }| j                  }| j                  j                  |d      }|dk(  r||f}|S |dkD  rt	        d      |dk(  r|j
                  }|S |f|j
                  dd  z   }|S )Nr9   rh   z<arity of more than 1 is not supported for the 'how' argumentrt   )rL   rK   _cython_aritygetr   shape)rN   ngroupsr   rL   rK   arity	out_shapes          r4   _get_output_shapez!WrappedCythonOp._get_output_shape   s    hhyy""&&sA. &= %(I  QY%N  [ I  !
V\\!"%55Ir6   c                    | j                   }|dk(  rd}n2|dv rd}n+|j                  dv r|j                   |j                   }nd}t        j                  |      S )NrC   float64rF   rG   intpiufcbr0   )rL   rK   itemsizer.   r3   )rN   r3   rL   	out_dtypes       r4   _get_out_dtypezWrappedCythonOp._get_out_dtype  s^    hh&=!I(( IzzW$$zzl5>>*:;	$	xx	""r6   c                2   | j                   }|dv rA|t        j                  t              k(  r#t        j                  t        j                        S |S |dv rA|j
                  dv r|S |j
                  dv r#t        j                  t        j                        S |S )a  
        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.
        )rQ   rp   rQ   rS   ro   )rZ   r\   r^   r`   ra   fciub)rL   r.   r3   boolint64rK   r   )rN   r3   rL   s      r4   _get_result_dtypez!WrappedCythonOp._get_result_dtype  s     hh==&xx))  ;;zzT!u$xx

++r6   N)maskresult_maskc          	        |j                   dk(  r[|d d d f   }|	|d d d f   }|	|d d d f   } | j                  |f|||||d|}	|	j                  d   dk(  r|	d   S |	j                  S  | j                  |f|||||d|S )Nr9   )	min_countr   comp_idsr   r   r   )r;   _call_cython_opr   T)
rN   r   r   r   r   r   r   kwargsvalues2dr=   s
             r4   _cython_op_ndim_compatz&WrappedCythonOp._cython_op_ndim_compat6  s     ;;!dAgHD!G}&)$'2&$&&#!' C yy|q 1v 55L#t##
#
 
 	
r6   c                  |}|j                   }	|	j                  dv }
|	j                  dv }|r|j                  d      }d}
n |	j                  dk(  r|j                  d      }|j                   dk(  r|j                  t        j
                        }| j                  dv rv|t        |      }|	t        k(  r*|d	   r%|j                         r|j                         }d||<   |j                  t        d
      j                  t        j                        }d}
|j                  }||j                  }||j                  }| j                  ||      }| j                  | j                  | j                  |j                   |
      }| j!                  |      }| j#                  |j                         }t%        t	        j&                  ||            }| j                  dk(  rt	        j(                  |t        j*                        }| j                  dv r |d!||||||||d| n| j                  dv r$| j                  dv r||d<    |||||f|||d| n| j                  dv r& |d!|||||d| |j                  t        d
      }nw| j                  dv r. |d!||||||d| |	t        k(  rQ|j                  t              }n;t-        | j                   d      | j                  dk7  r||d<    |d!||||||d| | j                  dk(  r| j                  dvr|j                   j                  dv rn|slt/        | j                  dv rdnd|      }|k  }|j                         r;|||   j1                         s&J |j                  d       }t        j2                  ||<   |j                  }| j                  | j4                  vr)| j7                  |j                         }t9        ||      }|S |}|S )"Nr   mMr   Tbuint8float16)rA   rB   skipnaF)copyr3   rs   )rF   rG   rV   rX   rZ   rf   rd   rQ   )outcountsr   labelsr   r   r   is_datetimelike)ra   r`   r^   rh   rS   r\   )r`   ra   r   )r   r   r   )r   r   r   r   r   )rb   )r   r   r   r   r   r   z is not implementedrC   r   )r   r   r   r   r   r   r   r   )rQ   rS   r   r9   r    )r3   rK   viewastyper.   float32rL   r   r0   rA   r   r   int8r   r   r   r   r   r   emptyzerosr   r   rX   rB   nancast_blocklistr   r   )rN   r   r   r   r   r   r   r   orig_valuesr3   r   r   r   funcr   resultr   cutoffempty_groups	res_dtype	op_results                        r4   r   zWrappedCythonOp._call_cython_opb  s    ZZ7*
**,[[)FJZZ3[[)F<<9$]]2::.F88~%|F|(#xxz!''+t]]4e]499"''BFJ66D&)mm**7F;	((DHHfllJW&&v.''5	BHHYi@A99#XXgRXX6Fxx 	 	  
!!#' +$3
 
 LL88~-0?F,-		
 ( +	 	 ^+ !# +   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                    |j                   dkD  rt        d      |j                   dk(  r|dk(  sJ |       y t        |j                        s|dk(  sJ y y )N   z.number of dimensions is currently limited to 2r9   r   )r;   r   r   r3   )rN   axisr   s      r4   _validate_axiszWrappedCythonOp._validate_axis   sU    ;;?%&VWW;;!19"d"9$V\\2 199 3r6   )r   c          	         | j                  ||       t        |t        j                        s, |j                  d| j
                  | j                  |||d|S  | j                  |f|||dd|S )zW
        Call our cython function, with appropriate pre- and post- processing.
        )rL   rM   r   r   idsN)r   r   r   r   r   )r   r-   r.   r/   _groupby_oprL   rM   r   )rN   r   r   r   r   r   r   s          r4   cython_operationz WrappedCythonOp.cython_operation  s     	D&)&"**-%6%% HH#22#   +t**

 
 	
r6   )rK   strrL   r   rM   r   returnNone)rL   r   r   r   )rK   r   rL   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____doc__	frozensetr   rO   	functoolspartialr~   group_any_allgroup_idxmin_idxmaxr_   ru   __annotations__r   classmethodry   cacher   r   r   r   r   r   r   r   r   r   r   r6   r4   r@   r@   i   s1    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                     e Zd ZU dZded<   	 	 d#	 	 	 	 	 	 	 	 	 d$dZed%d       Zed&d       Zd'dZ	ed(d       Z
	 d)	 	 	 	 	 d*d	Zed)d+d
       Zeed               Zed,d       Zed-d       Zeed.d              Zed/d       Zed0d       Zed1d       Zed2d       Zeed3d              Zeed3d              Zed4d       Zed-d       Ze	 	 d5d       Zeed(d              Zed6d       Zed7d       Zed8d       Ze	 d9	 	 	 	 	 	 	 	 	 d:d       Z e	 d;	 	 	 	 	 	 	 d<d       Z!e	 	 	 	 	 	 d=d       Z"e	 d)	 	 	 	 	 	 	 d>d       Z#eed-d               Z$eed-d!              Z%y")?BaseGroupera  
    This is an internal Grouper class, which actually holds
    the generated groups

    Parameters
    ----------
    axis : Index
    groupings : Sequence[Grouping]
        all the grouping instances to handle in this grouper
        for example for grouper list to groupby, need to pass the list
    sort : bool, default True
        whether this grouper will give sorted result or not

    r   r   c                |    t        |t              sJ |       || _        t        |      | _        || _        || _        y rI   )r-   r   r   list
_groupings_sortdropna)rN   r   	groupingssortr   s        r4   rO   zBaseGrouper.__init__B  s9     $&,,&	26y/
r6   c                    | j                   S rI   )r   rN   s    r4   r   zBaseGrouper.groupingsP  s    r6   c                :    t        d | j                  D              S )Nc              3  4   K   | ]  }|j                     y wrI   )r   ).0pings     r4   	<genexpr>z$BaseGrouper.shape.<locals>.<genexpr>V  s     =dT\\=s   )tupler   r   s    r4   r   zBaseGrouper.shapeT  s    =dnn===r6   c                ,    t        | j                        S rI   )iterindicesr   s    r4   __iter__zBaseGrouper.__iter__X  s    DLL!!r6   c                ,    t        | j                        S rI   )r<   r   r   s    r4   nkeyszBaseGrouper.nkeys[  s    4>>""r6   c              #  v   K   | j                  ||      }| j                  }t        ||      E d{    y7 w)
        Groupby iterator

        Returns
        -------
        Generator yielding sequence of (name, subsetted object)
        for each group
        r   N)_get_splittergroup_keys_seqzip)rN   datar   splitterkeyss        r4   get_iteratorzBaseGrouper.get_iterator_  s8      %%d%6""tX&&&s   /979c                l    | j                   \  }}}t        |||| j                  | j                  |      S )zV
        Returns
        -------
        Generator yielding subsetted objects
        )
sorted_idssort_idxr   )
group_infor   _sorted_ids	_sort_idx)rN   r   r   r   _r   s         r4   r   zBaseGrouper._get_splittern  s<     //Q''^^
 	
r6   c                    t        | j                        dk(  r| j                  d   S | j                  \  }}}t	        ||| j                  | j
                        S Nr9   r   )r<   r   levelsr  r$   codesrN   r   r
  r   s       r4   r   zBaseGrouper.group_keys_seq  sM     t~~!#;;q>!"ooOCG &c7DKKLLr6   c                P   t        | j                        dk(  r3t        | j                  t              r| j                  d   j
                  S | j                  D cg c]  }|j                   }}| j                  D cg c]  }|j                   }}t        ||      S c c}w c c}w )z"dict {group name -> group indices}r9   r   )	r<   r   r-   result_indexr   r   r  _group_indexr'   )rN   r   
codes_listr  s       r4   r   zBaseGrouper.indices  s     t~~!#
43D3DFV(W>>!$,,,-1^^<Tdjj<
<.2nn=d!!==
D11 ==s   B=B#c                   t        | j                  | j                  | j                  d      }t	        || j                        \  }}| j
                  r8t        j                  |dk\        }t        j                  |dk(        |   }||   }t        || j                        }| j
                  r|t        j                  |      z  }|S )zR
        Get the original integer locations of result_index in the input.
        Tr   xnullr   r   r   )r%   r  r   r   r"   rM   r.   whererp   r&   r   take)rN   group_indexr
  r   	null_gapsr   s         r4   result_ilocszBaseGrouper.result_ilocs  s     &JJ

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

KQ88K1,-D		+"34T:I%d+K'T\\Bbggi00Fr6   c                T    | j                   D cg c]  }|j                   c}S c c}w rI   )r   r  rN   r   s     r4   r  zBaseGrouper.codes  s      (,~~6t

666   %c                T    | j                   D cg c]  }|j                   c}S c c}w rI   )r   r  r  s     r4   r  zBaseGrouper.levels  s     .2nn=d!!===r  c                T    | j                   D cg c]  }|j                   c}S c c}w rI   )r   rU   r  s     r4   nameszBaseGrouper.names  s    &*nn5d		555r  c                    | j                   \  }}}|rt        j                  ||dk7     |      }ng }t        || j                  dd      S )z&
        Compute group sizes.
        r   )	minlengthr   F)indexr3   r   )r  r.   bincountr!   r  )rN   r   r
  r   r   s        r4   rE   zBaseGrouper.size  sJ    
 //Q++c#)n@CCc!2!2'NNr6   c                   t        | j                        dk(  r| j                  d   j                  S g }| j                  D ]X  }|j                  }t	        |t
              s|j                  |       1|j                  |j                  d   j                         Z t        j                  |      }| j                  j                  |      S )!dict {group name -> group labels}r9   r   )r<   r   groupsgrouping_vectorr-   r   appendr   from_arraysr   groupby)rN   
to_groupbyr   gvr%  s        r4   r)  zBaseGrouper.groups  s     t~~!#>>!$+++J G))!"k2%%b)%%bll1o&E&EFG **:6E99$$U++r6   c                F    t        | j                  d         j                  S Nr   )r   r  is_monotonic_increasingr   s    r4   is_monotoniczBaseGrouper.is_monotonic  s     T__Q'(@@@r6   c                T    t        | j                  d   dk  j                               S )zE
        Whether grouper has null value(s) that are dropped.
        r   )r   r  rA   r   s    r4   rM   zBaseGrouper.has_dropped_na  s&     T__Q'!+00233r6   c                ^    | j                         \  }}t        |      }t        |      }|||fS rI   )_get_compressed_codesr<   r   )rN   r   obs_group_idsr   s       r4   r  zBaseGrouper.group_info  s6    "&"<"<">-m$&x0//r6   c                &    | j                   \  }}}|S rI   )r  rN   r   r
  s      r4   
codes_infozBaseGrouper.codes_info  s     OO	Q
r6   c                L   t        | j                        dkD  r:t        | j                  | j                  dd      }t        || j                        S | j                  d   }|j                  t        j                  t        |j                        t        j                        fS )Nr9   Tr  r  r   r   )r<   r   r%   r  r   r"   r   r.   aranger  r   )rN   r  r   s      r4   r6  z!BaseGrouper._get_compressed_codes  sx    
 t~~")$**djjtSWXK'$**EE ~~a zz299S):):%;277KKKr6   c                ,    t        | j                        S rI   )r<   r  r   s    r4   r   zBaseGrouper.ngroups  s     4$$%%r6   c                n    | j                   }| j                  \  }}}t        ||| j                  |d      S )NT)r  )r  r  r#   r   )rN   r  r   obs_idsr
  s        r4   reconstructed_codeszBaseGrouper.reconstructed_codes  s1    

//Wa#C$**e4PPr6   c                6   t        | j                        dk(  r5| j                  d   j                  j                  | j                  d         S | j
                  }| j                  D cg c]  }|j                   }}t        ||d| j                        S c c}w )Nr9   r   F)r  r  verify_integrityr"  )r<   r   _result_indexrenamer"  r@  r   )rN   r  r   r  s       r4   r  zBaseGrouper.result_index  s    t~~!#>>!$2299$**Q-HH((15@$$$@@djj
 	
 As   (Bc                ,   t        | j                        dk(  r| j                  d   j                  gS g }t        | j                  | j                        D ]<  \  }}t        |      }|j                  j                  |      }|j                  |       > |S r  )r<   r   _group_arrayliker   r@  r   r  r+  )rN   	name_listr   r  r  s        r4   get_group_levelszBaseGrouper.get_group_levels  s     t~~!#NN1%6677	t~~t/G/GH 	%KD%'.E**//6FV$		% r6   c           	         |dv sJ t        ||| j                        }| j                  \  }}	}	| j                  }
 |j                  d|||||
d|S )z;
        Returns the values of a cython operation.
        )rt   rs   rJ   )r   r   r   r   r   r   )r@   rM   r  r   r   )rN   rK   r   rL   r   r   r   cy_opr   r
  r   s              r4   _cython_operationzBaseGrouper._cython_operation,  sr     1111Ts4CVCVWOO	Q,,%u%% 

 
 	
r6   c                    t        |j                  t        j                        sd}| j	                  ||      }t        j                  |d      }|rt        ||j                  d      }|S |}|S )a1  
        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   )rN   r2   r   preserve_dtyper   npvaluesr   s          r4   
agg_serieszBaseGrouper.agg_seriesH  sj    " #++rzz2
 "N33C>,,VuE-h		PTUC 
 C
r6   c                   | j                   \  }}}t        j                  |d      }d}| j                  |d      }t	        |      D ]7  \  }}	 ||	      }
t        |
      }
|st        |
|	j                         d}|
||<   9 |S )NOr   Fr   r   T)r  r.   r   r   	enumerater>   r5   r3   )rN   r2   r   r
  r   r   initializedr  r   groupr=   s              r4   rO  z)BaseGrouper._aggregate_series_pure_pythoni  s     1g'-%%c%2!(+ 		HAuu+C %C"34"F1I		 r6   c                z   d}| j                  ||      }| j                  }g }t        ||      }|D ]R  \  }	}
t        j	                  |
d|	       |
j
                  } ||
      }|st        |||      sd}|j                  |       T t        |      dk(  r$t        |dd       dv r ||j                  d d        ||fS )NFr   rU   Tr   r   )rb   rQ   rS   )r   r   r   r0   __setattr__axes_is_indexed_liker+  r<   r}   iloc)rN   r   r   r   mutatedr  
group_keysresult_valueszippedkeyrX  
group_axesr=   s                r4   apply_groupwisezBaseGrouper.apply_groupwise  s     %%d%6((
 Z*  	&JC ufc2 JE(C#3CT#J  %	& z?aGAz4$@ E
 %
 diimg%%r6   c                :    | j                   \  }}}t        ||      S rI   )r  r&   r  s       r4   r	  zBaseGrouper._sort_idx  s      //Q%c733r6   c                X    | j                   \  }}}|j                  | j                        S rI   )r  r  r	  r9  s      r4   r  zBaseGrouper._sorted_ids  s&     OO	Qxx''r6   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   )
rK   r   rL   r   r   r   r   r   r   r
   )F)r2   r!   r   r   rQ  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   rO   propertyr   r   r   r   r  r   r   r   r   r   r  r  r  r"  rE   r)  r3  rM   r  r:  r6  r   r@  r  rH  rK  rS  rO  rd  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                      e Zd ZU dZded<   ded<   	 d	 ddZed        Zedd	       Z	edd
       Z
dddZed        Zedd       Zedd       Zedd       Zedd       Zedd       Zedd       Zy)
BinGroupera  
    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                    t        |      | _        t        |      | _        || _        t        | j                        t        | j                        k(  sJ y rI   )r   rt  r    ru  indexerr<   )rN   rt  ru  rw  s       r4   rO   zBinGrouper.__init__  sD     !&	%i0 4>>"c$))n444r6   c                    t        | j                  | j                        D ci c]  \  }}|t        ur|| }}}|S c c}}w )r(  )r   ru  rt  r   )rN   rb  valuer   s       r4   r)  zBinGrouper.groups  sK     "$..$))<
U#~ J
 

 
s   >c                     y)Nr9   r   r   s    r4   r   zBinGrouper.nkeys  s     r6   c                    | j                   \  }}}| j                  &t        j                  || j                  f      }||   }|S rI   )r  rw  r.   lexsort)rN   r   r
  sorters       r4   r:  zBinGrouper.codes_info  sB     OO	Q<<#ZZdll 34Ff+C
r6   c              #     K   |dk(  rfd}nfd}t        j                  |         }d}t        | j                  | j                        D ]  \  }}|t
        ur| |||      f |} ||k  r| j                  d    ||d      f yyw)r   r   c                "    j                   | | S rI   r]  startedger   s     r4   <lambda>z)BinGrouper.get_iterator.<locals>.<lambda>  s    5)> r6   c                .    j                   d d | |f   S rI   r  r  s     r4   r  z)BinGrouper.get_iterator.<locals>.<lambda>  s    1eDj=)A r6   r   N)r<   r[  r   rt  ru  r   )rN   r   r   slicerlengthr  r  labels    `      r4   r  zBinGrouper.get_iterator  s      19>FAFTYYt_%tyy$..9 	KD%CVE4000E	
 6>..$fUD&999 s   BBc                    t        j                  t              }d}t        | j                  | j
                        D ]-  \  }}||k  s|t        urt        t        ||            ||<   |}/ |S r1  )collectionsdefaultdictr   r   ru  rt  r   range)rN   r   r   r  bins        r4   r   zBinGrouper.indices  sh    ))$/dnndii8 	JE33w#%)%3-%8GEN		
 r6   c                   | j                   }t        j                  |t        j                        }t        j                  t        j
                  d| j                  f         }t        |      }|t        | j                        k(  r*t        j                  t        j                  |      |      }n<t        j                  t        j
                  dt        j                  |      f   |      }t        |      ||fS )Nr   r   r   )
r   r.   r<  r   diffr_rt  r   r<   repeat)rN   r   r7  repr   s        r4   r  zBinGrouper.group_info(  s    ,,		'9ggbeeAtyyL)*!#&c$))n$yy7!3S9Hyyr299W+='=!>DH  )
 	
r6   c                    t         j                  dt        j                  | j                  dd  | j                  d d k7        dz   f   gS )Nr   r9   r   )r.   r  flatnonzerort  r   s    r4   r@  zBinGrouper.reconstructed_codes:  sB     a		!"3B(GH1LLMNNr6   c                    t        | j                        dk7  r't        | j                  d         r| j                  dd  S | j                  S )Nr   r9   )r<   ru  r   r   s    r4   r  zBinGrouper.result_index?  s>    t~~!#T^^A->(?>>!"%%~~r6   c                    | j                   gS rI   )ru  r   s    r4   r  zBinGrouper.levelsF  s    r6   c                0    | j                   j                  gS rI   )ru  rU   r   s    r4   r"  zBinGrouper.namesJ  s    ##$$r6   c                    | j                   }| j                  d   }|j                  |      }t        j                  ||dd |j
                        }|gS )Nr   F)in_axisleveluniques)ru  r  r  r   Groupingr8   )rN   levr  r   r   s        r4   r   zBinGrouper.groupingsN  sN    nn"%FEs{{
 vr6   rI   r   r   rh  rk  ri  )r   r+   r   r   ro  )r   zlist[np.ndarray]rp  rm  rn  rg  )r   r   r   r   r   rO   r   r)  rq  r   r:  r  r   r  r@  r  r  r"  r   r   r6   r4   rs  rs    s    <   	5
 
5 	 	    :2 	 	 
 
" O O       % %  r6   rs  c                    t        | t              r0t        |      dkD  ry| j                  |   j	                  ||         S t        | t
              r!| j                  |   j	                  ||         S y)Nr9   F)r-   r!   r<   r[  equalsr   )r2   r[  r   s      r4   r\  r\  Y  sa    #vt9q=xx~$$T$Z00	C	#xx~$$T$Z00r6   c                  V    e Zd Zdd	 	 	 	 	 	 	 	 	 	 	 	 	 ddZd	dZed
d       ZddZy)rj  r   r   c                   || _         t        |      | _        || _        || _        || _        || _        t        |t              sJ |       y rI   )	r   r   r   r   _slabelsr	  r   r-   r   )rN   r   r   r   r  r  r   s          r4   rO   zDataSplitter.__init__i  sH     	)&1"!	$$*d*$r6   c              #    K   | j                   }| j                  dk(  ry t        j                  | j                  | j                        \  }}t        ||      D ]#  \  }}| j                  |t        ||             % y wr1  )_sorted_datar   r	   generate_slicesr  r   _chopslice)rN   sdatastartsendsr  ends         r4   r   zDataSplitter.__iter__}  sr     !!<<1 **4==$,,Gfd+ 	7JE3**UE%$566	7s   A=A?c                d    | j                   j                  | j                  | j                        S )Nr   )r   r  r	  r   r   s    r4   r  zDataSplitter._sorted_data  s!    yy~~dnn499~==r6   c                    t        |       rI   r   )rN   r  	slice_objs      r4   r  zDataSplitter._chop  s    !$''r6   N)r   r   r   rl  r   r   r  rl  r  rl  r   r   r   r   )r   r)   )r   r   )r  r  r   r+   )r   r   r   rO   r   r   r  r  r   r6   r4   rj  rj  h  sn     ++ %+ 	+ '+ )+ + 
+(7 > >(r6   rj  c                      e Zd ZddZy)SeriesSplitterc                    |j                   j                  |      }|j                  ||j                        }|j                  |_        |j                  |d      S )Nr[  r-  method)_mgr	get_slice_constructor_from_mgrr[  rU   _name__finalize__)rN   r  r  mgrsers        r4   r  zSeriesSplitter._chop  sP    jj""9-))#CHH)=JJ	i88r6   N)r  r!   r  r  r   r!   r   r   r   r  r   r6   r4   r  r    s    9r6   r  c                      e Zd ZddZy)FrameSplitterc                    |j                   j                  |d| j                  z
        }|j                  ||j                        }|j                  |d      S )Nr9   r   r  r-  r  )r  r  r   r  r[  r  )rN   r  r  r  dfs        r4   r  zFrameSplitter._chop  sQ     jj""91tyy="A((388(<uY77r6   N)r  r   r  r  r   r   r  r   r6   r4   r  r    s    8r6   r  r   c               X    t        | t              rt        }nt        } || |||||      S )N)r  r  r   )r-   r!   r  r  )r   r   r   r  r  r   klasss          r4   r   r     s4     $$2 fgZd r6   r  )r   r   r   r   )r   r+   r   rl  r   r   r  rl  r  rl  r   r   r   rj  )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   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   rs  r\  rj  r  r  r   r   r6   r4   <module>r     s:   #     * )  . 2 
 ( '  &    ,>D
 D
NF( F(R] ]@'(78$ '(T9\ 9	8L 	8& 
  
 # %  r6   