Ë
    u™ãj"À  ã                  óŽ  — U 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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mZ ddlmZ dd	lm Z  dd
l!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l0m1Z1 ddl2m3Z3m4Z4m5Z5m6Z6 ddl7m8Z8 ddl9m:Z:m;Z;m<Z<m=Z= erddl>m?Z?m@Z@mAZAmBZB ddlCmDZD d'd„ZEd„ ZFejŽ                  ej�                  ej’                  ej”                  ejŽ                  dœZKdeLd<    G d„ d«      ZM G d„ d«      ZN G d„ deN«      ZOd(d „ZP G d!„ d"ee   «      ZQ G d#„ d$eQ«      ZR G d%„ d&eQ«      ZSy))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ÚPandas4Warning)Úcache_readonly)Úfind_stack_level)Ú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)ÚCallableÚ	GeneratorÚHashableÚIterator)Ú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     úb/var/www/html/python-recuperauto-other/env/lib/python3.12/site-packages/pandas/core/groupby/ops.pyÚcheck_result_arrayr5   U   s1   € ô �#”r—z‘zÔ"Ø”FŠ?ô Ð<Ó=Ð=ð ð #ó    c                óÂ   — t        | d«      rR| j                  } | j                  dk(  r7t        | «      dk(  r)t	        j
                  dt        t        «       ¬«       | d   } | S )zb
    Extract the result object, it might be a 0-dim ndarray
    or a len-1 0-dim, or a scalar
    Ú_valuesé   z¹Converting a Series or array of length 1 into a scalar is deprecated and will be removed in a future version. If you wish to preserve the current behavior, have ``func`` return scalars.)ÚcategoryÚ
stacklevelr   )Úhasattrr8   ÚndimÚlenÚwarningsÚwarnr   r   )Úress    r4   Úextract_resultrB   `   sY   € ô
 ˆs�IÔà�k‰kˆØ�8‰8�qŠ=œS ›X¨š]Ü�M‰MðRô (Ü+Ó-õð �a‘&ˆCØ€Jr6   )ÚsumÚprodÚminÚmaxÚmeanzdict[str, np.ufunc]Ú_REDUCEAT_UFUNCSc                  ó2  — 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#i¥d$d%d&d'd(d)œd*œZd+ed,<   d"d-iZeej"                  	 	 	 	 	 	 	 	 d>d.„«       «       Z	 d?	 	 	 	 	 d@d/„ZdAd0„ZdBd1„ZdBd2„Zed3d3d4d5œ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dCd6„«       Zed4d7œ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dCd8„«       ZedDd9„«       Zed:d;œ	 	 	 	 	 	 	 	 	 	 	 dEd<„«       Zy3)FÚWrappedCythonOpzø
    Dispatch logic for functions defined in _libs.groupby

    Parameters
    ----------
    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                óT   — || j                   d   v rdnd| _        || _        || _        y )NÚ	aggregateÚ	transform)Ú_CYTHON_FUNCTIONSÚkindÚhowÚhas_dropped_na)ÚselfrW   rX   s      r4   Ú__init__zWrappedCythonOp.__init__�   s1   € à $×"8Ñ"8¸Ñ"EÑE‰KÈ;ð 	Œ	ð ˆŒØ,ˆÕr6   rK   )Úval_testrL   rC   Ú	group_sumrD   Ú
group_prodrP   )ÚnamerQ   rE   Ú	group_minrF   Ú	group_maxrG   Ú
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ÚcummaxrM   )rS   rT   zdict[str, dict]rU   é   c                ó\  — |j                   }| j                  |   |   }t        |«      r|}nt        t        |«      }|r|S |t        j                  t        «      k(  rE|dv rt        d|› d|› d�«      ‚|dv r|S |dv r	 |S d|j                  vrt        d|› d|› d�«      ‚|S t        d|«      ‚)	N)rb   rw   z2function is not implemented for this dtype: [how->z,dtype->ú])rf   rg   rP   rQ   ©rh   rj   r0   zPThis should not be reached. Please report a bug at github.com/pandas-dev/pandas/)
r^   rU   ÚcallableÚgetattrÚ
libgroupbyr.   r3   r0   ÚNotImplementedErrorÚ__signatures__)ÚclsrV   rW   r3   Ú
is_numericÚ	dtype_strÚftypeÚfs           r4   Ú_get_cython_functionz$WrappedCythonOp._get_cython_function¹   sõ   € ð
 —J‘Jˆ	Ø×%Ñ% dÑ+¨CÑ0ˆô �EŒ?Ø‰Aäœ
 EÓ*ˆAÙØˆHØ”b—h‘hœvÓ&Ò&ØÐ+Ñ+ä)ðØ ˜E ¨)¨°Að7óð ð Ð:Ñ:à�ØÐ(Ñ(àð ˆHð  ×!1Ñ!1Ñ1ä)ðØ ˜E ¨)¨°Að7óð ð ˆHä%ð0àóð r6   c                ó6  — | j                   }|dv rt        |«      }|S |j                  j                  dv rc|dv s| j                  dk(  r| j                  r|s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
        )rb   rf   rg   rh   rj   Úiu)rd   rG   rT   )rC   rp   rD   rx   rw   Úi)rW   r   r3   rV   rX   r   r   )rY   ÚvaluesÚ	uses_maskrW   s       r4   Ú_get_cython_valsz WrappedCythonOp._get_cython_valsä   s­   € ð �h‰hˆàÐ:Ñ:ô $ FÓ+ˆFð" ˆð �\‰\×Ñ $Ñ&Ø�oÑ%Ø—	‘	˜[Ò(¨T×-@Ò-@Éô (¨Ó/�ð ˆð ÐDÑDà—<‘<×$Ñ$¨Ò+Ü)¨&Ó1�Fð ˆô +¨6Ó2�Fàˆr6   c                óð   — | j                   }| j                  }| j                  j                  |d«      }|dk(  r||f}|S |dkD  rt	        d«      ‚|dk(  r|j
                  }|S |g|j
                  dd  ¢­}|S )Nr9   rp   z<arity of more than 1 is not supported for the 'how' argumentrT   )rW   rV   Ú_cython_arityÚgetr‚   Úshape)rY   Úngroupsr�   rW   rV   ÚarityÚ	out_shapes          r4   Ú_get_output_shapez!WrappedCythonOp._get_output_shape  s›   € Ø�h‰hˆØ�y‰yˆà×"Ñ"×&Ñ& s¨AÓ.ˆð �&Š=Ø  %Ð(ˆIð Ðð �QŠYÜ%ØNóð ð �[Ò ØŸ™ˆIð Ðð !Ð4 6§<¡<°°Ð#3Ñ4ˆIØÐr6   c                ó¸   — | j                   }|dk(  rd}n2|dv rd}n+|j                  dv r|j                  › |j                  › �}nd}t        j                  |«      S )NrM   Úfloat64©rP   rQ   ÚintpÚiufcbr0   )rW   rV   Úitemsizer.   r3   )rY   r3   rW   Ú	out_dtypes       r4   Ú_get_out_dtypezWrappedCythonOp._get_out_dtype  s^   € Ø�h‰hˆà�&Š=Ø!‰IØÐ(Ñ(ð ‰IØ�Z‰Z˜7Ñ"Ø Ÿ:™:˜, u§~¡~Ð&6Ð7‰Ià ˆIÜ�x‰x˜	Ó"Ð"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.
        )rC   rx   rC   rD   rw   )rG   rb   rd   rf   rg   ÚfcÚiub)rW   r.   r3   ÚboolÚint64rV   r™   )rY   r3   rW   s      r4   Ú_get_result_dtypez!WrappedCythonOp._get_result_dtype-  s€   € ð �h‰hˆàÐ=Ñ=ØœŸ™¤›Ò&Ü—x‘x¤§¡Ó)Ð)ð ˆð Ð;Ñ;Ø�z‰z˜TÑ!Ø�Ø—‘˜uÑ$Ü—x‘x¤§
¡
Ó+Ð+Øˆr6   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 )Nr9   )Ú	min_countr”   Úcomp_idsr¦   r§   r¨   r   )r=   Ú_call_cython_opr“   ÚT)rY   r�   rª   r”   r«   r¦   r§   r¨   ÚkwargsÚvalues2drA   s              r4   Ú_cython_op_ndim_compatz&WrappedCythonOp._cython_op_ndim_compatG  sÙ   € ð �;‰;˜!Òà˜d¢A˜g‘ˆHØÐØ˜D¢!˜G‘}�ØÐ&Ø)¨$²¨'Ñ2�Ø&�$×&Ñ&Øð	à#ØØ!ØØ'Øñ	ð ñ	ˆCð �y‰y˜‰|˜qÒ Ø˜1‘v�ð —5‘5ˆLà#ˆt×#Ñ#Øð	
àØØØØ#Øñ	
ð ñ	
ð 		
r6   )r¨   c               ó2  — |}	|j                   }
|
j                  dv }|
j                  dv }| j                  dv r|€t        |«      }|r|j	                  d«      }d}n |
j                  dk(  r|j	                  d«      }|j                   dk(  r|j                  t        j                  «      }| j                  dv rk|
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!                  ||d u¬«      }| 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œ   ÚmM)rK   rL   r¤   TÚbÚuint8Úfloat16ÚskipnaF©Úcopy)rŽ   ©r3   rS   )	rP   rQ   rE   rF   rG   rn   rl   rC   rb   rC   r¨   )ÚoutÚcountsr�   Úlabelsrª   r¦   r§   Úis_datetimelike)rg   rf   rd   rp   rD   )rf   rg   r½   )rª   r¦   r§   )rº   r�   r¼   r¦   r§   r~   )rº   r»   r�   r¼   r¦   r§   z is not implementedrM   r§   )rº   r�   r¼   r”   r½   r¦   rš   r‹   ©rC   rD   r   r9   r™   © )r3   rV   rW   r   ÚviewÚastyper.   Úfloat32r0   rK   r¸   r£   Úint8r­   r—   r‰   r�   rŸ   r   ÚemptyÚzerosr¤   r‚   rF   rL   ÚnanÚcast_blocklistr¥   r   )rY   r�   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_opv  sA  € ð ˆà—‘ˆØ—Z‘Z 7Ð*ˆ
àŸ*™*¨Ð,ˆà�8‰8�~Ñ%Øˆ|Ü˜F“|�áØ—[‘[ Ó)ˆFØ‰JØ�Z‰Z˜3ÒØ—[‘[ Ó)ˆFØ�<‰<˜9Ò$Ø—]‘]¤2§:¡:Ó.ˆFà�8‰8�~Ñ%ØœŠØ˜(Ò#àÐ'¨D¯H©H¬Jà!'§¡£˜Ø'+˜˜t™Ø—]‘]¤4¨e�]Ó4×9Ñ9¼"¿'¹'ÓBˆFØˆJà—‘ˆØÐØ—6‘6ˆDØÐ&Ø)Ÿm™m�à×*Ñ*¨7°FÓ;ˆ	Ø×(Ñ(¨¯©°D·H±H¸f¿l¹lÈJÓWˆØ×&Ñ& v¸ÀTÐ9IÐ&ÓJˆØ×'Ñ'¨¯©Ó5ˆ	äœBŸH™H Y°iÔ@ÓAˆØ�9‰9˜Ó#Ü—X‘X˜g¬R¯X©XÔ6ˆFØ�x‰xð 
ñ 
ð —8‘8˜uÒ$ð )0�F˜9Ñ%Ùð 
ØØ!Ø!Ø#Ø'ØØ +Ø$3ñ
ð ó
ð —‘ÐBÑBØ—8‘8˜~Ñ-Ø0?�FÐ,Ñ-ÙØØØØð		ð
 (ØØ +ñ	ð ó	ð —‘˜^Ñ+Ùð ØØ!Ø#ØØ +ñð òð  Ÿ™¤t°%˜Ó8‘Ø—‘Ð-Ñ-Ùð ØØ!Ø!Ø#ØØ +ñð òð œF’?Ø#Ÿ]™]¬6Ó2‘Fô *¨T¯X©X¨JÐ6IÐ*JÓKÐKð �x‰x˜6Ò!à(3��}Ñ%Ùð ØØØØØ /Øñð òð �9‰9˜Ò#¨¯©Ð8LÑ(Lð �|‰|× Ñ  DÑ(±ä $§(¡(¨oÑ"=™QÀ1ÀiÓP�Ø%¨™�Ø×#Ñ#Ô%Ø"Ð.Ø*¨<Ñ8×<Ñ<Ô>Ð>Ð>ð "(§¡¨yÓ!9˜Ü/1¯v©v˜˜|Ñ,à—‘ˆà�8‰8˜4×.Ñ.Ñ.ð
 ×.Ñ.¨{×/@Ñ/@ÓAˆIÜ/°¸	ÓBˆIð Ðð ˆ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   )rY   Úaxisr�   s      r4   Ú_validate_axiszWrappedCythonOp._validate_axis  sU   € à�;‰;˜Š?Ü%Ð&VÓWÐWØ�;‰;˜!ÒØ˜1’9Ð"˜dÓ"‘9Ü$ V§\¡\Ô2ð ˜1’9Ð‘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.
        )rW   rX   rª   r”   ÚidsN)rª   r”   r«   r¦   r¿   )rÒ   r-   r.   r/   Ú_groupby_oprW   rX   r°   )rY   r�   rÑ   rª   r«   r”   r®   s          r4   Úcython_operationz WrappedCythonOp.cython_operation'  s”   € ð 	×Ñ˜D &Ô)ä˜&¤"§*¡*Ô-à%�6×%Ñ%ð Ø—H‘HØ#×2Ñ2Ø#ØØñð ñð ð +ˆt×*Ñ*Øð
àØØØñ
ð ñ
ð 	
r6   )rW   ÚstrrX   r£   ÚreturnÚNone)rV   rØ   rW   rØ   r3   únp.dtyper…   r£   )F)r�   ú
np.ndarrayrŽ   r£   rÙ   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__Ú__doc__Ú	frozensetrÇ   rZ   Ú	functoolsÚpartialr�   Úgroup_any_allÚgroup_idxmin_idxmaxre   rU   Ú__annotations__r‘   ÚclassmethodÚcacher‰   r�   r—   rŸ   r¥   r   r°   r¬   rÒ   r×   r¿   r6   r4   rJ   rJ   ~   se  … ñ	ñ ÚCó€Nó-ð
ØÐ$�9×$Ñ$ Z×%=Ñ%=ÈÔNð
àÐ$�9×$Ñ$ Z×%=Ñ%=ÈÔNð
ð �;ð
ð �Lð	
ð
 Ð'�i×'Ñ'¨
×(FÑ(FÈXÔVð
ð Ð'�i×'Ñ'¨
×(FÑ(FÈXÔVð
ð �;ð
ð �;ð
ð �Lð
ð Ð,ð
ð �;ð
ð Ð$�9×$Ñ$ Z×%9Ñ%9ÀÔFð
ð Ð$�9×$Ñ$ Z×%9Ñ%9ÀÔFð
ð �Lð
ð �Lð
ð  �[ð!
ð" �Lð#
ð$ �Lñ%
ð* 'Ø$Ø$Ø$Ø ñ
ñ+*Ð�ó ð< ˜Q�K€Mð Ø‡_�_ð'Øð'Ø ð'Ø)1ð'Ø?Cò'ó ó ð'ðT 5:ð%Ø ð%Ø-1ð%à	ó%óNó&#óð4 ð .2Ø48Øñ,
àð,
ð ð	,
ð
 ð,
ð ð,
ð +ð,
ð 2ð,
ð ð,
ð 
ò,
ó ð,
ð\ ð ñcàðcð ð	cð
 ðcð ðcð +ðcð 2ðcð ðcð 
òcó ðcðJ òó ðð ð ñ!
ð ð!
ð ð	!
ð
 ð!
ð ð!
ð ð!
ð 
ò!
ó ñ!
r6   rJ   c                  óä  — e Zd ZU dZded<   	 	 d%	 	 	 	 	 	 	 	 	 d&d„Zed'd„«       Zd(d„Zed)d„«       Z	d*d„Z
ed+d	„«       Zed,d
„«       Zeed-d„«       «       Z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e	 	 d4d„«       «       Zed-d„«       Zeed)d„«       «       Zed5d„«       Zed-d„«       Zed6d„«       Zed7d„«       Zed7d„«       Z	 	 	 	 	 	 	 	 	 	 d8d„Z	 	 	 	 	 	 	 	 d9d„Z ed:d„«       Z!e	 d;	 	 	 	 	 	 	 d<d„«       Z"e	 	 	 	 	 	 	 	 	 	 d=d„«       Z#ed>d „«       Z$e	 	 	 	 	 	 d?d!„«       Z%e	 	 	 	 	 	 d@d"„«       Z&eed-d#„«       «       Z'y$)AÚ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                óx   — t        |t        «      sJ |«       ‚|| _        || _        || _        || _        d| _        y )NF)r-   r   rÑ   Ú
_groupingsÚ_sortÚdropnaÚ_is_resample)rY   rÑ   Ú	groupingsÚsortrð   s        r4   rZ   zBaseGrouper.__init__^  s=   € ô ˜$¤Ô&Ð,¨Ó,Ð&àˆŒ	Ø#ˆŒØˆŒ
ØˆŒØ!ˆÕr6   c                ó   — | j                   S ©N)rî   ©rY   s    r4   rò   zBaseGrouper.groupingsm  s   € à�‰Ðr6   c                ó,   — t        | j                  «      S rõ   )ÚiterÚindicesrö   s    r4   Ú__iter__zBaseGrouper.__iter__q  s   € Ü�D—L‘LÓ!Ð!r6   c                ó,   — t        | j                  «      S rõ   )r>   rò   rö   s    r4   ÚnkeyszBaseGrouper.nkeyst  s   € ä�4—>‘>Ó"Ð"r6   c              #  óv   K  — | j                  |«      }| j                  }t        ||d¬«      E d{  –—†  y7 Œ­w)úš
        Groupby iterator

        Returns
        -------
        Generator yielding sequence of (name, subsetted object)
        for each group
        T©ÚstrictN)Ú_get_splitterÚresult_indexÚzip)rY   ÚdataÚsplitterÚkeyss       r4   Úget_iteratorzBaseGrouper.get_iteratorx  s5   è ø€ ð ×%Ñ% dÓ+ˆà× Ñ ˆÜ�t˜X¨dÔ3×3Ò3ús   ‚/9±7²9c                ó�   — t        |t        «      rt        }nt        } ||| j                  | j
                  | j                  ¬«      S )zV
        Returns
        -------
        Generator yielding subsetted objects
        )Ú
sorted_idsÚsort_idx)r-   r"   ÚSeriesSplitterÚFrameSplitterr”   Ú_sorted_idsÚresult_ilocs)rY   r  Úklasss      r4   r  zBaseGrouper._get_splitter†  sC   € ô �dœFÔ#Ü(6‰Eô "ˆEáØØ�L‰LØ×'Ñ'Ø×&Ñ&ô	
ð 	
r6   c                ó.  — t        | j                  «      dk(  r4t        | j                  t        «      r| j                  d   j
                  }nƒ| j                  \  }}|j                  }t        j                  |t        t        |«      «      ¬«      }|j                  «       j                  «       D ��ci c]  \  }}t        |«      r||   |“Œ }}}| j                  s§t        | j                  t        «      }|sV| j                  j                  r@|j                  «       D �	�
ci c]#  \  }	}
t!        |	«      rt"        j$                  n|	|
“Œ% }}	}
|S |r3|j                  «       D �	�
ci c]  \  }	}
t'        d„ |	D «       «      |
“Œ }}	}
|S c c}}w c c}
}	w c c}
}	w )z"dict {group name -> group indices}r9   r   ©Ú
categoriesc              3  óV   K  — | ]!  }t        |«      rt        j                  n|–— Œ# y ­wrõ   )r   r.   rÆ   )Ú.0Úcomps     r4   ú	<genexpr>z&BaseGrouper.indices.<locals>.<genexpr>¶  s   è ø€ ÒI¸T¤D¨¤Jœ"Ÿ&š&°DÓ8ÑIùs   ‚'))r>   rò   r-   r  r   rù   Úresult_index_and_idsr8   r   Ú
from_codesÚrangeÚ_reverse_indexerÚitemsrð   r    Úhasnansr   r.   rÆ   Útuple)rY   rÊ   r  rÕ   r�   r  ÚgroupÚ
axis_ilocsÚhas_miÚkeyÚvalues              r4   rù   zBaseGrouper.indicesš  sx  € ô ˆt�~‰~Ó !Ò#¬
°4×3DÑ3DÔFVÔ(Wà—^‘^ AÑ&×.Ñ.‰Fà $× 9Ñ 9ÑˆL˜#Ø!×)Ñ)ˆFÜ$×/Ñ/Ø¤¤c¨,Ó&7Ó 8ôˆJð *4×)DÑ)DÓ)F×)LÑ)LÓ)N÷ñ &�E˜:Ü�z”?ð �u‘˜zÑ)ðˆFñ ð �{Š{Ü × 1Ñ 1´:Ó>ˆFÙ˜d×/Ñ/×7Ò7àJPÏ,É,Ë.÷Ù<F¸CÀœd 3œi”B—F’F¨S°%Ñ7ð�ñ ð ˆñ ð
 '-§l¡l£n÷ñ #˜˜Uô ÑIÀSÔIÓIÈ5ÑPð�ñ ð ˆùó)ùóùó
s   Â2FÄ!(FÅ#Fc                ó  — | 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.
        r   rÓ   )rÕ   rX   r.   Úwhererx   r&   r”   Útake)rY   rÕ   r¦   Ú	null_gapsrÊ   s        r4   r  zBaseGrouper.result_ilocs¼  s{   € ð �h‰hˆà×ÒÜ—8‘8˜C 1™HÓ%ˆDäŸ	™	 #¨¡)Ó,¨TÑ2ˆIØ�d‘)ˆCä'¨¨T¯\©\Ó:ˆà×Òà”b—g‘g˜i¨Ó0Ñ0ˆFàˆr6   c                óT   — | j                   D �cg c]  }|j                  ‘Œ c}S c c}w rõ   )rò   Úcodes©rY   Úpings     r4   r(  zBaseGrouper.codesÕ  s   € à'+§~¡~Ö6˜t�—
“
Ò6Ð6ùÒ6ó   �%c                óŠ   — t        | j                  «      dkD  rt        | j                  j                  «      S | j                  gS ©Nr9   )r>   rò   Úlistr  Úlevelsrö   s    r4   r/  zBaseGrouper.levelsÙ  s9   € äˆt�~‰~Ó Ò"ä˜×)Ñ)×0Ñ0Ó1Ð1à×%Ñ%Ð&Ð&r6   c                óT   — | j                   D �cg c]  }|j                  ‘Œ c}S c c}w rõ   )rò   r^   r)  s     r4   ÚnameszBaseGrouper.namesá  s   € à&*§n¡nÖ5˜d�—	“	Ò5Ð5ùÒ5r+  c                óö   — | j                   }| j                  }|rE| j                  r!t        j                  |dz   |dz   ¬«      dd }nt        j                  ||¬«      }ng }t        || j                  dd¬«      S )z&
        Compute group sizes.
        r9   )Ú	minlengthNr¤   F)Úindexr3   r¸   )rÕ   r”   rX   r.   Úbincountr"   r  )rY   rÕ   r”   rº   s       r4   rO   zBaseGrouper.sizeå  sm   € ð
 �h‰hˆØ—,‘,ˆáØ×"Ò"Ü—k‘k #¨¡'°W¸q±[ÔAÀ!À"ÐE‘ä—k‘k #°Ô9‘àˆCÜ�c ×!2Ñ!2¸'ÈÔNÐNr6   c                ó–  — t        | j                  «      dk(  r| j                  d   j                  S | j                  \  }}|j                  }t        j                  |t        t        |«      «      ¬«      }|j                  «       j                  «       D ��ci c]$  \  }}||   | j                  j                  |«      “Œ& }}}|S c c}}w )ú!dict {group name -> group labels}r9   r   r  )r>   rò   Úgroupsr  r8   r   r  r  r  r  rÑ   r%  )rY   r  rÕ   r�   r  r  r  rÊ   s           r4   r8  zBaseGrouper.groupsö  sº   € ô ˆt�~‰~Ó !Ò#Ø—>‘> !Ñ$×+Ñ+Ð+Ø ×5Ñ5Ñˆ�cØ×%Ñ%ˆÜ ×+Ñ+¨C¼EÄ#ÀlÓBSÓ<TÔUˆ
ð &0×%@Ñ%@Ó%B×%HÑ%HÓ%J÷
ñ "��zð �5‰M˜4Ÿ9™9Ÿ>™>¨*Ó5Ñ5ð
ˆñ 
ð
 ˆùó
s   Â)Cc                óD   — t        | j                  d¬«      j                  S )NFr·   )r   rÕ   Úis_monotonic_increasingrö   s    r4   Úis_monotoniczBaseGrouper.is_monotonic  s   € ô �T—X‘X EÔ*×BÑBÐBr6   c                óN   — t        | j                  dk  j                  «       «      S )zE
        Whether grouper has null value(s) that are dropped.
        r   )r£   rÕ   rK   rö   s    r4   rX   zBaseGrouper.has_dropped_na  s    € ô �T—X‘X ‘\×&Ñ&Ó(Ó)Ð)r6   c                óT  — | j                   }| j                  r"t        |dk  j                  «       «      }||d }nd}|j                  dk(  ryt        j                  t
        j                  d|dd |dd k7  f   «      }||   }t        j                  ||j                  ¬«      }||||fS )zÎ
        Precompute segment boundaries for _reduceat_aggregate.

        Returns (na_count, group_starts, segment_ids, segment_sizes),
        or None when comp_ids is empty after dropping NA rows.
        r   NTr9   rÓ   )Úappend)	rÕ   rX   rÝ   rC   rO   r.   ÚflatnonzeroÚr_Údiff)rY   r«   Úna_countÚgroup_startsÚsegment_idsÚsegment_sizess         r4   Ú_reduceat_segment_infoz"BaseGrouper._reduceat_segment_info  s§   € ð —8‘8ˆà×ÒÜ˜H q™L×-Ñ-Ó/Ó0ˆHØ  	Ð*‰HàˆHà�=‰=˜AÒØä—~‘~¤b§e¡e¨D°(¸1¸2°,À(È3ÈBÀ-Ñ2OÐ,OÑ&PÓQˆØ˜|Ñ,ˆÜŸ™ °X·]±]ÔCˆà˜ {°MÐAÐAr6   c                ó   — | j                   S rõ   ©rÕ   rö   s    r4   Ú
codes_infozBaseGrouper.codes_info/  s   € ð �x‰xˆr6   c                ó,   — t        | j                  «      S rõ   )r>   r  rö   s    r4   r”   zBaseGrouper.ngroups4  s   € ô �4×$Ñ$Ó%Ð%r6   c                ó    — | j                   d   S )Nr   ©r  rö   s    r4   r  zBaseGrouper.result_index9  ó   € à×(Ñ(¨Ñ+Ð+r6   c                ó    — | j                   d   S r-  rL  rö   s    r4   rÕ   zBaseGrouper.ids=  rM  r6   c           
     óN  — | j                   D �cg c]#  }t        j                  |j                  d¬«      ‘Œ% }}| j                   D �cg c]  }|j                  xs |j
                   ‘Œ }}| j                   D �cg c]  }|j                  ‘Œ }}t        t        | j                   |d¬«      «      D ]3  \  }\  }}|j
                  sŒ|j                  |j                  «      ||<   Œ5 t        | j                   «      dk(  r5|d   }| j                  d   |_        t        | j                  d   «      }||fS t!        |«      r/| j#                  || j                  | j                  |«      \  }}||fS t%        |«      s.| j'                  || j                  | j                  «      \  }}||fS | j                  }	| j                   D �cg c]  }|j                  ‘Œ }
}t        |«      D ��cg c]
  \  }}|sŒ	|‘Œ }}}t        |«      D ��cg c]
  \  }}|rŒ	|‘Œ }}}| j#                  |D �cg c]  }||   ‘Œ	 c}|D �cg c]  }|
|   ‘Œ	 c}|D �cg c]  }|	|   ‘Œ	 c}|D �cg c]  }||   ‘Œ	 c}¬«      \  }}| j'                  |D �cg c]  }||   ‘Œ	 c}|D �cg c]  }|
|   ‘Œ	 c}|D �cg c]  }|	|   ‘Œ	 c}¬«      \  }}t)        j*                  t)        j,                  |j                  t        |«      «      t)        j.                  |j                  t        |«      d¬	«      gd¬	«      }t)        j0                  ||z   d¬
«      \  }}t3        t5        |j6                  «      t5        |j6                  «      z   |t5        |j                  «      t5        |j                  «      z   ¬«      j9                  |«      }t        |«      |z  |z   }| j:                  r t)        j<                  |dk  |dk  z  d|«      }t%        |«      rðt        |«      }t        t?        |«      d«      D ��cg c]  \  }}|s||z
  ‘Œ }}}t        |«      dkD  r |jA                  |«      jC                  «       }n|jC                  «       }|jE                  |«      }t)        j0                  |d¬
«      \  }}t)        jF                  t        |«      dz   t(        jH                  ¬«      }||d d d|d<   |jE                  |«      }||fS tK        |d¬«      \  }}t        |«      }t)        j*                  |t)        jL                  t)        jN                  t        |«      «      |«      g«      }|jE                  |«      }||fS c c}w c c}w c c}w c c}w c c}}w c c}}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}}w )NFr·   Trÿ   r9   r   )r/  r(  r1  Úsorts)r/  r(  r1  ©rÑ   ©Úreturn_indexrÓ   r¹   ©ró   )(rò   r   Ú_with_inferÚuniquesÚ	_observedÚ_passed_categoricalrï   Ú	enumerater  Úset_categoriesÚ
_orig_catsr>   r1  r^   r   r(  rL   Ú_ob_index_and_idsrK   Ú_unob_index_and_idsr.   ÚconcatenateÚtileÚrepeatÚuniquer    r.  r/  Úreorder_levelsrð   r$  ÚreversedÚ_drop_level_numbersÚargsortr%  rÄ   r›   r#   ÚdeleteÚarange)rY   r*  r/  ÚobsrP  ÚkÚlevelr  rÕ   r1  r(  ÚidxÚobÚ
ob_indicesÚunob_indicesÚob_indexÚob_idsÚ
unob_indexÚunob_idsÚresult_index_codesÚ_r4  Ún_levelsró   Údrop_levelsÚsorterÚrecoderV  Útakers                                r4   r  z BaseGrouper.result_index_and_idsA  s.  € ð EIÇNÁNö
Ø<@ŒE×Ñ˜dŸl™l°Ö7ð
ˆð 
ð HLÇ~Á~ö
Ø?CˆD�N‰NÒ: $×":Ñ":Ð:Ñ:ð
ˆð 
ð )-¯©Ö7 �—“Ð7ˆÐ7ä )¬#¨d¯n©n¸fÈTÔ*RÓ Sò 	BÑˆA‰}��eØ×'Ó'Ø!×0Ñ0°·±ÓA��q’	ð	Bô ˆt�~‰~Ó !Ò#Ø! !™9ˆLØ $§
¡
¨1¡ˆLÔÜ% d§j¡j°¡mÓ4ˆCðV ˜SÐ Ð ôU �ŒXØ $× 6Ñ 6Ø˜Ÿ
™
 D§J¡J°ó!ÑˆL˜#ðR ˜SÐ Ð ôM �S”Ø $× 8Ñ 8¸ÀÇÁÈTÏZÉZÓ XÑˆL˜#ðJ ˜SÐ Ð ðE —J‘JˆEØ,0¯N©NÖ; D�T—Z“ZÐ;ˆEÐ;Ü-6°s«^×B¡' # rºrš#ÐBˆJÑBÜ/8¸«~×H¡G C¨ÂRšCÐHˆLÑHØ#×5Ñ5Ø/9Ö:¨˜˜s›Ò:Ø-7Ö8 c�u˜S“zÒ8Ø-7Ö8 c�u˜S“zÒ8Ø-7Ö8 c�u˜S“zÒ8ð	  6ó  ÑˆH�fð $(×#;Ñ#;Ø/;Ö<¨˜˜s›Ò<Ø-9Ö: c�u˜S“zÒ:Ø-9Ö: c�u˜S“zÒ:ð $<ó $Ñ ˆJ˜ô "$§¡ä—G‘G˜J×,Ñ,¬c°(«mÓ<Ü—I‘I˜hŸn™n¬c°*«oÀAÔFðð ô"Ðô —y‘y °
Ñ!:ÈÔN‰HˆAˆuÜ%Ü˜J×-Ñ-Ó.´°h·o±oÓ1FÑFØ(Ü˜:×+Ñ+Ó,¬t°H·N±NÓ/CÑCô÷ ‰n˜UÓ#ð	 ô �j“/ FÑ*¨XÑ5ˆCØ�{Š{Ü—h‘h ¨¡
¨x¸!©|Ñ<¸bÀ#ÓF�ä�5Œzä˜u›:�ô &/¬x¸«ÀÓ%B÷á!˜˜TÙð ˜s“Nð�ñ ô
 �{Ó# aÒ'Ø)×=Ñ=¸kÓJ×RÑRÓT‘Fà)×1Ñ1Ó3�FØ+×0Ñ0°Ó8�ÜŸ9™9 V¸$Ô?‘��5ô Ÿ™¤# e£*¨q¡.¼¿¹Ô@�Ø#��s˜�Ø��r‘
Ø—k‘k #Ó&�ð ˜SÐ Ð ô  4°C¸eÔD‘��WÜ)¨#Ó.�ÜŸ™ØœbŸi™i¬¯	©	´#°lÓ2CÓ(DÀgÓNÐOó�ð  ,×0Ñ0°Ó7�à˜SÐ Ð ùòu
ùò
ùò 8ùò& <ùÛBùÛHùâ:ùÚ8ùÚ8ùÚ8ùò =ùÚ:ùÚ:ùó4s_   �(UÁ"U#Á9U(Æ?U-Ç"
U2Ç-U2È
U8ÈU8È#U>È5V
ÉVÉVÉ?VÊV
Ê#VÐV!c                óV   — t        d„ | j                  D «       «      r| S | j                  S )Nc              3  ó4   K  — | ]  }|j                   –— Œ y ­wrõ   )rW  )r  r*  s     r4   r  z/BaseGrouper.observed_grouper.<locals>.<genexpr>¡  s   è ø€ Ò9 $ˆt�~�~Ñ9ùs   ‚)rL   rò   Ú_observed_grouperrö   s    r4   Úobserved_grouperzBaseGrouper.observed_grouperŸ  s%   € äÑ9¨$¯.©.Ô9Ô9ØˆKà×%Ñ%Ð%r6   c                ó°   — | j                   D �cg c]  }|j                  ‘Œ }}t        | j                  || j                  | j
                  ¬«      }|S c c}w )N)ró   rð   )rò   Úobserved_groupingrì   rÑ   rï   rð   )rY   r*  rò   r   s       r4   r|  zBaseGrouper._observed_grouper¦  sF   € à8<¿¹ÖG°�T×+Ó+ÐGˆ	ÐGÜ˜dŸi™i¨¸¿¹ÈDÏKÉKÔXˆØˆùò Hs   �Ac                óÖ  ‡— t        ˆfd„‰dd  D «       «      }|r‰d   nd}t        d„ |D «       «      }t        ||dd¬«      }t        ||¬«      \  }	}
t	        |	«      }	t        |	|
||d¬	«      }t        |||d¬
«      }|s×t        |«      dkD  rÉt        ‰«      }t        t        ‰«      d«      D ��cg c]  \  }}|s||z
  ‘Œ }}}t        |«      dkD  r |j                  |«      j                  «       }n|j                  «       }|j                  |«      }t        j                  |d¬«      \  }}t        j                  |	dk(  d|j                  |	«      «      }	t	        |	«      }	||	fS c c}}w )Nc              3  ó.   •K  — | ]  }‰d    |k(  –— Œ y­w)r   Nr¿   )r  ró   rP  s     €r4   r  z0BaseGrouper._ob_index_and_ids.<locals>.<genexpr>³  s   øè ø€ Ò H°d  q¡¨TÕ!1Ñ Hùs   ƒr9   r   Fc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wrõ   ©r>   ©r  rj  s     r4   r  z0BaseGrouper._ob_index_and_ids.<locals>.<genexpr>µ  ó   è ø€ Ò5 U”c˜%—jÑ5ùó   ‚T©ró   ÚxnullrT  )rˆ  )r/  r(  r1  Úverify_integrityrR  rÓ   )rL   r  r%   r#   r   r$   r    r>   rY  rc  rd  re  r%  r.   ra  r$  )rY   r/  r(  r1  rP  Úconsistent_sortingÚsort_in_compressr“   Úgroup_indexrp  Úobs_group_idsÚob_index_codesro  ru  rk  ró   rv  rw  rt  r4  s       `               r4   r\  zBaseGrouper._ob_index_and_ids¬  sr  ø€ ô !Ó H¸eÀAÀB¸iÔ HÓHÐÙ'9˜5 š8¸uÐÜÑ5¨fÔ5Ó5ˆÜ% e¨U¸ÀTÔJˆÜ 4°[ÐGWÔ XÑˆ�Ü$ VÓ,ˆÜ-Ø�M 5¨%°tô
ˆô ØØ ØØ"ô	
ˆñ "¤c¨(£m°aÒ&7ä˜5“zˆHô "+¬8°E«?¸AÓ!>÷á�C˜Ùð ˜3“ðˆKñ ô
 �;Ó !Ò#Ø!×5Ñ5°kÓB×JÑJÓL‘à!×)Ñ)Ó+�Ø—}‘} VÓ,ˆHÜ—y‘y °dÔ;‰HˆAˆuÜ—X‘X˜f¨™l¨B°·
±
¸6Ó0BÓCˆFÜ$ VÓ,ˆØ˜ÐÐùós   Â0E%c                ó�   — t        d„ |D «       «      }t        ||dd¬«      }t        j                  ||¬«      }t	        |«      }||fS )Nc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wrõ   rƒ  r„  s     r4   r  z2BaseGrouper._unob_index_and_ids.<locals>.<genexpr>Ú  r…  r†  Tr‡  )r1  )r  r%   r    Úfrom_productr   )rY   r/  r(  r1  r“   rr  rq  s          r4   r]  zBaseGrouper._unob_index_and_idsÔ  sK   € ô Ñ5¨fÔ5Ó5ˆÜ" 5¨%°dÀ$ÔGˆÜ×,Ñ,¨V¸5ÔAˆ
Ü& xÓ0ˆØ˜8Ð#Ð#r6   c              #  óÂ   K  — | j                   }t        | j                  «      dk(  r|–— y t        |j                  dz
  dd«      D ]  }|j                  |«      –— Œ y ­w)Nr9   rÓ   )r  r>   rò   r  ÚnlevelsÚget_level_values)rY   r  rj  s      r4   Úget_group_levelszBaseGrouper.get_group_levelsà  s^   è ø€ ð ×(Ñ(ˆÜˆt�~‰~Ó !Ò#ØÓä˜|×3Ñ3°aÑ7¸¸RÓ@ò ;�Ø"×3Ñ3°EÓ:Ó:ñ;ùs   ‚AAc           	     óD  — |t         v rVt        |t        j                  «      r<|j                  j
                  dv r$| j                  r| j                  ||||«      }|�|S t        || j                  ¬«      } |j                  d|||| j                  | j                  dœ|¤ŽS )z;
        Returns the values of a cython operation.
        Úiufb)rW   rX   )r�   rÑ   rª   r«   r”   r¿   )rH   r-   r.   r/   r3   rV   r;  Ú_reduceat_aggregaterJ   rX   r×   rÕ   r”   )rY   r�   rW   rÑ   rª   r®   rÊ   Úcy_ops           r4   Ú_cython_operationzBaseGrouper._cython_operationî  s¤   € ð Ô#Ñ#Ü˜6¤2§:¡:Ô.Ø—‘×!Ñ! VÑ+Ø×!Ò!à×-Ñ-¨f°c¸4ÀÓKˆFØÐ!Ø�ä C¸×8KÑ8KÔLˆà%ˆu×%Ñ%ð 
ØØØØ—X‘XØ—L‘Lñ
ð ñ
ð 	
r6   c                ó8  — | j                   }|€y|\  }}}}	| j                  }
|j                  }|j                  dk(  r$t	        j
                  |«      j                  «       ry|dkD  r|dk(  r||d }n|dd…|d…f   }|dk(  r$t	        j                  t        j                  «      }no|dv r2|j                  dv r$t	        j                  t        j                  «      }n9|dv r3|j                  dk(  r$t	        j                  t        j                  «      }n|}|j                  |d¬	«      }t        |   }|j                  |||¬
«      }|dk(  rf|	j                  t        j                  «      }|j                  dk(  r||z  }n2dg|j                  z  }t        |«      ||<   ||j                  |«      z  }|dk(  r$t	        j                  t        j                  «      }n9|dv r3|j                  dk(  r$t	        j                  t        j                  «      }n|}t!        |j"                  «      }|
||<   |dk(  rt	        j$                  ||¬«      }nÈ|dk(  rt	        j&                  ||¬«      }n«|j                  dk(  r't	        j(                  |t        j*                  |¬«      }nu|j                  dk(  rt	        j(                  ||dk(  |¬«      }nJt	        j,                  |«      }|dk(  r|j.                  n|j0                  }t	        j(                  |||¬«      }t3        d«      gt        |«      z  }|||<   ||t5        |«      <   |dv rt/        d|«      }nt/        d|«      }|dkD  r°t	        j$                  |
t        j                  ¬«      }|	||<   ||k  }|j                  «       rq|j                  j                  dv r|j                  t        j                  «      }t3        d«      g|j                  z  }|||<   t        j*                  |t5        |«      <   t7        ||«      }|S )zV
        Use ufunc.reduceat for sorted group ids.  Returns None to fall back.
        Nrˆ   r   rG   r¾   ÚibÚuFr·   rQ  r9   r³   rC   r¹   rD   rE   r¢   )rF  r”   r3   rV   r.   ÚisnanrK   r™   r¤   Úuint64rÁ   rH   Úreduceatr=   r>   Úreshaper.  r“   rÅ   ÚonesÚfullrÆ   ÚiinforF   rE   Úslicer  r   )rY   r�   rW   rÑ   rª   ÚinforB  rC  rD  rE  r”   Ú
orig_dtypeÚ
work_dtypeÚwork_valuesÚufuncÚsegÚsizesr“   rÍ   r–   rÊ   r¤  ÚfillÚindexerrË   Úgroup_countsÚ
empty_maskÚindexer2s                               r4   r˜  zBaseGrouper._reduceat_aggregate  sq  € ð ×*Ñ*ˆØˆ<Øà=AÑ:ˆ�, ¨]Ø—,‘,ˆØ—\‘\ˆ
ð �?‰?˜cÒ!¤b§h¡h¨vÓ&6×&:Ñ&:Ô&<Øð �aŠ<Ø�qŠyØ  	Ð*‘à¢ 8¡9 Ñ-�ð �&Š=ÜŸ™¤"§*¡*Ó-‰JØ�OÑ#¨
¯©¸4Ñ(?ÜŸ™¤"§(¡(Ó+‰JØ�OÑ#¨
¯©¸3Ò(>ÜŸ™¤"§)¡)Ó,‰Jà#ˆJà—m‘m J°U�mÓ;ˆä  Ñ%ˆØ�n‰n˜[¨,¸TˆnÓBˆà�&Š=Ø!×(Ñ(¬¯©Ó4ˆEØ�x‰x˜1Š}Ø˜E‘k‘à˜˜cŸh™h™�Ü! %›j��d‘Ø˜EŸM™M¨%Ó0Ñ0�ð �&Š=ÜŸ™¤§¡Ó,‰IØ�OÑ#¨
¯©¸3Ò(>ÜŸ™¤§¡Ó*‰Ià"ˆIô ˜Ÿ™Ó&ˆ	Ø!ˆ	�$‰à�%Š<Ü—X‘X˜i¨zÔ:‰FØ�FŠ]Ü—W‘W˜Y¨jÔ9‰FØ�_‰_ Ò#ä—W‘W˜Y¬¯©°jÔA‰Fð �_‰_ Ò#Ü—W‘W˜Y¨¨u©¸JÔG‰Fä—H‘H˜ZÓ(ˆEØ # u¢�5—9’9°%·)±)ˆDÜ—W‘W˜Y¨°JÔ?ˆFä# D›k˜]¬S°«^Ñ;ˆØ#ˆ�‰Ø!$ˆŒu�W‹~Ñð �/Ñ!Ü˜˜IÓ&‰Fä˜˜IÓ&ˆFà�AŠ:ÜŸ8™8 G´2·8±8Ô<ˆLØ(5ˆL˜Ñ%Ø%¨Ñ.ˆJØ�~‰~ÔØ—<‘<×$Ñ$¨Ñ-Ø#Ÿ]™]¬2¯:©:Ó6�FÜ',¨T£{ m°f·k±kÑ&A�Ø!+�˜‘Ü*,¯&©&�”u˜X“Ñ'ä(¨°Ó;ˆàˆr6   c                ó\   — | j                  ||«      }|j                  j                  |«      S )zÎ
        Parameters
        ----------
        obj : Series
        func : function taking a Series and returning a scalar-like

        Returns
        -------
        np.ndarray or ExtensionArray
        )Ú_aggregate_series_pure_pythonÚarrayÚ_cast_pointwise_result)rY   r2   rÉ   rÊ   s       r4   Ú
agg_serieszBaseGrouper.agg_series|  s+   € ð ×3Ñ3°C¸Ó>ˆØ�y‰y×/Ñ/°Ó7Ð7r6   c                ó  — t        j                  | j                  d¬«      }d}| j                  |«      }t	        |«      D ]C  \  }} ||«      }t        |«      }| j                  r|st        ||j                  «       d}|||<   ŒE |S )NÚOr¹   FT)	r.   rÄ   r”   r  rY  rB   rñ   r5   r3   )	rY   r2   rÉ   rÊ   Úinitializedr  rŒ   r  rA   s	            r4   r³  z)BaseGrouper._aggregate_series_pure_python‹  s†   € ô —‘˜$Ÿ,™,¨cÔ2ˆØˆà×%Ñ% cÓ*ˆä! (Ó+ò 		‰HˆAˆuÙ�u“+ˆCÜ  Ó%ˆCà× Ò ©ä" 3¨¯©Ô4Ø"�àˆF�1ŠIð		ð ˆr6   c                óx  — d}| j                  |«      }| j                  }g }t        ||d¬«      }|D ]Q  \  }}	t        j	                  |	d|«       |	j
                  }
 ||	«      }|st        ||
«      sd}|j                  |«       ŒS t        |«      dk(  r$t        |dd «      dv r ||j                  d d «       ||fS )NFTrÿ   r^   r   rß   )rh   rj   rC   rD   )r  r  r  r0   Ú__setattr__ÚaxesÚ_is_indexed_liker>  r>   r€   Úiloc)rY   rˆ   r  Úmutatedr  Ú
group_keysÚresult_valuesÚzippedr!  r  Ú
group_axesrA   s               r4   Úapply_groupwisezBaseGrouper.apply_groupwise¡  s×   € ð ˆØ×%Ñ% dÓ+ˆØ×&Ñ&ˆ
Øˆô �Z °$Ô7ˆà ò 	&‰JˆC�ô ×Ñ˜u f¨cÔ2ð Ÿ™ˆJÙ�E“(ˆCÙÔ#3°C¸Ô#DØ�Ø× Ñ  Õ%ð	&ô ˆz‹?˜aÒ¤G¨A¨z¸4Ó$@ð E
ñ %
ñ ˆd�i‰i˜˜ˆmÔà˜gÐ%Ð%r6   c                óz   — | j                   j                  | j                  «      }t        | dd«      r||dk\     }|S )Nrð   Tr   )rÕ   r%  r  r€   )rY   rÊ   s     r4   r  zBaseGrouper._sorted_idsÌ  s;   € ð —‘—‘˜t×0Ñ0Ó1ˆÜ�4˜ 4Ô(à˜F a™KÑ(ˆFØˆr6   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Ù   zItuple[int, npt.NDArray[np.intp], npt.NDArray[np.intp], np.ndarray] | None)rÙ   r   )rÙ   z"tuple[Index, npt.NDArray[np.intp]])rÙ   rì   )
r/  rÍ  r(  úlist[npt.NDArray[np.intp]]r1  rÏ  rP  z
list[bool]rÙ   ú'tuple[MultiIndex, npt.NDArray[np.intp]])r/  rÍ  r(  rÑ  r1  rÏ  rÙ   rÒ  )rÙ   zGenerator[Index])rÓ   )rW   rØ   rÑ   r   rª   rÝ   rÙ   r
   )
r�   rÜ   rW   rØ   rÑ   r   rª   rÝ   rÙ   znp.ndarray | None)r2   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è   rZ   Úpropertyrò   rú   rü   r  r   r  r   rù   r  r(  r/  r1  rO   r8  r;  rX   rF  rI  r”   r  rÕ   r  r}  r|  r\  r]  r•  rš  r˜  r¶  r³  rÄ  r  r¿   r6   r4   rì   rì   L  s¬  … ñð ƒKð Øð"àð"ð *ð"ð ð	"ð
 ð"ð 
ó"ð òó ðó"ð ò#ó ð#ó4ð ò
ó ð
ð& òó ððB Øòó ó ðð. ò7ó ð7ð ò'ó ð'ð ò6ó ð6ð òOó ðOð  òó ðð ØòCó ó ðCð Øò*ó ó ð*ð ØðBà	RòBó ó ðBð4 òó ðð Øò&ó ó ð&ð ò,ó ð,ð ò,ó ð,ð ò[!ó ð[!ðz ò&ó ð&ð òó ðð
& àð& ð *ð& ð ð	& ð
 ð& ð 
1ó& ðP
$àð
$ð *ð
$ð ð	
$ð
 
1ó
$ð ò;ó ð;ð ð ð
ð ð
ð ð	
ð
 ð
ð 
ò
ó ð
ð@ ðjàðjð ðjð ð	jð
 ðjð 
òjó ðjðX ò8ó ð8ð ðØðØ!)ðà	 òó ðð* ð%&Øð%&Ø!3ð%&à	ò%&ó ð%&ðT Øòó ó ñ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„Zed„ «       Zedd„«       Ze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 rõ   )r   rÖ  r!   r×  r®  r>   )rY   rÖ  r×  r®  s       r4   rZ   zBinGrouper.__init__ø  sD   € ô ! Ó&ˆŒ	Ü% iÓ0ˆŒØˆŒô �4—>‘>Ó"¤c¨$¯)©)£nÒ4Ð4Ñ4r6   c                óŒ   — t        | j                  | j                  d¬«      D ��ci c]  \  }}|t        ur||“Œ }}}|S c c}}w )r7  Trÿ   )r  r×  rÖ  r   )rY   r!  r"  rÊ   s       r4   r8  zBinGrouper.groups  sM   € ô " $§.¡.°$·)±)ÀDÔI÷
á��UØœ#‰~ð �‰Jð
ˆñ 
ð
 ˆùó
s   ¦A c                 ó   — yr-  r¿   rö   s    r4   rü   zBinGrouper.nkeys  s   € ð r6   c                ó‚   — | j                   }| j                  �&t        j                  || j                  f«      }||   }|S rõ   )rÕ   r®  r.   Úlexsort)rY   rÕ   rw  s      r4   rI  zBinGrouper.codes_info  s<   € ð �h‰hˆØ�<‰<Ð#Ü—Z‘Z  d§l¡lÐ 3Ó4ˆFØ�f‘+ˆCØˆ
r6   c              #  óð   ‡K  — ˆfd„}d}t        | j                  | j                  d¬«      D ]  \  }}|t        ur| |||«      f–— |}Œ |t	        ‰«      k  r| j                  d    ||d«      f–— yy­w)rþ   c                ó"   •— ‰j                   | | S rõ   )r¾  )ÚstartÚedger  s     €r4   ú<lambda>z)BinGrouper.get_iterator.<locals>.<lambda>)  s   ø€  T§Y¡Y¨u°TÐ%:€ r6   r   Trÿ   rÓ   N)r  rÖ  r×  r   r>   )rY   r  Úslicerrß  rà  Úlabels    `    r4   r  zBinGrouper.get_iterator   s„   øè ø€ ó ;ˆà !ˆÜ˜tŸy™y¨$¯.©.ÀÔFò 	‰KˆD�%ØœCÑØ™V E¨4Ó0Ð0Ò0Ø‰Eð	ð
 ”3�t“9ÒØ—.‘. Ñ$¡f¨U°DÓ&9Ð9Ó9ð ùs   ƒA3A6c                óà   — t        j                  t        «      }d}t        | j                  | j
                  d¬«      D ]-  \  }}||k  sŒ|t        urt        t        ||«      «      ||<   |}Œ/ |S ©Nr   Trÿ   )ÚcollectionsÚdefaultdictr.  r  r×  rÖ  r   r  )rY   rù   rŒ   rã  Úbins        r4   rù   zBinGrouper.indices4  sj   € ä×)Ñ)¬$Ó/ˆàˆÜ˜dŸn™n¨d¯i©iÀÔEò 	‰JˆE�3Ø�3‹wØ¤Ñ#Ü%)¬%°°3«-Ó%8�G˜E‘NØ‘ð		ð
 ˆr6   c                ó   — | j                   gS rõ   rH  rö   s    r4   r(  zBinGrouper.codes@  s   € à—‘ˆzÐr6   c                ó.  — | j                   }t        | j                   «      dk7  rt        | j                   d   «      r|dd  }t        |«      }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   r9   rÓ   )
r×  r>   r   r.   rA  r@  rÖ  r   r`  rg  )rY   r  r”   ÚreprÕ   s        r4   r  zBinGrouper.result_index_and_idsD  sÐ   € à—~‘~ˆÜˆt�~‰~Ó !Ò#¬¨T¯^©^¸AÑ->Ô(?Ø'¨¨Ð+ˆLä�lÓ#ˆÜ�g‰g”b—e‘e˜A˜tŸy™y˜LÑ)Ó*ˆä! #Ó&ˆØ”c˜$Ÿ)™)“nÒ$Ü—)‘)œBŸI™I gÓ.°Ó4‰Cä—)‘)œBŸE™E "¤b§i¡i°Ó&8Ð"8Ñ9¸3Ó?ˆCÜ! #Ó&ˆà˜SÐ Ð r6   c                ó   — | j                   gS rõ   )r×  rö   s    r4   r/  zBinGrouper.levelsV  s   € à—‘ÐÐr6   c                ó0   — | j                   j                  gS rõ   )r×  r^   rö   s    r4   r1  zBinGrouper.namesZ  s   € à—‘×#Ñ#Ð$Ð$r6   c                ó¢   — | j                   }| j                  }|j                  |«      }t        j                  ||dd |j
                  ¬«      }|gS )NF)Úin_axisrj  rV  )r×  rÕ   r%  r   ÚGroupingr8   )rY   Úlevr(  r¼   r*  s        r4   rò   zBinGrouper.groupings^  sI   € à�n‰nˆØ—‘ˆØ—‘˜%“ˆÜ×ÑØ�F E°¸s¿{¹{ô
ˆð ˆvˆr6   c                ó   — | S rõ   r¿   rö   s    r4   r}  zBinGrouper.observed_grouperh  s   € àˆr6   rõ   ©rÙ   rÚ   rÈ  rÊ  )r  r+   )rÙ   rÑ  rÌ  rÎ  rÇ  )rÙ   rÕ  )rß   rà   rá   râ   rè   rZ   r   r8  rÓ  rü   rI  r  rù   r(  r  r/  r1  rò   r}  r¿   r6   r4   rÕ  rÕ  Ö  sö   … ñð<  ÓØÓð ð	5ð
 
ó5ð ñ	ó ð	ð òó ðð òó ðó:ð( ñ	ó ð	ð òó ðð ñ!ó ð!ð" ò ó ð ð ò%ó ð%ð òó ðð òó ñr6   rÕ  c                óÚ   — t        | t        «      r-t        |«      dkD  ry| j                  j	                  |d   «      S t        | t
        «      r| j                  j	                  |d   «      S y)Nr9   Fr   )r-   r"   r>   r4  Úequalsr   )r2   r¼  s     r4   r½  r½  m  sY   € Ü�#”vÔÜˆt‹9�qŠ=ØØ�y‰y×Ñ  Q¡Ó(Ð(Ü	�CœÔ	#Ø�y‰y×Ñ  Q¡Ó(Ð(àr6   c                  óV   — e Zd ZU 	 	 	 	 	 	 	 	 	 	 dd„Zd	d„Zed
d„«       Zded<   dd„Zy)rÉ  c               ó<   — || _         || _        || _        || _        y rõ   )r  r”   Ú_slabelsÚ	_sort_idx)rY   r  r”   r
  r	  s        r4   rZ   zDataSplitter.__init__}  s    € ð ˆŒ	ØˆŒà"ˆŒØ!ˆ�r6   c              #  ó–  K  — | j                   dk(  ry t        j                  | j                  | j                   «      \  }}| j                  }t        |«      | j                  uxs. t        |j                  «      xs |j                  j                   }t        ||d¬«      D ]$  \  }}| j                  |t        ||«      |«      –— Œ& y ­wrå  )r”   r	   Úgenerate_slicesrø  Ú_sorted_dataÚtypeÚ_sorted_clsr£   ÚattrsÚ_flagsÚ_allows_duplicate_labelsr  Ú_chopr¥  )rY   ÚstartsÚendsÚsdataÚneeds_finalizerß  Úends          r4   rú   zDataSplitter.__iter__‹  s¹   è ø€ Ø�<‰<˜1Òð ä×*Ñ*¨4¯=©=¸$¿,¹,ÓG‰ˆ�Ø×!Ñ!ˆô �‹K˜t×/Ñ/Ð/ò 9Ü�E—K‘KÓ ò9à—<‘<×8Ñ8Ð8ð 	ô
 ˜f d°4Ô8ò 	G‰JˆE�3Ø—*‘*˜U¤E¨%°Ó$5°~ÓFÓFñ	Gùs   ‚CC	c                óP   — | j                   j                  | j                  d¬«      S )Nr   rQ  )r  r%  rù  rö   s    r4   rü  zDataSplitter._sorted_dataŸ  s   € à�y‰y�~‰~˜dŸn™n°1ˆ~Ó5Ð5r6   ztype[NDFrame]rþ  c                ó   — t        | «      ‚rõ   )r   )rY   r  Ú	slice_objr  s       r4   r  zDataSplitter._chop¥  s   € Ü! $Ó'Ð'r6   N)
r  r   r”   rÝ   r
  rË  r	  rË  rÙ   rÚ   )rÙ   r*   )rÙ   r   )r
  r¥  r  r£   rÙ   r+   )	rß   rà   rá   rZ   rú   r   rü  rè   r  r¿   r6   r4   rÉ  rÉ  |  s^   … ð"àð"ð ð"ð
 'ð"ð )ð"ð 
ó"óGð( ò6ó ð6ð Óô(r6   rÉ  c                  ó   — e Zd ZeZdd„Zy)r  c                óâ   — |j                   j                  |«      }|j                  ||j                  ¬«      }t        j                  |d|j                  «       |r|j                  |d¬«      S |S )N©r¼  Ú_nameÚgroupby©Úmethod)Ú_mgrÚ	get_sliceÚ_constructor_from_mgrr¼  r0   r»  r^   Ú__finalize__)rY   r  r
  r  ÚmgrÚsers         r4   r  zSeriesSplitter._chop¬  sc   € à�j‰j×"Ñ" 9Ó-ˆØ×)Ñ)¨#°C·H±HÐ)Ó=ˆä×Ñ˜3 ¨¯©Ô4ÙØ×#Ñ# E°)Ð#Ó<Ð<Øˆ
r6   N)r  r"   r
  r¥  r  r£   rÙ   r"   )rß   rà   rá   r"   rþ  r  r¿   r6   r4   r  r  ©  s   „ Ø€Kôr6   r  c                  ó(   — e Zd ZeZ	 	 	 	 	 	 	 	 dd„Zy)r  c                ó¤   — |j                   j                  |d¬«      }|j                  ||j                  ¬«      }|r|j	                  |d¬«      S |S )Nr9   rQ  r  r  r  )r  r  r  r¼  r  )rY   r  r
  r  r  Údfs         r4   r  zFrameSplitter._chopº  sQ   € ð
 �j‰j×"Ñ" 9°1Ð"Ó5ˆØ×(Ñ(¨°3·8±8Ð(Ó<ˆÙØ—?‘? 5°�?Ó;Ð;Øˆ	r6   N)r  r   r
  r¥  r  r£   rÙ   r   )rß   rà   rá   r   rþ  r  r¿   r6   r4   r  r  ·  s,   „ Ø€Kð	Øð	Ø+0ð	ØBFð	à	ô	r6   r  ró  rÐ  )Trâ   Ú
__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   r   Úpandas.util._decoratorsr   Úpandas.util._exceptionsr   Ú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&   Úcollections.abcr'   r(   r)   r*   Úpandas.core.genericr+   r5   rB   ÚaddÚmultiplyÚminimumÚmaximumrH   rè   rJ   rì   rÕ  r½  rÉ  r  r  r¿   r6   r4   ú<module>r4     s.  ðòõ #ã Û ÷ó ó ã ÷÷ *Ð )÷õ ÷õ 3Ý 4õ÷õ ÷õ
 +Ý 'Ý '÷ó õ &÷ó ñ ÷ó õ ,ó>òð, �6‰6Ø�K‰KØ�:‰:Ø�:‰:Ø�F‰Fñ)Ð Ð%ó ÷K
ñ K
÷\G
ñ G
ôTT�ô Tónô*(�7˜8Ñ$ô *(ôZ�\ô ô�Lõ r6   