o
    5cc                     @  s   d Z ddlmZ ddlZddlZddlmZmZmZ ddl	Z
ddlmZ ddlmZ ddlmZmZ dddZejdddddZejdddddZdS )z6Common utilities for Numba operations with groupby ops    )annotationsN)TYPE_CHECKINGAnyCallable)Scalar)import_optional_dependency)NumbaUtilErrorjit_user_functionfuncr   returnNonec                 C  sp   t | stdtt| j }ddg}t|}t||k s(|d| |kr6td| d| j	 d| dS )a^  
    Validate user defined function for ops when using Numba with groupby ops.

    The first signature arguments should include:

    def f(values, index, ...):
        ...

    Parameters
    ----------
    func : function, default False
        user defined function

    Returns
    -------
    None

    Raises
    ------
    NumbaUtilError
    z5Numba engine can only be used with a single function.valuesindexNz
The first z arguments to z	 must be )
callableNotImplementedErrorlistinspect	signature
parameterskeyslenr   __name__)r
   udf_signatureexpected_argsmin_number_args r   P/var/www/html/gps/gps/lib/python3.10/site-packages/pandas/core/groupby/numba_.pyvalidate_udf   s"   
r   )maxsizeCallable[..., Scalar]nopythonboolnogilparallelPCallable[[np.ndarray, np.ndarray, np.ndarray, np.ndarray, int, Any], np.ndarray]c                   H   t | |||trddl ntd  j|||dd fdd}|S )a  
    Generate a numba jitted agg function specified by values from engine_kwargs.

    1. jit the user's function
    2. Return a groupby agg function with the jitted function inline

    Configurations specified in engine_kwargs apply to both the user's
    function _AND_ the groupby evaluation loop.

    Parameters
    ----------
    func : function
        function to be applied to each group and will be JITed
    nopython : bool
        nopython to be passed into numba.jit
    nogil : bool
        nogil to be passed into numba.jit
    parallel : bool
        parallel to be passed into numba.jit

    Returns
    -------
    Numba function
    r   Nnumbar    r"   r#   r   
np.ndarrayr   beginendnum_columnsintargsr   r   c                   s   t |t |ks
J t |}t||f} |D ]-}||| ||  }	 |D ]}
| || || |
f }||	g|R  |||
f< q+q|S Nr   npemptypranger   r   r)   r*   r+   r-   
num_groupsresultigroup_indexjgroupr&   
numba_funcr   r   	group_aggc   s   
z*generate_numba_agg_func.<locals>.group_aggr   r(   r   r(   r)   r(   r*   r(   r+   r,   r-   r   r   r(   r	   r   r&   r   jit)r
   r    r"   r#   r<   r   r:   r   generate_numba_agg_func>      
r@   Callable[..., np.ndarray]c                   r%   )a  
    Generate a numba jitted transform function specified by values from engine_kwargs.

    1. jit the user's function
    2. Return a groupby transform function with the jitted function inline

    Configurations specified in engine_kwargs apply to both the user's
    function _AND_ the groupby evaluation loop.

    Parameters
    ----------
    func : function
        function to be applied to each window and will be JITed
    nopython : bool
        nopython to be passed into numba.jit
    nogil : bool
        nogil to be passed into numba.jit
    parallel : bool
        parallel to be passed into numba.jit

    Returns
    -------
    Numba function
    r   Nr&   r'   r   r(   r   r)   r*   r+   r,   r-   r   r   c                   s   t |t |ks
J t |}tt | |f} |D ]3}||| ||  }	 |D ]!}
| || || |
f }||	g|R  ||| || |
f< q-q|S r.   r/   r3   r:   r   r   group_transform   s   
(z6generate_numba_transform_func.<locals>.group_transformr=   r>   )r
   r    r"   r#   rC   r   r:   r   generate_numba_transform_func{   rA   rD   )r
   r   r   r   )
r
   r   r    r!   r"   r!   r#   r!   r   r$   )
r
   rB   r    r!   r"   r!   r#   r!   r   r$   )__doc__
__future__r   	functoolsr   typingr   r   r   numpyr0   pandas._typingr   pandas.compat._optionalr   pandas.core.util.numba_r   r	   r   	lru_cacher@   rD   r   r   r   r   <module>   s    

'
<