
    ,i                       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	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/m0Z0m1Z1m2Z2 ddl3m4Z4 ddl5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z; erddl<m=Z=m>Z>m?Z? ddl@mAZA d$dZBd ZC G d d      ZD G d d      ZE G d deE      ZFd%dZG G d de	e         ZH G d deH      ZI G d  d!eH      ZJdd"	 	 	 	 	 	 	 	 	 	 	 	 	 d&d#ZKy)'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                b    t        | t        j                        r|t        k7  rt	        d      y y )NzMust produce aggregated value)
isinstancenpndarrayobject
ValueError)objdtypes     f/var/www/system.tvplus.app.br/jogos/scrap/venv/lib/python3.12/site-packages/pandas/core/groupby/ops.pycheck_result_arrayr6   Q   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   )hasattrr9   ndimlen)ress    r5   extract_resultr?   \   s:    
 sIkk88q=SX]a&CJr7   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dAd0ZdAd1Zed2d2d3d4	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dBd5       Zed3d6	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dBd7       ZedCd8       Zed9d:	 	 	 	 	 	 	 	 	 	 	 dDd;       Zy2)E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)selfrL   rM   rN   s       r5   __init__zWrappedCythonOp.__init__~   s    	,r7   rB   )val_testrC   sum	group_sumprod
group_prodrG   )namerH   min	group_minmax	group_maxmean
group_meanmediangroup_median_float64var	group_varstdsemskew
group_skewfirst	group_nthlast
group_lastohlc
group_ohlcgroup_cumprodgroup_cumsumgroup_cummingroup_cummax
group_rank)cumprodcumsumcummincummaxrD   )	aggregate	transformzdict[str, dict]_CYTHON_FUNCTIONS   c                (    || j                   d   v ryy)Nrt   ru   )rv   )clsrM   s     r5   get_kind_from_howz!WrappedCythonOp.get_kind_from_how   s    #''44r7   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]   rp   z2function is not implemented for this dtype: [how->z,dtype->])ra   rb   rG   rH   rc   r1   zPThis should not be reached. Please report a bug at github.com/pandas-dev/pandas/)
rV   rv   callablegetattr
libgroupbyr/   r4   r1   NotImplementedError__signatures__)ry   rL   rM   r4   
is_numeric	dtype_strftypefs           r5   _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 r7   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]   ra   rb   rc   iu)r_   r[   ru   )rR   ri   rT   rq   rp   i)rM   r   r4   rL   rN   r   r   )rO   valuesrM   s      r5   _get_cython_valsz WrappedCythonOp._get_cython_vals   s     hh22 $F+F"  \\$&o%		[(T-@-@ (/  DD<<$$+)&1F  +62Fr7   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 )Nr:   ri   z<arity of more than 1 is not supported for the 'how' argumentru   )rM   rL   _cython_aritygetr   shape)rO   ngroupsr   rM   rL   arity	out_shapes          r5   _get_output_shapez!WrappedCythonOp._get_output_shape   s    hhyy""&&sA. &= %(I  QY%N  [ I  !
V\\!"%55Ir7   c                    | j                   }|dk(  rd}n2|dv rd}n+|j                  dv r|j                   |j                   }nd}t        j                  |      S )NrD   float64rG   rH   intpiufcbr1   )rM   rL   itemsizer/   r4   )rO   r4   rM   	out_dtypes       r5   _get_out_dtypezWrappedCythonOp._get_out_dtype  s^    hh&=!I(( IzzW$$zzl5>>*:;	$	xx	""r7   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.
        )rR   rq   rR   rT   rp   )r[   r]   r_   ra   rb   fciub)rM   r/   r4   boolint64rL   r   )rO   r4   rM   s      r5   _get_result_dtypez!WrappedCythonOp._get_result_dtype  s     hh==&xx))  ;;zzT!u$xx

++r7   Nr   )maskresult_maskinitialc          
        |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 )Nr:   )	min_countr   comp_idsr   r   r   r   )r<   _call_cython_opr   T)rO   r   r   r   r   r   r   r   kwargsvalues2dr>   s              r5   _cython_op_ndim_compatz&WrappedCythonOp._cython_op_ndim_compat7  s     ;;!dAgHD!G}&)$'2&$&&	#!'	 	C yy|q 1v 55L#t##	
#	
 	
 		
r7   )r   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(  rt	        j(                  |t        j*                        }| j                  dv r&| j                  dk(  r||d<    |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)rB   rC   skipnaF)copyr4   rt   )rG   rH   rW   rY   r[   rg   re   rR   rR   r   )outcountsr   labelsr   r   r   is_datetimelike)rb   ra   r_   ri   rT   r]   )ra   rb   r   )r   r   r   )r   r   r   r   r   )rc   )r   r   r   r   r   r   z is not implementedrD   r   )r   r   r   r   r   r   r   r   )rR   rT   r   r:   r    )r4   rL   viewastyper/   float32rM   r   r1   rB   r   r   int8r   r   r   r   r   r   emptyzerosr   r   rY   rC   nancast_blocklistr   r   )rO   r   r   r   r   r   r   r   r   orig_valuesr4   r   r   r   funcr   resultr   cutoffempty_groups	res_dtype	op_results                         r5   r   zWrappedCythonOp._call_cython_opf  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 	 	 88u$ )0F9% 
!!#' +$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r7   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 2r:   r   )r<   r   r   r4   )rO   axisr   s      r5   _validate_axiszWrappedCythonOp._validate_axis	  sU    ;;?%&VWW;;!19"d"9$V\\2 199 3r7   )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.
        )rM   rN   r   r   idsN)r   r   r   r   r   )r   r.   r/   r0   _groupby_oprM   rN   r   )rO   r   r   r   r   r   r   s          r5   cython_operationz WrappedCythonOp.cython_operation  s     	D&)&"**-%6%% HH#22#   +t**

 
 	
r7   )rL   strrM   r   rN   r   returnNone)rM   r   r   r   )rL   r   rM   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____doc__	frozensetr   rP   	functoolspartialr   group_any_allgroup_idxmin_idxmaxr`   rv   __annotations__r   classmethodrz   cacher   r   r   r   r   r   r   r   r   r   r   r7   r5   rA   rA   j   sN    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                     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 rJ   )r.   r   r   list
_groupings_sortdropna)rO   r   	groupingssortr   s        r5   rP   zBaseGrouper.__init__K  s9     $&,,&	26y/
r7   c                    | j                   S rJ   )r   rO   s    r5   r   zBaseGrouper.groupingsY  s    r7   c                :    t        d | j                  D              S )Nc              3  4   K   | ]  }|j                     y wrJ   )r   ).0pings     r5   	<genexpr>z$BaseGrouper.shape.<locals>.<genexpr>_  s     =dT\\=s   )tupler   r   s    r5   r   zBaseGrouper.shape]  s    =dnn===r7   c                ,    t        | j                        S rJ   )iterindicesr   s    r5   __iter__zBaseGrouper.__iter__a  s    DLL!!r7   c                ,    t        | j                        S rJ   )r=   r   r   s    r5   nkeyszBaseGrouper.nkeysd  s    4>>""r7   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)rO   datar   splitterkeyss        r5   get_iteratorzBaseGrouper.get_iteratorh  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)rO   r  r   r   _r   s         r5   r   zBaseGrouper._get_splitterw  s<     //Q''^^
 	
r7   c                    t        | j                        dk(  r| j                  d   S | j                  \  }}}t	        ||| j                  | j
                        S Nr:   r   )r=   r   levelsr	  r%   codesrO   r   r  r   s       r5   r   zBaseGrouper.group_keys_seq  sM     t~~!#;;q>!"ooOCG &c7DKKLLr7   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}r:   r   )	r=   r   r.   result_indexr   r   r  _group_indexr(   )rO   r   
codes_listr  s       r5   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#   rN   r/   whererq   r'   r   take)rO   group_indexr  r   	null_gapsr   s         r5   result_ilocszBaseGrouper.result_ilocs  s     &JJ

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

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

666   %c                T    | j                   D cg c]  }|j                   c}S c c}w rJ   )r   r  r   s     r5   r  zBaseGrouper.levels  s     .2nn=d!!===r!  c                T    | j                   D cg c]  }|j                   c}S c c}w rJ   )r   rV   r   s     r5   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)indexr4   r   )r	  r/   bincountr"   r  )rO   r   r  r   r   s        r5   rF   zBaseGrouper.size  sJ    
 //Q++c#)n@CCc!2!2'NNr7   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}r:   r   )r=   r   groupsgrouping_vectorr.   r   appendr    from_arraysr   groupby)rO   
to_groupbyr   gvr'  s        r5   r+  zBaseGrouper.groups  s     t~~!#>>!$+++J G))!"k2%%b)%%bll1o&E&EFG **:6E99$$U++r7   c                F    t        | j                  d         j                  S Nr   )r   r	  is_monotonic_increasingr   s    r5   is_monotoniczBaseGrouper.is_monotonic  s     T__Q'(@@@r7   c                T    t        | j                  d   dk  j                               S )zE
        Whether grouper has null value(s) that are dropped.
        r   )r   r	  rB   r   s    r5   rN   zBaseGrouper.has_dropped_na  s&     T__Q'!+00233r7   c                ^    | j                         \  }}t        |      }t        |      }|||fS rJ   )_get_compressed_codesr=   r   )rO   r   obs_group_idsr   s       r5   r	  zBaseGrouper.group_info  s6    "&"<"<">-m$&x0//r7   c                &    | j                   \  }}}|S rJ   )r	  rO   r   r  s      r5   
codes_infozBaseGrouper.codes_info  s     OO	Q
r7   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 )Nr:   Tr  r  r   r   )r=   r   r&   r  r   r#   r   r/   aranger  r   )rO   r  r   s      r5   r8  z!BaseGrouper._get_compressed_codes  sx    
 t~~")$**djjtSWXK'$**EE ~~a zz299S):):%;277KKKr7   c                ,    t        | j                        S rJ   )r=   r  r   s    r5   r   zBaseGrouper.ngroups  s     4$$%%r7   c                n    | j                   }| j                  \  }}}t        ||| j                  |d      S )NT)r  )r  r	  r$   r   )rO   r  r   obs_idsr  s        r5   reconstructed_codeszBaseGrouper.reconstructed_codes  s1    

//Wa#C$**e4PPr7   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 )Nr:   r   F)r  r  verify_integrityr$  )r=   r   _result_indexrenamer$  rB  r    )rO   r  r   r  s       r5   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  rB  r   r  r-  )rO   	name_listr   r  r  s        r5   get_group_levelszBaseGrouper.get_group_levels"  s     t~~!#NN1%6677	t~~t/G/GH 	%KD%'.E**//6FV$		% r7   c           	         |dv sJ t        ||| j                        }| j                  \  }}	}	| j                  }
 |j                  d|||||
d|S )z;
        Returns the values of a cython operation.
        )ru   rt   rK   )r   r   r   r   r   r   )rA   rN   r	  r   r   )rO   rL   r   rM   r   r   r   cy_opr   r  r   s              r5   _cython_operationzBaseGrouper._cython_operation5  sr     1111Ts4CVCVWOO	Q,,%u%% 

 
 	
r7   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.   r9   r/   r0   _aggregate_series_pure_pythonr
   maybe_convert_objectsr   r4   )rO   r3   r   preserve_dtyper   npvaluesr   s          r5   
agg_serieszBaseGrouper.agg_seriesQ  sj    " #++rzz2
 "N33C>,,VuE-h		PTUC 
 C
r7   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?   r6   r4   )rO   r3   r   r  r   r   initializedr  r   groupr>   s              r5   rQ  z)BaseGrouper._aggregate_series_pure_pythonr  s     1g'-%%c%2!(+ 		HAuu+C %C"34"F1I		 r7   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   rV   Tr   r   )rc   rR   rT   )r   r   r  r1   __setattr__axes_is_indexed_liker-  r=   r~   iloc)rO   r   r  r   mutatedr  
group_keysresult_valueszippedkeyrZ  
group_axesr>   s                r5   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%%r7   c                :    | j                   \  }}}t        ||      S rJ   )r	  r'   r  s       r5   r  zBaseGrouper._sort_idx  s      //Q%c733r7   c                X    | j                   \  }}}|j                  | j                        S rJ   )r	  r  r  r;  s      r5   r
  zBaseGrouper._sorted_ids  s&     OO	Qxx''r7   N)TT)
r   r   r   zSequence[grouper.Grouping]r   r   r   r   r   r   r   zlist[grouper.Grouping])r   r   )r   zIterator[Hashable]r   r   r   )r  r   r   r   r   z#Iterator[tuple[Hashable, NDFrameT]])r  r,   r   r   r   DataSplitter)r   z$dict[Hashable, npt.NDArray[np.intp]]r   npt.NDArray[np.intp])r   z#list[npt.NDArray[np.signedinteger]]r   zlist[Index]r   zlist[Hashable])r   r"   )r   zdict[Hashable, np.ndarray])r   r   r   z6tuple[npt.NDArray[np.intp], npt.NDArray[np.intp], int])r   z:tuple[npt.NDArray[np.signedinteger], npt.NDArray[np.intp]])r   zlist[npt.NDArray[np.intp]]r   r   )r   zlist[ArrayLike])r   )
rL   r   rM   r   r   r   r   r   r   r   )F)r3   r"   r   r   rS  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   rP   propertyr   r   r   r   r  r   r   r   r   r   r  r  r  r$  rF   r+  r5  rN   r	  r<  r8  r   rB  r  rJ  rM  rU  rQ  rf  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                      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 rJ   )r   rv  r!   rw  indexerr=   )rO   rv  rw  ry  s       r5   rP   zBinGrouper.__init__  sD     !&	%i0 4>>"c$))n444r7   c                    t        | j                  | j                        D ci c]  \  }}|t        ur|| }}}|S c c}}w )r*  )r  rw  rv  r	   )rO   rd  valuer   s       r5   r+  zBinGrouper.groups  sK     "$..$))<
U#~ J
 

 
s   >c                     y)Nr:   r   r   s    r5   r   zBinGrouper.nkeys  s     r7   c                    | j                   \  }}}| j                  &t        j                  || j                  f      }||   }|S rJ   )r	  ry  r/   lexsort)rO   r   r  sorters       r5   r<  zBinGrouper.codes_info  sB     OO	Q<<#ZZdll 34Ff+C
r7   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 rJ   r_  startedger  s     r5   <lambda>z)BinGrouper.get_iterator.<locals>.<lambda>  s    5)> r7   c                .    j                   d d | |f   S rJ   r  r  s     r5   r  z)BinGrouper.get_iterator.<locals>.<lambda>  s    1eDj=)A r7   r   N)r=   r]  r  rv  rw  r	   )rO   r  r   slicerlengthr  r  labels    `      r5   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 r3  )collectionsdefaultdictr   r  rw  rv  r	   range)rO   r   r   r  bins        r5   r   zBinGrouper.indices%  sh    ))$/dnndii8 	JE33w#%)%3-%8GEN		
 r7   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_rv  r   r=   repeat)rO   r   r9  repr   s        r5   r	  zBinGrouper.group_info1  s    ,,		'9ggbeeAtyyL)*!#&c$))n$yy7!3S9Hyyr299W+='=!>DH  )
 	
r7   c                    t         j                  dt        j                  | j                  dd  | j                  d d k7        dz   f   gS )Nr   r:   r   )r/   r  flatnonzerorv  r   s    r5   rB  zBinGrouper.reconstructed_codesC  sB     a		!"3B(GH1LLMNNr7   c                    t        | j                        dk7  r't        | j                  d         r| j                  dd  S | j                  S )Nr   r:   )r=   rw  r   r   s    r5   r  zBinGrouper.result_indexH  s>    t~~!#T^^A->(?>>!"%%~~r7   c                    | j                   gS rJ   )rw  r   s    r5   r  zBinGrouper.levelsO  s    r7   c                0    | j                   j                  gS rJ   )rw  rV   r   s    r5   r$  zBinGrouper.namesS  s    ##$$r7   c                    | j                   }| j                  d   }|j                  |      }t        j                  ||dd |j
                        }|gS )Nr   F)in_axisleveluniques)rw  r	  r  r   Groupingr9   )rO   levr  r   r   s        r5   r   zBinGrouper.groupingsW  sN    nn"%FEs{{
 vr7   rJ   r   r   rj  rm  rk  )r  r,   r   r   rq  )r   zlist[np.ndarray]rr  ro  rp  ri  )r   r   r   r   r   rP   r   r+  rs  r   r<  r  r   r	  rB  r  r  r$  r   r   r7   r5   ru  ru    s    <   	5
 
5 	 	    :2 	 	 
 
" O O       % %  r7   ru  c                    t        | t              r0t        |      dkD  ry| j                  |   j	                  ||         S t        | t
              r!| j                  |   j	                  ||         S y)Nr:   F)r.   r"   r=   r]  equalsr   )r3   r]  r   s      r5   r^  r^  b  sa    #vt9q=xx~$$T$Z00	C	#xx~$$T$Z00r7   c                  V    e Zd Zdd	 	 	 	 	 	 	 	 	 	 	 	 	 ddZd	dZed
d       ZddZy)rl  r   r   c                   || _         t        |      | _        || _        || _        || _        || _        t        |t              sJ |       y rJ   )	r  r   r   r   _slabelsr  r   r.   r   )rO   r  r   r   r  r  r   s          r5   rP   zDataSplitter.__init__r  sH     	)&1"!	$$*d*$r7   c              #    K   | j                   }| j                  dk(  ry t        j                  | j                  | j                        \  }}t        ||      D ]#  \  }}| j                  |t        ||             % y wr3  )_sorted_datar   r
   generate_slicesr  r  _chopslice)rO   sdatastartsendsr  ends         r5   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    r5   r  zDataSplitter._sorted_data  s!    yy~~dnn499~==r7   c                    t        |       rJ   r   )rO   r  	slice_objs      r5   r  zDataSplitter._chop  s    !$''r7   N)r  r   r   rn  r   r   r  rn  r  rn  r   r   r   r   )r   r*   )r   r   )r  r  r   r,   )r   r   r   rP   r   r   r  r  r   r7   r5   rl  rl  q  sn     ++ %+ 	+ '+ )+ + 
+(7 > >(r7   rl  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]  rV   _name__finalize__)rO   r  r  mgrsers        r5   r  zSeriesSplitter._chop  sP    jj""9-))#CHH)=JJ	i88r7   N)r  r"   r  r  r   r"   r   r   r   r  r   r7   r5   r  r    s    9r7   r  c                      e Zd ZddZy)FrameSplitterc                    |j                   j                  |d| j                  z
        }|j                  ||j                        }|j                  |d      S )Nr:   r   r  r/  r  )r  r  r   r  r]  r  )rO   r  r  r  dfs        r5   r  zFrameSplitter._chop  sQ     jj""91tyy="A((388(<uY77r7   N)r  r   r  r  r   r   r  r   r7   r5   r  r    s    8r7   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          r5   r   r     s4     $$2 fgZd r7   r  )r   r   r   r   )r  r,   r   rn  r   r   r  rn  r  rn  r   r   r   rl  )Lr   
__future__r   r  r   typingr   r   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,   r6   r?   rA   r   ru  r^  rl  r  r  r   r   r7   r5   <module>r     s:   #     * )  . 2 
 ( '  &    ,>L
 L
^F( F(R] ]@'(78$ '(T9\ 9	8L 	8& 
  
 # %  r7   