o
    5c)                     @  s   d dl m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 ejddd ddZejddd!ddZejddd"ddZejdddd Zejddd!ddZdS )#    )annotationsN)TYPE_CHECKINGAnyCallable)Scalar)import_optional_dependency)jit_user_function)maxsizefuncCallable[..., Scalar]nopythonboolnogilparallelc                   sH   t | |||trddl ntd  j|||dd fdd}|S )a  
    Generate a numba jitted apply function specified by values from engine_kwargs.

    1. jit the user's function
    2. Return a rolling apply function with the jitted function inline

    Configurations specified in engine_kwargs apply to both the user's
    function _AND_ the rolling apply function.

    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   Nnumbar   r   r   values
np.ndarraybeginendminimum_periodsintargsr   returnc                   s   t t|} t|D ]0}|| }|| }| || }	t t |	}
t|	|
 |kr9|	g|R  ||< qt j||< q|S )N)npemptylenprangesumisnannan)r   r   r   r   r   resultistartstopwindow	count_nanr   
numba_func O/var/www/html/gps/gps/lib/python3.10/site-packages/pandas/core/window/numba_.py
roll_apply7   s   z-generate_numba_apply_func.<locals>.roll_apply)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_apply_func   s   
r.   comfloatadjust	ignore_nadeltastuple	normalizec           	        B   t rddlntdj| ||dd fdd}|S )a  
    Generate a numba jitted ewm mean or sum function specified by values
    from engine_kwargs.

    Parameters
    ----------
    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
    com : float
    adjust : bool
    ignore_na : bool
    deltas : tuple
    normalize : bool

    Returns
    -------
    Numba function
    r   Nr   r   r   r   r   r   r   r   r   c                   s  t t| }dd  }d| } rdn|}t|D ]}|| }	|| }
| |	|
 }t t|}|d }tt | }||krG|nt j|d< d}tdt|D ]b}|| }t | }||7 }t |s|snsr}|||	| d   9 }n|| }|rr||kr|| ||  }r|||  } r||7 }nd}n	||7 }n|r|}||kr|nt j||< qU|||	|
< q|S )N      ?r      )r   r   r   r   r   r   r    range)r   r   r   r   r!   alphaold_wt_factornew_wtr"   r#   r$   r%   
sub_resultweightednobsold_wtjcuris_observationr1   r/   r3   r2   r5   r   r)   r*   ewmt   sL   

z$generate_numba_ewm_func.<locals>.ewm
r   r   r   r   r   r   r   r   r   r   r   r   r   r-   )	r   r   r   r/   r1   r2   r3   r5   rE   r)   rD   r*   generate_numba_ewm_funcN   s   !
9rH   Callable[..., np.ndarray]c                   sH   t | |||trddl ntd  j|||dd fdd}|S )a  
    Generate a numba jitted function to apply window calculations table-wise.

    Func will be passed a M window size x N number of columns array, and
    must return a 1 x N number of columns array. Func is intended to operate
    row-wise, but the result will be transposed for axis=1.

    1. jit the user's function
    2. Return a rolling apply function with the jitted function inline

    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   c                   s   t t|| jd f}t |j} t|D ]:}|| }|| }	| ||	 }
t jt |
dd}|
g|R  }t|
| |k}|||d d f< |||d d f< qt ||t j}|S )Nr8   r   )axis)	r   r   r   shaper   r   r   wherer    )r   r   r   r   r   r!   min_periods_maskr"   r#   r$   r%   r&   r=   nan_maskr'   r)   r*   
roll_table   s   z-generate_numba_table_func.<locals>.roll_table)
r   r   r   r   r   r   r   r   r   r   r,   )r
   r   r   r   rO   r)   r'   r*   generate_numba_table_func   s    
rP   c                   s8   t rdd lntdjdddd fdd}|S )Nr   r   Tr   c                   sF   t | jd }| jd D ]}| d d |f } |||< q|S )Nr8   )r   r   rK   r   )tabler!   r"   	partitionnan_funcr   r)   r*   nan_agg_with_axis   s
   zBgenerate_manual_numpy_nan_agg_with_axis.<locals>.nan_agg_with_axisrG   )rT   rU   r)   rS   r*   'generate_manual_numpy_nan_agg_with_axis   s   
rV   c           	        r6   )a  
    Generate a numba jitted ewm mean or sum function applied table wise specified
    by values from engine_kwargs.

    Parameters
    ----------
    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
    com : float
    adjust : bool
    ignore_na : bool
    deltas : tuple
    normalize: bool

    Returns
    -------
    Numba function
    r   Nr   r   r   r   r   r   r   r   r   c              	     s  dd  }d| } rdn|}t | jd }t | j}| d  }	t |	 t j}
t |
|k|	t j	|d< t
dt| D ]}| | }t | }|
|t j7 }
t|D ]y}t |	| s|| sksʈr|||  ||d   9  < n||	|  |	|< || rʈr|	| || kr|| |	|  |||   |	|< r|	| || |  |	|<  r||  |7  < q\d||< q\|	|  || 7  < q\|| r|| |	|< q\t |
|k|	t j	||< qA|S )Nr7   r8   r   )r   onesrK   r   copyr   astypeint64rL   r    r9   r   r   )r   r   r   r   r:   r;   r<   r@   r!   r>   r?   r"   rB   is_observationsrA   rD   r)   r*   	ewm_table+  sF   
z0generate_numba_ewm_table_func.<locals>.ewm_tablerF   rG   )	r   r   r   r/   r1   r2   r3   r5   r\   r)   rD   r*   generate_numba_ewm_table_func  s   !
2r]   )r
   r   r   r   r   r   r   r   )r   r   r   r   r   r   r/   r0   r1   r   r2   r   r3   r4   r5   r   )r
   rI   r   r   r   r   r   r   )
__future__r   	functoolstypingr   r   r   numpyr   pandas._typingr   pandas.compat._optionalr   pandas.core.util.numba_r   	lru_cacher.   rH   rP   rV   r]   r)   r)   r)   r*   <module>   s"    

;
b
A

