
     j                        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mZ erddlmZ ddZej        dd            Zej        dd            ZdS )z6Common utilities for Numba operations with groupby ops    )annotationsN)TYPE_CHECKINGAnyCallable)import_optional_dependency)NumbaUtilErrorjit_user_function)Scalarfuncr   returnNonec                T   t          |           st          d          t          t          j        |           j                                                  }ddg}t          |          }t          |          |k     s|d|         |k    rt          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_argss       nC:\Users\Terasoftware\OneDrive\Desktop\faahhh\fyndo\fyndo\venv\Lib\site-packages\pandas/core/groupby/numba_.pyvalidate_udfr      s    , D>> 
!C
 
 	
 *400;@@BBCCMw'M-((OM_,
)/)*m;
      
 
 	
	
 
    Callable[..., Scalar]nopythonboolnogilparallelPCallable[[np.ndarray, np.ndarray, np.ndarray, np.ndarray, int, Any], np.ndarray]c                    t          |           t          rddlnt          d                              |||          df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                p   t          |          t          |          k    sJ t          |          }t          j        ||f          }                    |          D ]W}|||         ||                  }	                    |          D ])}
| ||         ||         |
f         } ||	g|R  |||
f<   *X|S Nr   npemptypranger   r   r*   r+   r,   r.   
num_groupsresultigroup_indexjgroupr'   
numba_funcs               r   	group_aggz*generate_numba_agg_func.<locals>.group_agge   s     5zzSXX%%%%ZZ
:{344j)) 	E 	EAa3q6 12K\\+.. E EuQx#a&0!34)z%DtDDDq!tE r   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<   s        @@r   generate_numba_agg_funcrA   @   s|    > #4((J 4*733
YYYAA      BA& r   Callable[..., np.ndarray]c                    t          |           t          rddlnt          d                              |||          dfd            }|S )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                   t          |          t          |          k    sJ t          |          }t          j        t          |           |f          }                    |          D ]e}|||         ||                  }	                    |          D ]7}
| ||         ||         |
f         } ||	g|R  |||         ||         |
f<   8f|S r0   r1   r5   s               r   group_transformz6generate_numba_transform_func.<locals>.group_transform   s     5zzSXX%%%%ZZ
3v;;455j)) 	U 	UAa3q6 12K\\+.. U UuQx#a&0!34/9z%/Tt/T/T/TuQx#a&(!+,,U r   r>   r?   )r   r!   r#   r$   rE   r'   r<   s        @@r   generate_numba_transform_funcrF   |   s|    > #4((J 4*733
YYYAA      BA& r   )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   numpyr2   pandas.compat._optionalr   pandas.core.util.numba_r   r	   pandas._typingr
   r   cacherA   rF    r   r   <module>rQ      s,   < < " " " " " "                   > > > > > >       
  &%%%%%%$
 $
 $
 $
N 8 8 8 8v 8 8 8 8 8 8r   