
    EgZ                    ,   d Z ddlmZ ddlZddlZddlmZmZmZm	Z	 ddl
ZddlmZmZ ddlmc mZ ddlmZmZmZmZmZ ddlmZ ddlmZ dd	lmZmZ dd
l m!Z!m"Z"m#Z#m$Z$m%Z% ddl&m'Z'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: erddl;m<Z<m=Z=m>Z> ddl?m@Z@ d1dZAd ZB G d d          ZC G d d          ZD G d deD          ZEd2d ZF G d! d"ee                   ZG G d# d$eG          ZH G d% d&eG          ZIdd'd3d0ZJdS )4a  
Provide classes to perform the groupby aggregate operations.

These are not exposed to the user and provide implementations of the grouping
operations, primarily in cython. These classes (BaseGrouper and BinGrouper)
are contained *in* the SeriesGroupBy and DataFrameGroupBy objects.
    )annotationsN)TYPE_CHECKINGCallableGenericfinal)NaTlib)	ArrayLikeAxisIntNDFrameTShapenptAbstractMethodError)cache_readonly)maybe_cast_pointwise_resultmaybe_downcast_to_dtype)ensure_float64ensure_int64ensure_platform_intensure_uint64is_1d_only_ea_dtype)isna
maybe_fill)	DataFrame)grouper)CategoricalIndexIndex
MultiIndexensure_index)Series)compress_group_indexdecons_obs_group_idsget_flattened_listget_group_indexget_group_index_sorterget_indexer_dict)HashableIteratorSequence)NDFramereturnNonec                r    t          | t          j                  r|t          k    rt	          d          d S d S )NzMust produce aggregated value)
isinstancenpndarrayobject
ValueError)objdtypes     L/var/www/sysmax/venv/lib/python3.11/site-packages/pandas/core/groupby/ops.pycheck_result_arrayr7   P   sA     #rz"" >F?? <===	> >?    c                    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   )hasattrr:   ndimlen)ress    r6   extract_resultr@   [   sD    
 sI k8q==SXX]]a&CJr8   c                     e Zd ZU dZ eg d          ZdQd
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d0ed1<   d'd2iZedRd3            Zeej        dSd7                        ZdTd:ZdUd>ZdVd?ZdVd@ZedAdAdBdWdH            ZedWdI            ZedXdM            ZedNdOdYdP            ZdAS )Z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idxmaxkindstrhowhas_dropped_naboolr,   r-   c                0    || _         || _        || _        d S NrJ   rL   rM   )selfrJ   rL   rM   s       r6   __init__zWrappedCythonOp.__init__}   s    	,r8   rC   )val_testrD   sum	group_sumprod
group_prodrH   namerI   min	group_minmax	group_maxmean
group_meanmediangroup_median_float64var	group_varstdsemskew
group_skewfirst	group_nthlast
group_lastohlc
group_ohlcgroup_cumprodgroup_cumsumgroup_cummingroup_cummax
group_rank)cumprodcumsumcummincummaxrE   )	aggregate	transformzdict[str, dict]_CYTHON_FUNCTIONS   c                (    || j         d         v rdS dS )Nrx   ry   )rz   )clsrL   s     r6   get_kind_from_howz!WrappedCythonOp.get_kind_from_how   s    #'444;{r8   r5   np.dtype
is_numericc                v   |j         }| j        |         |         }t          |          r|}nt          t          |          }|r|S |t          j        t                    k    rH|dv rt          d| d| d          |dv r|S |dk    rnd|j	        vrt          d| d| d          |S t          d|          )	N)ra   rt   z2function is not implemented for this dtype: [how->z,dtype->])re   rf   rH   rI   rg   r2   zPThis should not be reached. Please report a bug at github.com/pandas-dev/pandas/)
rZ   rz   callablegetattr
libgroupbyr0   r5   r2   NotImplementedError__signatures__)r}   rJ   rL   r5   r   	dtype_strftypefs           r6   _get_cython_functionz$WrappedCythonOp._get_cython_function   s+   
 J	%d+C0 E?? 	+AA
E**A 	Hbhv&&&&+++)7 7 7*37 7 7   :::!111)7 7 7*37 7 7   H%0  r8   values
np.ndarrayc                
   | j         }|dv rt          |          }ng|j        j        dv rY|dv s| j        dk    r| j        rt          |          }n3|dv r/|j        j        dk    rt          |          }nt          |          }|S )z
        Cast numeric dtypes to float64 for functions that only support that.

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

        Returns
        -------
        values : np.ndarray
        )ra   re   rf   rg   iu)rc   r_   ry   )rU   rm   rW   ru   rt   i)rL   r   r5   rJ   rM   r   r   )rR   r   rL   s      r6   _get_cython_valsz WrappedCythonOp._get_cython_vals   s     h222 $F++FF\$&&o%%	[((T-@( (//DDD<$++)&11FF*622Fr8   ngroupsintr   c                    | j         }| j        }| j                            |d          }|dk    r||f}n6|dk    rt	          d          |dk    r|j        }n|f|j        dd          z   }|S )Nr;   rm   z<arity of more than 1 is not supported for the 'how' argumentry   )rL   rJ   _cython_aritygetr   shape)rR   r   r   rL   rJ   arity	out_shapes          r6   _get_output_shapez!WrappedCythonOp._get_output_shape   s    hy"&&sA.. &== %(IIQYY%N   [  II 
V\!""%55Ir8   c                    | j         }|dk    rd}n#|dv rd}n|j        dv r|j         |j         }nd}t          j        |          S )NrE   float64rH   rI   intpiufcbr2   )rL   rJ   itemsizer0   r5   )rR   r5   rL   	out_dtypes       r6   _get_out_dtypezWrappedCythonOp._get_out_dtype  sf    h&==!II((( IIzW$$$z;5>;;		$	x	"""r8   c                    | j         }|dv r<|t          j        t                    k    rt          j        t          j                  S n6|dv r2|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.
        )rU   ru   rU   rW   rt   )r_   ra   rc   re   rf   fciub)rL   r0   r5   rN   int64rJ   r   )rR   r5   rL   s      r6   _get_result_dtypez!WrappedCythonOp._get_result_dtype  s     h===&&x))) ';;;zT!!u$$x
+++r8   N)maskresult_mask	min_countcomp_idsr   npt.NDArray[np.bool_] | Noner   c          	         |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;   )r   r   r   r   r   r   )r=   _call_cython_opr   T)
rR   r   r   r   r   r   r   kwargsvalues2dr?   s
             r6   _cython_op_ndim_compatz&WrappedCythonOp._cython_op_ndim_compat6  s     ;!dAAAgHD!!!G}&)$'2&$&#!'   C y|q  1v 5L#t#
#
 
 
 
 	
r8   c               f   |}|j         }	|	j        dv }
|	j        dv }|r|                    d          }d}
n |	j        dk    r|                    d          }|j         dk    r|                    t          j                  }| j        dv r|t          |          }|	t          k    r5|d	         r-|	                                r|
                                }d||<   |                    t          d
                              t          j                  }d}
|j        }||j        }||j        }|                     ||          }|                     | j        | j        |j         |
          }|                     |          }|                     |j                   }t%          t	          j        ||                    }| j        dk    rt	          j        |t          j                  }| j        dv r |d!||||||||d| n| j        dv r| j        dv r||d<    |||||f|||d| n| j        dv r+ |d!|||||d| |                    t          d
          }nt| j        dv r5 |d!||||||d| |	t          k    r|                    t                    }n6t-          | j         d          | j        dk    r||d<    |d!||||||d| | j        dk    r| j        dvr|j         j        dv rz|sxt/          | j        dv rdnd|          }||k     }|	                                rC|||                                         sJ n$|                    d           }t          j        ||<   |j        }| j        | j        vr+|                     |j                   }t9          ||          }n|}|S )"Nr   mMr   Tbuint8float16)rC   rD   skipnaF)copyr5   rx   )rH   rI   r[   r]   r_   rk   ri   rU   )outcountsr   labelsr   r   r   is_datetimelike)rf   re   rc   rm   rW   ra   )re   rf   r   )r   r   r   )r   r   r   r   r   )rg   )r   r   r   r   r   r   z is not implementedrE   r   )r   r   r   r   r   r   r   r   )rU   rW   r   r;   r    )r5   rJ   viewastyper0   float32rL   r   r2   rC   r   rN   int8r   r   r   r   r   r   emptyzerosr   r   r]   rD   nancast_blocklistr   r   )rR   r   r   r   r   r   r   r   orig_valuesr5   r   r   r   funcr   resultr   cutoffempty_groups	res_dtype	op_results                        r6   r   zWrappedCythonOp._call_cython_opb  s    Z7*
*, 	*[[))FJJZ3[[))F<9$$]]2:..F8~%%|F||(# ,xxzz ,!''+t]]4e]4499"'BBFJ6D&)m**7F;;	((DHflJWW&&v..''55	BHYi@@@AA9##XgRX666Fx 	 	 	  
!!#' +$3
 
 
 
 
 
 LLL8~--0?F,-		
 ( +	 	 	 	 	 	 ^++ !# +      t%88X%% !!# +     F??#]]622F *TX*J*J*JKKK x6!!(3}%D  /     9##8L(L(L | D((($(o"="=QQ1iPP%##%% 6".*<8<<>>>>>> "(y!9!9/1v|,84...
 ..{/@AAI/	BBIIIr8   axisr   r
   c                    |j         dk    rt          d          |j         dk    r|dk    s
J |            d S t          |j                  s|dk    sJ d S d S )N   z.number of dimensions is currently limited to 2r;   r   )r=   r   r   r5   )rR   r   r   s      r6   _validate_axiszWrappedCythonOp._validate_axis   sr    ;??%&VWWW;!1999d99999$V\22 	 19999	 	 9r8   )r   c          	         |                      ||           t          |t          j                  s |j        d| j        | j        |||d|S  | j        |f|||dd|S )zW
        Call our cython function, with appropriate pre- and post- processing.
        )rL   rM   r   r   idsN)r   r   r   r   r   )r   r/   r0   r1   _groupby_oprL   rM   r   )rR   r   r   r   r   r   r   s          r6   cython_operationz WrappedCythonOp.cython_operation  s     	D&)))&"*-- 		%6% H#2#     +t*

 
 
 
 	
r8   )rJ   rK   rL   rK   rM   rN   r,   r-   )rL   rK   r,   rK   )rJ   rK   rL   rK   r5   r   r   rN   )r   r   r,   r   )r   r   r   r   r,   r   )r5   r   r,   r   )r   r   r   r   r   r   r   r   r   r   r   r   r,   r   )r   r   r   r
   r,   r-   )r   r
   r   r   r   r   r   r   r   r   r,   r
   )__name__
__module____qualname____doc__	frozensetr   rS   	functoolspartialr   group_any_allgroup_idxmin_idxmaxrd   rz   __annotations__r   classmethodr~   cacher   r   r   r   r   r   r   r   r   r   r   r8   r6   rB   rB   i   s,          YCCC N- - - -
$9$Z%=NNN
$9$Z%=NNN
 ;
 L	

 'i'
(FXVVV
 'i'
(FXVVV
 ;
 ;
 L
 ,
 ;
 $9$Z%9FFF
 $9$Z%9FFF
 L
 [
  L!
" L#
( '$$$ 
 
)* *    : QKM   [ _' ' ' _ ['R# # # #J   &# # # #    4  .248)
 )
 )
 )
 )
 U)
V [ [ [ U[z    U  !
 !
 !
 !
 !
 U!
 !
 !
r8   rB   c                  D   e Zd ZU dZded<   	 	 dPdQdZedRd            ZedSd            ZdTdZ	edUd            Z
	 dVdWdZedVdXd            Zeed                         ZedYd             ZedZd"            Zeed[d$                        Zed\d&            Zed]d(            Zed^d*            Zed_d,            Zeed`d-                        Zeed`d.                        Zedad0            ZedZd1            Zedbd3            ZeedUd4                        Zedcd6            Zeddd7            Zeded9            Ze	 dfdgd@            Z e	 dhdidF            Z!edjdH            Z"e	 dVdkdL            Z#eedZdM                        Z$eedZdN                        Z%dOS )l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   T	groupingsSequence[grouper.Grouping]sortrN   dropnar,   r-   c                    t          |t                    s
J |            || _        t          |          | _        || _        || _        d S rP   )r/   r   r   list
_groupings_sortr   )rR   r   r   r   r   s        r6   rS   zBaseGrouper.__init__B  sH     $&&,,,,,	26y//
r8   list[grouper.Grouping]c                    | j         S rP   )r   rR   s    r6   r   zBaseGrouper.groupingsP  s
    r8   r   c                >    t          d | j        D                       S )Nc              3  $   K   | ]}|j         V  d S rP   )r   .0pings     r6   	<genexpr>z$BaseGrouper.shape.<locals>.<genexpr>V  s$      ==dT\======r8   )tupler   r   s    r6   r   zBaseGrouper.shapeT  s!    ==dn======r8   Iterator[Hashable]c                *    t          | j                  S rP   )iterindicesr   s    r6   __iter__zBaseGrouper.__iter__X  s    DL!!!r8   r   c                *    t          | j                  S rP   )r>   r   r   s    r6   nkeyszBaseGrouper.nkeys[  s    4>"""r8   r   datar   r   #Iterator[tuple[Hashable, NDFrameT]]c              #  r   K   |                      ||          }| j        }t          ||          E d{V  dS )
        Groupby iterator

        Returns
        -------
        Generator yielding sequence of (name, subsetted object)
        for each group
        r   N)_get_splittergroup_keys_seqzip)rR   r   r   splitterkeyss        r6   get_iteratorzBaseGrouper.get_iterator_  sP       %%d%66"tX&&&&&&&&&&&r8   r+   DataSplitterc                V    | j         \  }}}t          |||| j        | j        |          S )zV
        Returns
        -------
        Generator yielding subsetted objects
        )
sorted_idssort_idxr   )
group_infor  _sorted_ids	_sort_idx)rR   r   r   r   _r   s         r6   r  zBaseGrouper._get_splittern  s?     /Q'^
 
 
 	
r8   c                    t          | j                  dk    r| j        d         S | j        \  }}}t	          ||| j        | j                  S Nr;   r   )r>   r   levelsr  r$   codesrR   r   r  r   s       r6   r  zBaseGrouper.group_keys_seq  sL     t~!##;q>!"oOCG &c7DKLLLr8   $dict[Hashable, npt.NDArray[np.intp]]c                    t          | j                  dk    r,t          | j        t                    r| j        d         j        S d | j        D             }d | j        D             }t          ||          S )z"dict {group name -> group indices}r;   r   c                    g | ]	}|j         
S r   r  r   s     r6   
<listcomp>z'BaseGrouper.indices.<locals>.<listcomp>  s    <<<Tdj<<<r8   c                    g | ]	}|j         
S r   _group_indexr   s     r6   r  z'BaseGrouper.indices.<locals>.<listcomp>      ===d!===r8   )r>   r   r/   result_indexr   r   r'   )rR   
codes_listr  s      r6   r   zBaseGrouper.indices  sv     t~!##
43DFV(W(W#>!$,,<<T^<<<
==dn===
D111r8   npt.NDArray[np.intp]c                n   t          | j        | j        | j        d          }t	          || j                  \  }}| j        r>t          j        |dk              }t          j        |dk              |         }||         }t          || j
                  }| j        r|t          j        ||          z  }|S )zR
        Get the original integer locations of result_index in the input.
        Tr   xnullr   r   r   )r%   r  r   r   r"   rM   r0   whereru   r&   r   take)rR   group_indexr  r   	null_gapsr   s         r6   result_ilocszBaseGrouper.result_ilocs  s     &J
4
 
 
 .k
KKKQ 	,8K1,--D	+"344T:I%d+K'T\BB 	1bgi000Fr8   #list[npt.NDArray[np.signedinteger]]c                $    d | j         D             S )Nc                    g | ]	}|j         
S r   r  r   s     r6   r  z%BaseGrouper.codes.<locals>.<listcomp>  s    666t
666r8   r   r   s    r6   r  zBaseGrouper.codes  s     76t~6666r8   list[Index]c                $    d | j         D             S )Nc                    g | ]	}|j         
S r   r  r   s     r6   r  z&BaseGrouper.levels.<locals>.<listcomp>  r  r8   r/  r   s    r6   r  zBaseGrouper.levels  s    ==dn====r8   list[Hashable]c                $    d | j         D             S )Nc                    g | ]	}|j         
S r   rY   r   s     r6   r  z%BaseGrouper.names.<locals>.<listcomp>  s    555d	555r8   r/  r   s    r6   nameszBaseGrouper.names  s    55dn5555r8   r!   c                    | j         \  }}}|r!t          j        ||dk             |          }ng }t          || j        dd          S )z&
        Compute group sizes.
        r   )	minlengthr   F)indexr5   r   )r  r0   bincountr!   r   )rR   r   r  r   r   s        r6   rG   zBaseGrouper.size  sV    
 /Q 	+c#)n@@@CCCc!2'NNNNr8   dict[Hashable, np.ndarray]c                x   t          | j                  dk    r| j        d         j        S g }| j        D ]Y}|j        }t	          |t
                    s|                    |           4|                    |j        d         j                   Zt          j        |          }| j	        
                    |          S )!dict {group name -> group labels}r;   r   )r>   r   groupsgrouping_vectorr/   r   appendr   from_arraysr   groupby)rR   
to_groupbyr   gvr9  s        r6   r>  zBaseGrouper.groups  s     t~!##>!$++J G G)!"k22 G%%b))))%%bl1o&EFFFF*:66E9$$U+++r8   c                @    t          | j        d                   j        S Nr   )r   r  is_monotonic_increasingr   s    r6   is_monotoniczBaseGrouper.is_monotonic  s     T_Q'((@@r8   c                b    t          | j        d         dk                                               S )zE
        Whether grouper has null value(s) that are dropped.
        r   )rN   r  rC   r   s    r6   rM   zBaseGrouper.has_dropped_na  s*     T_Q'!+0022333r8   6tuple[npt.NDArray[np.intp], npt.NDArray[np.intp], int]c                v    |                                  \  }}t          |          }t          |          }|||fS rP   )_get_compressed_codesr>   r   )rR   r   obs_group_idsr   s       r6   r  zBaseGrouper.group_info  s?    "&"<"<">">-m$$&x00//r8   c                    | j         \  }}}|S rP   )r  rR   r   r  s      r6   
codes_infozBaseGrouper.codes_info  s     O	Q
r8   :tuple[npt.NDArray[np.signedinteger], npt.NDArray[np.intp]]c                $   t          | j                  dk    r3t          | 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   r0   aranger  r   )rR   r)  r   s      r6   rL  z!BaseGrouper._get_compressed_codes  s    
 t~"")$*djtSWXXXK'$*EEEE ~a z29S):%;%;27KKKKKr8   c                *    t          | j                  S rP   )r>   r   r   s    r6   r   zBaseGrouper.ngroups  s     4$%%%r8   list[npt.NDArray[np.intp]]c                X    | j         }| j        \  }}}t          ||| j        |d          S )NT)r%  )r  r  r#   r   )rR   r  r   obs_idsr  s        r6   reconstructed_codeszBaseGrouper.reconstructed_codes  s1    
/Wa#C$*e4PPPPr8   c                    t          | j                  dk    r0| j        d         j                            | j        d                   S | j        }d | j        D             }t          ||d| j                  S )Nr;   r   c                    g | ]	}|j         
S r   )_result_indexr   s     r6   r  z,BaseGrouper.result_index.<locals>.<listcomp>  s    @@@$$@@@r8   F)r  r  verify_integrityr6  )r>   r   r[  renamer6  rX  r   )rR   r  r  s      r6   r   zBaseGrouper.result_index  sz    t~!##>!$299$*Q-HHH(@@@@@dj
 
 
 	
r8   list[ArrayLike]c                   t          | j                  dk    r| j        d         j        gS g }t          | j        | j                  D ]C\  }}t          |          }|j                            |          }|                    |           D|S r  )r>   r   _group_arrayliker  rX  r   r(  r@  )rR   	name_listr   r  r  s        r6   get_group_levelszBaseGrouper.get_group_levels  s     t~!##N1%677	t~t/GHH 	% 	%KD%'..E*//66FV$$$$r8   r   rJ   rK   rL   r   r
   c           	         |dv sJ t          ||| j                  }| j        \  }}	}	| j        }
 |j        d|||||
d|S )z;
        Returns the values of a cython operation.
        )ry   rx   rQ   )r   r   r   r   r   r   )rB   rM   r  r   r   )rR   rJ   r   rL   r   r   r   cy_opr   r  r   s              r6   _cython_operationzBaseGrouper._cython_operation,  s{     11111Ts4CVWWWO	Q,%u% 

 
 
 
 	
r8   Fr4   r   r   preserve_dtypec                    t          |j        t          j                  sd}|                     ||          }t          j        |d          }|rt          ||j        d          }n|}|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/   r:   r0   r1   _aggregate_series_pure_pythonr	   maybe_convert_objectsr   r5   )rR   r4   r   rf  r   npvaluesr   s          r6   
agg_serieszBaseGrouper.agg_seriesH  sv    " #+rz22 	"
 "N33C>>,VuEEE 	-h	PTUUUCCC
r8   npt.NDArray[np.object_]c                   | j         \  }}}t          j        |d          }d}|                     |d          }t	          |          D ]=\  }}	 ||	          }
t          |
          }
|st          |
|	j                   d}|
||<   >|S )NOr   Fr   r  T)r  r0   r   r  	enumerater@   r7   r5   )rR   r4   r   r  r   r   initializedr  r   groupr?   s              r6   rj  z)BaseGrouper._aggregate_series_pure_pythoni  s     1g'---%%c%22!(++ 		 		HAu$u++C %%C #"3444"F1IIr8   r   DataFrame | Seriestuple[list, bool]c                   d}|                      ||          }| j        }g }t          ||          }|D ]]\  }	}
t                              |
d|	           |
j        } ||
          }|st          |||          sd}|                    |           ^t          |          dk    r+t          |dd           dv r ||j
        d d                    ||fS )NFr  rZ   Tr   r   )rg   rU   rW   )r  r  r  r2   __setattr__axes_is_indexed_liker@  r>   r   iloc)rR   r   r   r   mutatedr  
group_keysresult_valueszippedkeyrs  
group_axesr?   s                r6   apply_groupwisezBaseGrouper.apply_groupwise  s    %%d%66(
 Z**  	& 	&JC ufc222 J!E((C #3CT#J#J   %%%%z??aGAz4$@$@ E
 %
 %
 Adimg%%r8   c                8    | j         \  }}}t          ||          S rP   )r  r&   r  s       r6   r  zBaseGrouper._sort_idx  s!     /Q%c7333r8   c                L    | j         \  }}}|                    | j                  S rP   )r  r(  r  rO  s      r6   r  zBaseGrouper._sorted_ids  s%     O	Qxx'''r8   N)TT)
r   r   r   r   r   rN   r   rN   r,   r-   r,   r   )r,   r   )r,   r   r,   r   r   )r   r   r   r   r,   r   )r   r+   r   r   r,   r
  )r,   r  r,   r"  )r,   r,  r,   r0  r,   r3  )r,   r!   )r,   r;  )r,   rN   r,   rJ  )r,   rQ  )r,   rU  r,   r   )r,   r^  )r   )
rJ   rK   rL   rK   r   r   r   r   r,   r
   )F)r4   r!   r   r   rf  rN   r,   r
   )r4   r!   r   r   r,   rn  )r   r   r   rt  r   r   r,   ru  )&r   r   r   r   r   rS   propertyr   r   r   r   r	  r   r  r   r  r   r+  r  r  r6  rG   r>  rH  rM   r  rP  rL  r   rX  r   rb  re  rm  rj  r  r  r  r   r8   r6   r   r   0  sS          KKK         X > > > X>" " " " # # # X# /0' ' ' ' ' 
 
 
 
 U
  M M ^ UM 2 2 2 ^2    U4 7 7 7 X U7 > > > X> 6 6 6 X6 
O 
O 
O U
O , , , ^, A A A ^ UA 4 4 4 ^ U4 0 0 0 ^0    ^
 
L 
L 
L U
L & & & ^ U& Q Q Q XQ
 
 
 
 ^
    U$  
 
 
 
 U
6 BG    U@    U. EF$& $& $& $& U$&R 4 4 4 ^ U4
 ( ( ( ^ U( ( (r8   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dS )-
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   	binlabelsNr,   r-   c                    t          |          | _        t          |          | _        || _        t          | j                  t          | j                  k    sJ d S rP   )r   r  r    r  indexerr>   )rR   r  r  r  s       r6   rS   zBinGrouper.__init__  sT     !&&	%i00 4>""c$)nn444444r8   c                N    d t          | j        | j                  D             }|S )r=  c                ,    i | ]\  }}|t           u||S r   )r   )r   r  values      r6   
<dictcomp>z%BinGrouper.groups.<locals>.<dictcomp>  s/     
 
 
U#~~ ~~r8   )r  r  r  )rR   r   s     r6   r>  zBinGrouper.groups  s5    

 
!$.$)<<
 
 

 r8   r   c                    dS )Nr;   r   r   s    r6   r   zBinGrouper.nkeys  s	     qr8   r"  c                p    | j         \  }}}| j        #t          j        || j        f          }||         }|S rP   )r  r  r0   lexsort)rR   r   r  sorters       r6   rP  zBinGrouper.codes_info  s=     O	Q<#Zdl 344Ff+C
r8   r   r   r+   r   r   c              #  "  K   |dk    rfd}nfd}t          j        |                   }d}t          | j        | j                  D ] \  }}|t
          ur| |||          fV  |}!||k     r| j        d          ||d          fV  dS dS )r  r   c                "    j         | |         S rP   rz  startedger   s     r6   <lambda>z)BinGrouper.get_iterator.<locals>.<lambda>  s    5:)> r8   c                *    j         d d | |f         S rP   r  r  s     r6   r  z)BinGrouper.get_iterator.<locals>.<lambda>  s    111eDj=)A r8   r   N)r>   rx  r  r  r  r   )rR   r   r   slicerlengthr  r  labels    `      r6   r	  zBinGrouper.get_iterator  s       199>>>>FFAAAAFTYt_%%ty$.99 	 	KD%CVVE4000000EE6>>.$ffUD&9&9999999 >r8   c                    t          j        t                    }d}t          | j        | j                  D ]6\  }}||k     r+|t          ur t          t          ||                    ||<   |}7|S rF  )collectionsdefaultdictr   r  r  r  r   range)rR   r   r   r  bins        r6   r   zBinGrouper.indices  sp    )$//dndi88 	 	JE33ww##%)%3--%8%8GENr8   rJ  c                   | j         }t          j        |t          j                  }t          j        t          j        d| j        f                   }t          |          }|t          | j                  k    r(t          j	        t          j        |          |          }n9t          j	        t          j        dt          j        |          f         |          }t          |          ||fS )Nr   r   r   )
r   r0   rS  r   diffr_r  r   r>   repeat)rR   r   rM  repr   s        r6   r  zBinGrouper.group_info(  s    ,	'999gbeAtyL)**!#&&c$)nn$$y7!3!3S99HHyr29W+=+='=!>DDH  ))
 	
r8   list[np.ndarray]c                    t           j        dt          j        | j        dd          | j        d d         k              dz   f         gS )Nr   r;   r   )r0   r  flatnonzeror  r   s    r6   rX  zBinGrouper.reconstructed_codes:  sA     a	!""3B3(GHH1LLMNNr8   c                    t          | j                  dk    r)t          | j        d                   r| j        dd          S | j        S )Nr   r;   )r>   r  r   r   s    r6   r   zBinGrouper.result_index?  sD    t~!##T^A->(?(?#>!""%%~r8   r0  c                    | j         gS rP   )r  r   s    r6   r  zBinGrouper.levelsF  s    r8   r3  c                    | j         j        gS rP   )r  rZ   r   s    r6   r6  zBinGrouper.namesJ  s    #$$r8   r   c                    | j         }| j        d         }|                    |          }t          j        ||dd |j                  }|gS )Nr   F)in_axisleveluniques)r  r  r(  r   Groupingr:   )rR   levr  r   r   s        r6   r   zBinGrouper.groupingsN  sQ    n"%FEs{
 
 
 vr8   rP   r,   r-   r  r  r  )r   r+   r   r   r  )r,   r  r  r  r  r  )r   r   r   r   r   rS   r   r>  r  r   rP  r	  r   r  rX  r   r  r6  r   r   r8   r6   r  r    s         <   	5 5 5 5 5 	 	 ^	    X    ^: : : : :2 	 	 ^	 
 
 
 ^
" O O O ^O    ^       X  % % % X%    X  r8   r  r   r   rN   c                   t          | t                    r;t          |          dk    rdS | j        |                             ||                   S t          | t
                    r&| j        |                             ||                   S dS )Nr;   F)r/   r!   r>   rx  equalsr   )r4   rx  r   s      r6   ry  ry  Y  s{    #v 1t99q==5x~$$T$Z000	C	#	# 1x~$$T$Z0005r8   c                  D    e Zd ZddddZddZedd            ZddZdS )r
  r   r  r   r   r   r"  r   r   r  r  r   r   r,   r-   c                   || _         t          |          | _        || _        || _        || _        || _        t          |t                    s
J |            d S rP   )	r   r   r   r   _slabelsr  r   r/   r   )rR   r   r   r   r  r  r   s          r6   rS   zDataSplitter.__init__i  sZ     	)&11"!	$$$**d*****r8   r)   c              #     K   | j         }| j        dk    rd S t          j        | j        | j                  \  }}t          ||          D ]+\  }}|                     |t          ||                    V  ,d S rF  )_sorted_datar   r	   generate_slicesr  r  _chopslice)rR   sdatastartsendsr  ends         r6   r   zDataSplitter.__iter__}  s      !<1 F*4=$,GGfd++ 	7 	7JE3**UE%$5$5666666	7 	7r8   c                N    | j                             | j        | j                  S )Nr  )r   r(  r  r   r   s    r6   r  zDataSplitter._sorted_data  s    y~~dn49~===r8   	slice_objr  r+   c                     t          |           rP   r   )rR   r  r  s      r6   r  zDataSplitter._chop  s    !$'''r8   N)r   r   r   r"  r   r   r  r"  r  r"  r   r   r,   r-   )r,   r)   )r,   r   )r  r  r,   r+   )r   r   r   rS   r   r   r  r  r   r8   r6   r
  r
  h  s         + + + + + +(7 7 7 7 > > > ^>( ( ( ( ( (r8   r
  c                      e Zd ZddZdS )	SeriesSplitterr  r!   r  r  r,   c                    |j                             |          }|                    ||j                  }|j        |_        |                    |d          S )Nrx  rB  method)_mgr	get_slice_constructor_from_mgrrx  rZ   _name__finalize__)rR   r  r  mgrsers        r6   r  zSeriesSplitter._chop  sS    j""9--))#CH)==J	i888r8   N)r  r!   r  r  r,   r!   r   r   r   r  r   r8   r6   r  r    s(        9 9 9 9 9 9r8   r  c                      e Zd ZddZdS )	FrameSplitterr  r   r  r  r,   c                    |j                             |d| j        z
            }|                    ||j                  }|                    |d          S )Nr;   r  r  rB  r  )r  r  r   r  rx  r  )rR   r  r  r  dfs        r6   r  zFrameSplitter._chop  sT     j""91ty="AA((38(<<uY777r8   N)r  r   r  r  r,   r   r  r   r8   r6   r  r    s(        8 8 8 8 8 8r8   r  r  r   r+   r   r"  r   r   r  r  c               l    t          | t                    rt          }nt          } || |||||          S )N)r  r  r   )r/   r!   r  r  )r   r   r   r  r  r   klasss          r6   r  r    sJ     $ $2 5fgZd   r8   r  )r   r   r,   rN   )r   r+   r   r"  r   r   r  r"  r  r"  r   r   r,   r
  )Kr   
__future__r   r  r   typingr   r   r   r   numpyr0   pandas._libsr   r	   pandas._libs.groupby_libsrB  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+   r7   r@   rB   r   r  ry  r
  r  r  r  r   r8   r6   <module>r     s_    # " " " " "                               * ) ) ) ) ) ) ) )              . - - - - - 2 2 2 2 2 2                           
 ( ' ' ' ' ' ' ' ' ' ' '            & % % % % %                 ,          ,+++++> > > >  D
 D
 D
 D
 D
 D
 D
 D
NF( F( F( F( F( F( F( F(R] ] ] ] ] ] ] ]@   '( '( '( '( '(78$ '( '( '(T9 9 9 9 9\ 9 9 9	8 	8 	8 	8 	8L 	8 	8 	8&        r8   