a
    pÝEbRÃ  ã                   @  s®  d dl mZ d dlZd dlZd dlZd dlmZmZ d dlZd dl	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mZmZmZmZmZ d dlmZ d dlmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ d d	l,m-Z- d d
l.m/Z/m0Z0m1Z1 d dl2m3Z3 eddd�Z4e4duZ5da6d§dddœdd„Z7e7edƒƒ G dd„ dƒZ8G dd„ dƒZ9ddddœdd„Z:dd œd!d"„Z;d¨dd#d$œd%d&„Z<d'dd(d(d)œd*d+„Z=d©d'dd,d-d(d.d/œd0d1„Z>ddd2œd3d4„Z?dªd5d6œd7d8„Z@d9d9d:œd;d<„ZAd'd=d>d?œd@dA„ZBd9d9d:œdBdC„ZCddddDœd'd=dd(ddEœdFdG„ZDddddDœd'd=dd(ddEœdHdI„ZEe8dJƒeAeCddd ddKœd'd=ddLd(dMdNœdOdP„ƒƒƒZFdQd=dRd'dSdTœdUdV„ZGe8e-ƒe9ƒ eAddddDœd'd=dd(dMdEœdWdX„ƒƒƒZHe9ƒ ddddDœdYdZ„ƒZId[dLd\d,d'd]œd^d_„ZJe
 Ke
jL¡fd`d(d=dLd5dadbœdcdd„ZMe9dedf�dddeddgœdhdi„ƒZNe8dJdjƒe9dedf�dddeddgœdkdl„ƒƒZOe8dJdjƒdddeddgœd'd=ddLd(dMdmœdndo„ƒZPdpdq„ ZQeQdrdsdt�ZReQdudvdt�ZSe8dwƒddddDœd'd=dd(dxdEœdydz„ƒZTe8dwƒddddDœd'd=dd(dxdEœd{d|„ƒZUe8dJdjƒeCddddDœd'd=dd(dMdEœd}d~„ƒƒZVe8dJdjƒeCddddDœd'd=dd(dMdEœdd€„ƒƒZWe8dJdjƒeCddd ddKœd'd=ddLd(dMdNœd�d‚„ƒƒZXd'd=d(ddƒd„œd…d†„ZYe
 Ke
jL¡fd`d(d=d5d‡dˆœd‰dŠ„ZZd«d‹d=d(d[dLd‹dŒœd�dŽ„Z[d[d(dLdd�œd�d‘„Z\d’d“„ Z]e8dJdjƒd”dd•œd'd'd=d–œd—d˜„ƒZ^d™dš„ Z_e8dJdjƒdded›œd'd'd=d=dœœd�dž„ƒZ`dŸd „ Zad¡d¢„ ZbebejcƒZdebejeƒZfebejgƒZhebejiƒZjebejkƒZlebejmƒZnd£dd£d¤œd¥d¦„ZodS )¬é    )ÚannotationsN)ÚAnyÚcast)Ú
get_option)ÚNaTÚNaTTypeÚ	TimedeltaÚiNaTÚlib)Ú	ArrayLikeÚDtypeÚDtypeObjÚFÚScalarÚShapeÚnpt)Úimport_optional_dependency)Úis_any_int_dtypeÚis_bool_dtypeÚ
is_complexÚis_datetime64_any_dtypeÚis_floatÚis_float_dtypeÚ
is_integerÚis_integer_dtypeÚis_numeric_dtypeÚis_object_dtypeÚ	is_scalarÚis_timedelta64_dtypeÚneeds_i8_conversionÚpandas_dtype)ÚPeriodDtype)ÚisnaÚna_value_for_dtypeÚnotna)Úextract_arrayZ
bottleneckÚwarn)ÚerrorsFTÚboolÚNone)ÚvÚreturnc                 C  s   t r| ad S ©N)Ú_BOTTLENECK_INSTALLEDÚ_USE_BOTTLENECK)r*   © r/   úR/home/ja/django-apps/lartica_env/lib/python3.9/site-packages/pandas/core/nanops.pyÚset_use_bottleneck@   s    r1   zcompute.use_bottleneckc                      s@   e Zd Zddœ‡ fdd„Zddœdd„Zd	d	d
œdd„Z‡  ZS )Údisallowr   )Údtypesc                   s"   t ƒ  ¡  tdd„ |D ƒƒ| _d S )Nc                 s  s   | ]}t |ƒjV  qd S r,   )r    Útype)Ú.0Údtyper/   r/   r0   Ú	<genexpr>M   ó    z$disallow.__init__.<locals>.<genexpr>)ÚsuperÚ__init__Útupler3   )Úselfr3   ©Ú	__class__r/   r0   r:   K   s    
zdisallow.__init__r(   ©r+   c                 C  s   t |dƒot|jj| jƒS )Nr6   )ÚhasattrÚ
issubclassr6   r4   r3   )r<   Úobjr/   r/   r0   ÚcheckO   s    zdisallow.checkr   )Úfr+   c                   s"   t  ˆ ¡‡ ‡fdd„ƒ}tt|ƒS )Nc               
     sÆ   t  | | ¡ ¡}t‡fdd„|D ƒƒrDˆ j dd¡}td|› d�ƒ‚z@tjdd��  ˆ | i |¤ŽW  d   ƒ W S 1 sx0    Y  W n< t	yÀ } z$t
| d	 ƒrªt|ƒ|‚‚ W Y d }~n
d }~0 0 d S )
Nc                 3  s   | ]}ˆ   |¡V  qd S r,   )rC   )r5   rB   )r<   r/   r0   r7   V   r8   z0disallow.__call__.<locals>._f.<locals>.<genexpr>ÚnanÚ zreduction operation 'z' not allowed for this dtypeÚignore©Úinvalidr   )Ú	itertoolsÚchainÚvaluesÚanyÚ__name__ÚreplaceÚ	TypeErrorÚnpÚerrstateÚ
ValueErrorr   )ÚargsÚkwargsZobj_iterÚf_nameÚe©rD   r<   r/   r0   Ú_fS   s    
ÿ2
zdisallow.__call__.<locals>._f©Ú	functoolsÚwrapsr   r   )r<   rD   rY   r/   rX   r0   Ú__call__R   s    zdisallow.__call__)rN   Ú
__module__Ú__qualname__r:   rC   r]   Ú__classcell__r/   r/   r=   r0   r2   J   s   r2   c                   @  s&   e Zd Zddd„Zdddœdd„ZdS )	Úbottleneck_switchNc                 K  s   || _ || _d S r,   )ÚnamerU   )r<   rb   rU   r/   r/   r0   r:   k   s    zbottleneck_switch.__init__r   )Úaltr+   c              	     sn   ˆj p
ˆ j‰zttˆƒ‰W n ttfy4   d ‰Y n0 t ˆ ¡d ddœddddœ‡ ‡‡‡fdd„ƒ}tt	|ƒS )	NT©ÚaxisÚskipnaú
np.ndarrayú
int | Noner(   )rL   re   rf   c                  sê   t ˆjƒdkr2ˆj ¡ D ]\}}||vr|||< q| jdkrT| d¡d u rTt| |ƒS trÐ|rÐt| jˆƒrÐ| dd ¡d u r¸| 	dd ¡ ˆ| fd|i|¤Ž}t
|ƒrÎˆ | f||dœ|¤Ž}qæˆ | f||dœ|¤Ž}nˆ | f||dœ|¤Ž}|S )Nr   Ú	min_countÚmaskre   rd   )ÚlenrU   ÚitemsÚsizeÚgetÚ_na_for_min_countr.   Ú_bn_ok_dtyper6   ÚpopÚ	_has_infs)rL   re   rf   ÚkwdsÚkr*   Úresult©rc   Zbn_funcZbn_namer<   r/   r0   rD   w   s    

z%bottleneck_switch.__call__.<locals>.f)
rb   rN   ÚgetattrÚbnÚAttributeErrorÚ	NameErrorr[   r\   r   r   )r<   rc   rD   r/   rv   r0   r]   o   s    
ü"'zbottleneck_switch.__call__)N)rN   r^   r_   r:   r]   r/   r/   r/   r0   ra   j   s   
ra   r   Ústr)r6   rb   r+   c                 C  s   t | ƒst| ƒs|dvS dS )N)ÚnansumÚnanprodF)r   r   )r6   rb   r/   r/   r0   rp   ¢   s    
rp   r?   c              	   C  s^   t | tjƒr0| jdks | jdkr0t |  d¡¡S zt | ¡ ¡ W S  t	t
fyX   Y dS 0 d S )NÚf8Zf4ÚKF)Ú
isinstancerQ   Úndarrayr6   r
   Zhas_infsZravelÚisinfrM   rP   ÚNotImplementedError)ru   r/   r/   r0   rr   ²   s    rr   zScalar | None)r6   Ú
fill_valuec                 C  sP   |dur|S t | ƒr:|du r"tjS |dkr0tjS tj S n|dkrHtjS tS dS )z9return the correct fill value for the dtype of the valuesNú+inf)Ú_na_ok_dtyperQ   rE   Úinfr
   Úi8maxr	   )r6   r„   Úfill_value_typr/   r/   r0   Ú_get_fill_value¿   s    
rŠ   rg   únpt.NDArray[np.bool_] | None)rL   rf   rj   r+   c                 C  s:   |du r6t | jƒst| jƒr dS |s.t| jƒr6t| ƒ}|S )aº  
    Compute a mask if and only if necessary.

    This function will compute a mask iff it is necessary. Otherwise,
    return the provided mask (potentially None) when a mask does not need to be
    computed.

    A mask is never necessary if the values array is of boolean or integer
    dtypes, as these are incapable of storing NaNs. If passing a NaN-capable
    dtype that is interpretable as either boolean or integer data (eg,
    timedelta64), a mask must be provided.

    If the skipna parameter is False, a new mask will not be computed.

    The mask is computed using isna() by default. Setting invert=True selects
    notna() as the masking function.

    Parameters
    ----------
    values : ndarray
        input array to potentially compute mask for
    skipna : bool
        boolean for whether NaNs should be skipped
    mask : Optional[ndarray]
        nan-mask if known

    Returns
    -------
    Optional[np.ndarray[bool]]
    N)r   r6   r   r   r"   )rL   rf   rj   r/   r/   r0   Ú_maybe_get_maskÕ   s    !rŒ   r   z
str | NonezHtuple[np.ndarray, npt.NDArray[np.bool_] | None, np.dtype, np.dtype, Any])rL   rf   r„   r‰   rj   r+   c           	      C  sò   t |ƒsJ ‚t| dd�} t| ||ƒ}| j}d}t| jƒrLt |  d¡¡} d}t|ƒ}t	|||d�}|r®|dur®|dur®| 
¡ r®|s†|rž|  ¡ } t | ||¡ nt | | |¡} |}t|ƒsÂt|ƒrÐt tj¡}nt|ƒrät tj¡}| ||||fS )a7  
    Utility to get the values view, mask, dtype, dtype_max, and fill_value.

    If both mask and fill_value/fill_value_typ are not None and skipna is True,
    the values array will be copied.

    For input arrays of boolean or integer dtypes, copies will only occur if a
    precomputed mask, a fill_value/fill_value_typ, and skipna=True are
    provided.

    Parameters
    ----------
    values : ndarray
        input array to potentially compute mask for
    skipna : bool
        boolean for whether NaNs should be skipped
    fill_value : Any
        value to fill NaNs with
    fill_value_typ : str
        Set to '+inf' or '-inf' to handle dtype-specific infinities
    mask : Optional[np.ndarray[bool]]
        nan-mask if known

    Returns
    -------
    values : ndarray
        Potential copy of input value array
    mask : Optional[ndarray[bool]]
        Mask for values, if deemed necessary to compute
    dtype : np.dtype
        dtype for values
    dtype_max : np.dtype
        platform independent dtype
    fill_value : Any
        fill value used
    T©Zextract_numpyFÚi8)r„   r‰   N)r   r%   rŒ   r6   r   rQ   ÚasarrayÚviewr†   rŠ   rM   ÚcopyÚputmaskÚwherer   r   Úint64r   Úfloat64)	rL   rf   r„   r‰   rj   r6   ÚdatetimelikeZdtype_okÚ	dtype_maxr/   r/   r0   Ú_get_values  s0    .
ÿr˜   )r6   r+   c                 C  s   t | ƒrdS t| jtjƒ S )NF)r   rA   r4   rQ   Úinteger©r6   r/   r/   r0   r†   Z  s    r†   znp.dtyperš   c                 C  sØ   | t u r
nÊt|ƒr||du rt}t| tjƒspt|ƒr:J dƒ‚| |krHtj} t| ƒr^t dd¡} qzt 	| ¡ 
d¡} qÔ|  |¡} nXt|ƒrÔt| tjƒsÄ| |kržtj} t | ¡tjkr¶tdƒ‚t| dd�} n|  d¡ 
|¡} | S )	zwrap our results if neededNzExpected non-null fill_valuer   Únszdatetime64[ns]zoverflow in timedelta operation)Úunitúm8[ns])r   r   r	   r€   rQ   r�   r"   rE   Z
datetime64r”   r�   Úastyper   Úfabsr
   rˆ   rS   r   )ru   r6   r„   r/   r/   r0   Ú_wrap_results`  s,    r    r   )Úfuncr+   c                   s6   t  ˆ ¡ddddœdddddœ‡ fd	d
„ƒ}tt|ƒS )z˜
    If we have datetime64 or timedelta64 values, ensure we have a correct
    mask before calling the wrapped function, then cast back afterwards.
    NT©re   rf   rj   rg   rh   r(   r‹   )rL   re   rf   rj   c                  sr   | }| j jdv }|r$|d u r$t| ƒ}ˆ | f|||dœ|¤Ž}|rnt||j td�}|sn|d us`J ‚t||||ƒ}|S )N©ÚmÚMr¢   )r„   )r6   Úkindr"   r    r	   Ú_mask_datetimelike_result)rL   re   rf   rj   rU   Úorig_valuesr–   ru   ©r¡   r/   r0   Únew_func‹  s    	z&_datetimelike_compat.<locals>.new_funcrZ   )r¡   rª   r/   r©   r0   Ú_datetimelike_compat…  s    ûr«   rh   zScalar | np.ndarray)rL   re   r+   c                 C  sl   t | ƒr|  d¡} t| jƒ}| jdkr*|S |du r6|S | jd|… | j|d d…  }tj||| jd�S dS )a�  
    Return the missing value for `values`.

    Parameters
    ----------
    values : ndarray
    axis : int or None
        axis for the reduction, required if values.ndim > 1.

    Returns
    -------
    result : scalar or ndarray
        For 1-D values, returns a scalar of the correct missing type.
        For 2-D values, returns a 1-D array where each element is missing.
    r•   é   Nrš   )r   rž   r#   r6   ÚndimÚshaperQ   Úfull)rL   re   r„   Zresult_shaper/   r/   r0   ro   §  s    


 ro   c                   s.   t  ˆ ¡ddœdddœ‡ fdd„ƒ}tt|ƒS )z�
    NumPy operations on C-contiguous ndarrays with axis=1 can be
    very slow if axis 1 >> axis 0.
    Operate row-by-row and concatenate the results.
    N©re   rg   rh   )rL   re   c                  s¼   |dkr¨| j dkr¨| jd r¨| jd d | jd kr¨| jtkr¨| jtkr¨t| ƒ‰ ˆ d¡d urŠˆ d¡‰‡ ‡‡‡fdd„t	t
ˆ ƒƒD ƒ}n‡‡fd	d„ˆ D ƒ}t |¡S ˆ| fd
|iˆ¤ŽS )Nr¬   é   ZC_CONTIGUOUSiè  r   rj   c                   s(   g | ] }ˆˆ | fd ˆ| iˆ¤Ž‘qS ©rj   r/   )r5   Úi)Úarrsr¡   rU   rj   r/   r0   Ú
<listcomp>Ü  s   z:maybe_operate_rowwise.<locals>.newfunc.<locals>.<listcomp>c                   s   g | ]}ˆ |fi ˆ¤Ž‘qS r/   r/   )r5   Úx)r¡   rU   r/   r0   rµ   à  r8   re   )r­   Úflagsr®   r6   Úobjectr(   Úlistrn   rq   Úrangerk   rQ   Úarray)rL   re   rU   Úresultsr©   )r´   rU   rj   r0   ÚnewfuncÍ  s*    ÿþýúùø


ÿ
z&maybe_operate_rowwise.<locals>.newfuncrZ   )r¡   r½   r/   r©   r0   Úmaybe_operate_rowwiseÆ  s    r¾   r¢   ©rL   re   rf   rj   r+   c                C  s6   t | |d|d�\} }}}}t| ƒr,|  t¡} |  |¡S )a  
    Check if any elements along an axis evaluate to True.

    Parameters
    ----------
    values : ndarray
    axis : int, optional
    skipna : bool, default True
    mask : ndarray[bool], optional
        nan-mask if known

    Returns
    -------
    result : bool

    Examples
    --------
    >>> import pandas.core.nanops as nanops
    >>> s = pd.Series([1, 2])
    >>> nanops.nanany(s)
    True

    >>> import pandas.core.nanops as nanops
    >>> s = pd.Series([np.nan])
    >>> nanops.nanany(s)
    False
    F©r„   rj   )r˜   r   rž   r(   rM   ©rL   re   rf   rj   Ú_r/   r/   r0   Únananyè  s    "
rÃ   c                C  s6   t | |d|d�\} }}}}t| ƒr,|  t¡} |  |¡S )a  
    Check if all elements along an axis evaluate to True.

    Parameters
    ----------
    values : ndarray
    axis : int, optional
    skipna : bool, default True
    mask : ndarray[bool], optional
        nan-mask if known

    Returns
    -------
    result : bool

    Examples
    --------
    >>> import pandas.core.nanops as nanops
    >>> s = pd.Series([1, 2, np.nan])
    >>> nanops.nanall(s)
    True

    >>> import pandas.core.nanops as nanops
    >>> s = pd.Series([1, 0])
    >>> nanops.nanall(s)
    False
    TrÀ   )r˜   r   rž   r(   ÚallrÁ   r/   r/   r0   Únanall  s    "
rÅ   ZM8)re   rf   ri   rj   ÚintÚfloat)rL   re   rf   ri   rj   r+   c          
      C  sf   t | |d|d�\} }}}}|}t|ƒr,|}nt|ƒr@t tj¡}| j||d�}	t|	||| j|d�}	|	S )a¿  
    Sum the elements along an axis ignoring NaNs

    Parameters
    ----------
    values : ndarray[dtype]
    axis : int, optional
    skipna : bool, default True
    min_count: int, default 0
    mask : ndarray[bool], optional
        nan-mask if known

    Returns
    -------
    result : dtype

    Examples
    --------
    >>> import pandas.core.nanops as nanops
    >>> s = pd.Series([1, 2, np.nan])
    >>> nanops.nansum(s)
    3.0
    r   rÀ   rš   ©ri   )	r˜   r   r   rQ   r6   r•   ÚsumÚ_maybe_null_outr®   )
rL   re   rf   ri   rj   r6   r—   rÂ   Ú	dtype_sumÚthe_sumr/   r/   r0   r|   D  s    "ÿr|   z+np.ndarray | np.datetime64 | np.timedelta64znpt.NDArray[np.bool_]z5np.ndarray | np.datetime64 | np.timedelta64 | NaTType)ru   re   rj   r¨   r+   c                 C  sD   t | tjƒr4|  d¡ |j¡} |j|d�}t| |< n| ¡ r@tS | S )NrŽ   r°   )	r€   rQ   r�   rž   r�   r6   rM   r	   r   )ru   re   rj   r¨   Z	axis_maskr/   r/   r0   r§   u  s    
r§   c                C  s  t | |d|d�\} }}}}|}t tj¡}|jdv rBt tj¡}n&t|ƒrXt tj¡}nt|ƒrh|}|}t| j|||d�}	t	| j
||d�ƒ}
|durüt|
ddƒrüttj|	ƒ}	tjdd	�� |
|	 }W d  ƒ n1 sÖ0    Y  |	dk}| ¡ rútj||< n|	dk�r|
|	 ntj}|S )
a	  
    Compute the mean of the element along an axis ignoring NaNs

    Parameters
    ----------
    values : ndarray
    axis : int, optional
    skipna : bool, default True
    mask : ndarray[bool], optional
        nan-mask if known

    Returns
    -------
    float
        Unless input is a float array, in which case use the same
        precision as the input array.

    Examples
    --------
    >>> import pandas.core.nanops as nanops
    >>> s = pd.Series([1, 2, np.nan])
    >>> nanops.nanmean(s)
    1.5
    r   rÀ   r£   rš   Nr­   FrG   ©rÄ   )r˜   rQ   r6   r•   r¦   r   r   Ú_get_countsr®   Ú_ensure_numericrÉ   rw   r   r�   rR   rM   rE   )rL   re   rf   rj   r6   r—   rÂ   rË   Zdtype_countÚcountrÌ   Zthe_meanZct_maskr/   r/   r0   Únanmeanˆ  s.    "ÿ
&rÑ   c          
   
     s,  ‡ fdd„}t | ˆ |d�\} }}}}t| jƒs‚z|  d¡} W n2 tyn } ztt|ƒƒ|‚W Y d}~n
d}~0 0 |dur‚tj| |< | j	}| j
dk�r|du�r|røˆ s¶t ||| ¡}	n@t ¡ �( t dd¡ t | |¡}	W d  ƒ n1 sì0    Y  nt| j|tjtjƒ}	n|�r|| ƒntj}	t|	|ƒS )	aÖ  
    Parameters
    ----------
    values : ndarray
    axis : int, optional
    skipna : bool, default True
    mask : ndarray[bool], optional
        nan-mask if known

    Returns
    -------
    result : float
        Unless input is a float array, in which case use the same
        precision as the input array.

    Examples
    --------
    >>> import pandas.core.nanops as nanops
    >>> s = pd.Series([1, np.nan, 2, 2])
    >>> nanops.nanmedian(s)
    2.0
    c                   s`   t | ƒ}ˆ s| ¡ stjS t ¡ �* t dd¡ t | | ¡}W d   ƒ n1 sR0    Y  |S )NrG   úAll-NaN slice encountered)r$   rÄ   rQ   rE   ÚwarningsÚcatch_warningsÚfilterwarningsÚ	nanmedian)r¶   rj   Úres©rf   r/   r0   Ú
get_medianã  s    
,znanmedian.<locals>.get_medianr²   r~   Nr¬   rG   rÒ   )r˜   r   r6   rž   rS   rP   r{   rQ   rE   rm   r­   Zapply_along_axisrÓ   rÔ   rÕ   rÖ   Úget_empty_reduction_resultr®   Zfloat_r    )
rL   re   rf   rj   rÙ   r6   rÂ   ÚerrZnotemptyr×   r/   rØ   r0   rÖ   Ê  s(    

$

,rÖ   ztuple[int, ...]znp.dtype | type[np.floating])r®   re   r6   r„   r+   c                 C  s<   t  | ¡}t  t| ƒ¡}t j|||k |d�}| |¡ |S )zÑ
    The result from a reduction on an empty ndarray.

    Parameters
    ----------
    shape : Tuple[int]
    axis : int
    dtype : np.dtype
    fill_value : Any

    Returns
    -------
    np.ndarray
    rš   )rQ   r»   Zarangerk   ÚemptyÚfill)r®   re   r6   r„   ZshpÚdimsÚretr/   r/   r0   rÚ     s
    

rÚ   r   z9tuple[int | float | np.ndarray, int | float | np.ndarray])Úvalues_shaperj   re   Úddofr6   r+   c                 C  s€   t | |||d�}|| |¡ }t|ƒr<||krxtj}tj}n<ttj|ƒ}||k}| ¡ rxt ||tj¡ t ||tj¡ ||fS )a:  
    Get the count of non-null values along an axis, accounting
    for degrees of freedom.

    Parameters
    ----------
    values_shape : Tuple[int, ...]
        shape tuple from values ndarray, used if mask is None
    mask : Optional[ndarray[bool]]
        locations in values that should be considered missing
    axis : Optional[int]
        axis to count along
    ddof : int
        degrees of freedom
    dtype : type, optional
        type to use for count

    Returns
    -------
    count : int, np.nan or np.ndarray
    d : int, np.nan or np.ndarray
    rš   )	rÎ   r4   r   rQ   rE   r   r�   rM   r’   )rà   rj   re   rá   r6   rÐ   Údr/   r/   r0   Ú_get_counts_nanvar0  s    rã   r¬   ©rá   ©re   rf   rá   rj   c             	   C  sT   | j dkr|  d¡} | j }t| ||d�\} }}}}t t| ||||d�¡}t||ƒS )a¹  
    Compute the standard deviation along given axis while ignoring NaNs

    Parameters
    ----------
    values : ndarray
    axis : int, optional
    skipna : bool, default True
    ddof : int, default 1
        Delta Degrees of Freedom. The divisor used in calculations is N - ddof,
        where N represents the number of elements.
    mask : ndarray[bool], optional
        nan-mask if known

    Returns
    -------
    result : float
        Unless input is a float array, in which case use the same
        precision as the input array.

    Examples
    --------
    >>> import pandas.core.nanops as nanops
    >>> s = pd.Series([1, np.nan, 2, 3])
    >>> nanops.nanstd(s)
    1.0
    úM8[ns]r�   r²   rå   )r6   r�   r˜   rQ   ÚsqrtÚnanvarr    )rL   re   rf   rá   rj   Ú
orig_dtyperÂ   ru   r/   r/   r0   Únanstd_  s    

rê   Zm8c                C  s  t | dd�} | j}t| ||ƒ}t|ƒrB|  d¡} |durBtj| |< t| jƒrft| j	|||| jƒ\}}nt| j	|||ƒ\}}|rœ|durœ|  
¡ } t | |d¡ t| j|tjd�ƒ| }|durÈt ||¡}t||  d ƒ}	|durît |	|d¡ |	j|tjd�| }
t|ƒ�r|
j|dd	�}
|
S )
a¯  
    Compute the variance along given axis while ignoring NaNs

    Parameters
    ----------
    values : ndarray
    axis : int, optional
    skipna : bool, default True
    ddof : int, default 1
        Delta Degrees of Freedom. The divisor used in calculations is N - ddof,
        where N represents the number of elements.
    mask : ndarray[bool], optional
        nan-mask if known

    Returns
    -------
    result : float
        Unless input is a float array, in which case use the same
        precision as the input array.

    Examples
    --------
    >>> import pandas.core.nanops as nanops
    >>> s = pd.Series([1, np.nan, 2, 3])
    >>> nanops.nanvar(s)
    1.0
    Tr�   r~   Nr   )re   r6   r±   F©r‘   )r%   r6   rŒ   r   rž   rQ   rE   r   rã   r®   r‘   r’   rÏ   rÉ   r•   Úexpand_dims)rL   re   rf   rá   rj   r6   rÐ   râ   ÚavgZsqrru   r/   r/   r0   rè   †  s.    



rè   )rL   re   rf   rá   rj   r+   c                C  sn   t | ||||d� t| ||ƒ}t| jƒs2|  d¡} t| j|||| jƒ\}}t | |||d�}t |¡t |¡ S )aÓ  
    Compute the standard error in the mean along given axis while ignoring NaNs

    Parameters
    ----------
    values : ndarray
    axis : int, optional
    skipna : bool, default True
    ddof : int, default 1
        Delta Degrees of Freedom. The divisor used in calculations is N - ddof,
        where N represents the number of elements.
    mask : ndarray[bool], optional
        nan-mask if known

    Returns
    -------
    result : float64
        Unless input is a float array, in which case use the same
        precision as the input array.

    Examples
    --------
    >>> import pandas.core.nanops as nanops
    >>> s = pd.Series([1, np.nan, 2, 3])
    >>> nanops.nansem(s)
     0.5773502691896258
    rå   r~   )re   rf   rá   )	rè   rŒ   r   r6   rž   rã   r®   rQ   rç   )rL   re   rf   rá   rj   rÐ   rÂ   Úvarr/   r/   r0   ÚnansemË  s    &

rï   c              	     s<   t dˆ d�td dd dœddddd	d
œ‡ ‡fdd„ƒƒ}|S )NrE   )rb   Tr¢   rg   rh   r(   r‹   r   r¿   c             
     s    t | |ˆ |d�\} }}}}|d ur0| j| dks:| jdkr~z"t| ˆƒ||d�}| tj¡ W qŒ ttt	fyz   tj}Y qŒ0 nt| ˆƒ|ƒ}t
|||| jƒ}|S )N©r‰   rj   r   rš   )r˜   r®   rm   rw   rÝ   rQ   rE   ry   rP   rS   rÊ   )rL   re   rf   rj   r6   r—   r„   ru   ©r‰   Úmethr/   r0   Ú	reductionþ  s    
ÿ z_nanminmax.<locals>.reduction)ra   r«   )rò   r‰   ró   r/   rñ   r0   Ú
_nanminmaxý  s    û$rô   Úminr…   )r‰   Úmaxú-infÚOzint | np.ndarrayc                C  s6   t | dd|d�\} }}}}|  |¡}t||||ƒ}|S )aé  
    Parameters
    ----------
    values : ndarray
    axis : int, optional
    skipna : bool, default True
    mask : ndarray[bool], optional
        nan-mask if known

    Returns
    -------
    result : int or ndarray[int]
        The index/indices  of max value in specified axis or -1 in the NA case

    Examples
    --------
    >>> import pandas.core.nanops as nanops
    >>> arr = np.array([1, 2, 3, np.nan, 4])
    >>> nanops.nanargmax(arr)
    4

    >>> arr = np.array(range(12), dtype=np.float64).reshape(4, 3)
    >>> arr[2:, 2] = np.nan
    >>> arr
    array([[ 0.,  1.,  2.],
           [ 3.,  4.,  5.],
           [ 6.,  7., nan],
           [ 9., 10., nan]])
    >>> nanops.nanargmax(arr, axis=1)
    array([2, 2, 1, 1])
    Tr÷   rð   )r˜   ZargmaxÚ_maybe_arg_null_out©rL   re   rf   rj   rÂ   ru   r/   r/   r0   Ú	nanargmax  s    '
rû   c                C  s6   t | dd|d�\} }}}}|  |¡}t||||ƒ}|S )aè  
    Parameters
    ----------
    values : ndarray
    axis : int, optional
    skipna : bool, default True
    mask : ndarray[bool], optional
        nan-mask if known

    Returns
    -------
    result : int or ndarray[int]
        The index/indices of min value in specified axis or -1 in the NA case

    Examples
    --------
    >>> import pandas.core.nanops as nanops
    >>> arr = np.array([1, 2, 3, np.nan, 4])
    >>> nanops.nanargmin(arr)
    0

    >>> arr = np.array(range(12), dtype=np.float64).reshape(4, 3)
    >>> arr[2:, 0] = np.nan
    >>> arr
    array([[ 0.,  1.,  2.],
           [ 3.,  4.,  5.],
           [nan,  7.,  8.],
           [nan, 10., 11.]])
    >>> nanops.nanargmin(arr, axis=1)
    array([0, 0, 1, 1])
    Tr…   rð   )r˜   Zargminrù   rú   r/   r/   r0   Ú	nanargminM  s    '
rü   c                C  sÄ  t | dd�} t| ||ƒ}t| jƒs<|  d¡} t| j||ƒ}nt| j||| jd�}|rr|durr|  ¡ } t 	| |d¡ | j
|tjd�| }|duršt ||¡}| | }|r¼|dur¼t 	||d¡ |d }|| }|j
|tjd�}	|j
|tjd�}
t|	ƒ}	t|
ƒ}
tjddd	��4 ||d
 d  |d  |
|	d   }W d  ƒ n1 �sF0    Y  | j}t|ƒ�rn|j|dd�}t|tjƒ�ržt |	dkd|¡}tj||dk < n"|	dk�r¬dn|}|dk �rÀtjS |S )aÎ  
    Compute the sample skewness.

    The statistic computed here is the adjusted Fisher-Pearson standardized
    moment coefficient G1. The algorithm computes this coefficient directly
    from the second and third central moment.

    Parameters
    ----------
    values : ndarray
    axis : int, optional
    skipna : bool, default True
    mask : ndarray[bool], optional
        nan-mask if known

    Returns
    -------
    result : float64
        Unless input is a float array, in which case use the same
        precision as the input array.

    Examples
    --------
    >>> import pandas.core.nanops as nanops
    >>> s = pd.Series([1, np.nan, 1, 2])
    >>> nanops.nanskew(s)
    1.7320508075688787
    Tr�   r~   rš   Nr   r±   rG   ©rI   Údivider¬   g      à?g      ø?Frë   é   )r%   rŒ   r   r6   rž   rÎ   r®   r‘   rQ   r’   rÉ   r•   rì   Ú_zero_out_fperrrR   r€   r�   r“   rE   )rL   re   rf   rj   rÐ   ÚmeanÚadjustedÚ	adjusted2Z	adjusted3Úm2Zm3ru   r6   r/   r/   r0   Únanskew{  sB    '

D

r  c                C  s4  t | dd�} t| ||ƒ}t| jƒs<|  d¡} t| j||ƒ}nt| j||| jd�}|rr|durr|  ¡ } t 	| |d¡ | j
|tjd�| }|duršt ||¡}| | }|r¼|dur¼t 	||d¡ |d }|d }|j
|tjd�}	|j
|tjd�}
tjddd	��` d
|d d  |d |d
   }||d  |d  |
 }|d |d
  |	d  }W d  ƒ n1 �sb0    Y  t|ƒ}t|ƒ}t|tjƒ�s¨|dk �rštjS |dk�r¨dS tjddd	�� || | }W d  ƒ n1 �sÚ0    Y  | j}t|ƒ�r|j|dd�}t|tjƒ�r0t |dkd|¡}tj||dk < |S )aº  
    Compute the sample excess kurtosis

    The statistic computed here is the adjusted Fisher-Pearson standardized
    moment coefficient G2, computed directly from the second and fourth
    central moment.

    Parameters
    ----------
    values : ndarray
    axis : int, optional
    skipna : bool, default True
    mask : ndarray[bool], optional
        nan-mask if known

    Returns
    -------
    result : float64
        Unless input is a float array, in which case use the same
        precision as the input array.

    Examples
    --------
    >>> import pandas.core.nanops as nanops
    >>> s = pd.Series([1, np.nan, 1, 3, 2])
    >>> nanops.nankurt(s)
    -1.2892561983471076
    Tr�   r~   rš   Nr   r±   rG   rý   rÿ   r¬   é   Frë   )r%   rŒ   r   r6   rž   rÎ   r®   r‘   rQ   r’   rÉ   r•   rì   rR   r   r€   r�   rE   r“   )rL   re   rf   rj   rÐ   r  r  r  Z	adjusted4r  Zm4ZadjÚ	numeratorÚdenominatorru   r6   r/   r/   r0   ÚnankurtÓ  sN    '

 8

,
r	  c                C  sF   t | ||ƒ}|r(|dur(|  ¡ } d| |< |  |¡}t|||| j|d�S )aÖ  
    Parameters
    ----------
    values : ndarray[dtype]
    axis : int, optional
    skipna : bool, default True
    min_count: int, default 0
    mask : ndarray[bool], optional
        nan-mask if known

    Returns
    -------
    Dtype
        The product of all elements on a given axis. ( NaNs are treated as 1)

    Examples
    --------
    >>> import pandas.core.nanops as nanops
    >>> s = pd.Series([1, 2, 3, np.nan])
    >>> nanops.nanprod(s)
    6.0
    Nr¬   rÈ   )rŒ   r‘   ÚprodrÊ   r®   )rL   re   rf   ri   rj   ru   r/   r/   r0   r}   4  s     
ÿr}   znp.ndarray | int)ru   re   rj   rf   r+   c                 C  sn   |d u r| S |d u s t | ddƒs@|r2| ¡ r>dS qj| ¡ rjdS n*|rP| |¡}n
| |¡}| ¡ rjd| |< | S )Nr­   Féÿÿÿÿ)rw   rÄ   rM   )ru   re   rj   rf   Zna_maskr/   r/   r0   rù   a  s    
rù   zint | float | np.ndarray)rà   rj   re   r6   r+   c                 C  sz   |du r4|dur |j | ¡  }n
t | ¡}| |¡S |durR|j| | |¡ }n| | }t|ƒrl| |¡S |j|dd�S )a¹  
    Get the count of non-null values along an axis

    Parameters
    ----------
    values_shape : tuple of int
        shape tuple from values ndarray, used if mask is None
    mask : Optional[ndarray[bool]]
        locations in values that should be considered missing
    axis : Optional[int]
        axis to count along
    dtype : type, optional
        type to use for count

    Returns
    -------
    count : scalar or array
    NFrë   )rm   rÉ   rQ   r
  r4   r®   r   rž   )rà   rj   re   r6   ÚnrÐ   r/   r/   r0   rÎ   |  s    


rÎ   znp.ndarray | float | NaTType)ru   re   rj   r®   ri   r+   c                 C  sØ   |durºt | tjƒrº|dur:|j| | |¡ | dk }n8|| | dk }|d|… ||d d…  }t ||¡}t |¡rÔt| ƒr°t | ¡rš|  	d¡} n
|  	d¡} tj
| |< qÔd| |< n| turÔt|||ƒrÔtj
} | S )zu
    Returns
    -------
    Dtype
        The product of all elements on a given axis. ( NaNs are treated as 1)
    Nr   r¬   Zc16r~   )r€   rQ   r�   r®   rÉ   Zbroadcast_torM   r   Ziscomplexobjrž   rE   r   Úcheck_below_min_count)ru   re   rj   r®   ri   Z	null_maskZbelow_countZ	new_shaper/   r/   r0   rÊ   ¥  s"    



rÊ   )r®   rj   ri   r+   c                 C  s:   |dkr6|du rt  | ¡}n|j| ¡  }||k r6dS dS )aÅ  
    Check for the `min_count` keyword. Returns True if below `min_count` (when
    missing value should be returned from the reduction).

    Parameters
    ----------
    shape : tuple
        The shape of the values (`values.shape`).
    mask : ndarray[bool] or None
        Boolean numpy array (typically of same shape as `shape`) or None.
    min_count : int
        Keyword passed through from sum/prod call.

    Returns
    -------
    bool
    r   NTF)rQ   r
  rm   rÉ   )r®   rj   ri   Z	non_nullsr/   r/   r0   r  Ì  s    r  c                 C  st   t | tjƒrRtjdd��( t t | ¡dk d| ¡W  d   ƒ S 1 sF0    Y  nt | ¡dk rl| j d¡S | S d S )NrG   rH   g›+¡†›„=r   )r€   rQ   r�   rR   r“   Úabsr6   r4   )Úargr/   r/   r0   r   ë  s    8r   Úpearson)ÚmethodÚmin_periods)ÚaÚbr  c                C  sp   t | ƒt |ƒkrtdƒ‚|du r$d}t| ƒt|ƒ@ }| ¡ sL| | } || }t | ƒ|k r^tjS t|ƒ}|| |ƒS )z
    a, b: ndarrays
    z'Operands to nancorr must have same sizeNr¬   )rk   ÚAssertionErrorr$   rÄ   rQ   rE   Úget_corr_func)r  r  r  r  ÚvalidrD   r/   r/   r0   Únancorrô  s    r  c                   s|   | dkr$ddl m‰  ‡ fdd„}|S | dkrHddl m‰ ‡fdd„}|S | d	kr\d
d„ }|S t| ƒrh| S td| › d�ƒ‚d S )NZkendallr   ©Ú
kendalltauc                   s   ˆ | |ƒd S ©Nr   r/   ©r  r  r  r/   r0   r¡     s    zget_corr_func.<locals>.funcZspearman©Ú	spearmanrc                   s   ˆ | |ƒd S r  r/   r  r  r/   r0   r¡     s    r  c                 S  s   t  | |¡d S )N©r   r¬   )rQ   Zcorrcoefr  r/   r/   r0   r¡     s    zUnknown method 'z@', expected one of 'kendall', 'spearman', 'pearson', or callable)Zscipy.statsr  r  ÚcallablerS   )r  r¡   r/   )r  r  r0   r    s     
ÿr  )r  rá   )r  r  r  rá   c                C  sr   t | ƒt |ƒkrtdƒ‚|d u r$d}t| ƒt|ƒ@ }| ¡ sL| | } || }t | ƒ|k r^tjS tj| ||d�d S )Nz&Operands to nancov must have same sizer¬   rä   r  )rk   r  r$   rÄ   rQ   rE   Zcov)r  r  r  rá   r  r/   r/   r0   Únancov+  s    r!  c                 C  sH  t | tjƒrºt| ƒst| ƒr*|  tj¡} nŽt| ƒr¸z|  tj¡} W n^ t	t
fy    z|  tj¡} W n6 t
yš } zt	d| › d�ƒ|‚W Y d }~n
d }~0 0 Y n0 t t | ¡¡s¸| j} nŠt| ƒ�sDt| ƒ�sDt| ƒ�sDzt| ƒ} W n^ t	t
f�yB   zt| ƒ} W n8 t
�y< } zt	d| › d�ƒ|‚W Y d }~n
d }~0 0 Y n0 | S )NzCould not convert z to numeric)r€   rQ   r�   r   r   rž   r•   r   Z
complex128rP   rS   rM   ÚimagÚrealr   r   r   rÇ   Úcomplex)r¶   rÛ   r/   r/   r0   rÏ   D  s,    ..rÏ   c                   s   ‡ fdd„}|S )Nc                   s|   t | ƒ}t |ƒ}||B }tjdd�� ˆ | |ƒ}W d   ƒ n1 sD0    Y  | ¡ rxt|ƒrh| d¡}t ||tj¡ |S )NrG   rÍ   rø   )r"   rQ   rR   rM   r   rž   r’   rE   )r¶   ÚyZxmaskZymaskrj   ru   ©Úopr/   r0   rD   e  s    (
zmake_nancomp.<locals>.fr/   )r'  rD   r/   r&  r0   Úmake_nancompd  s    r(  r   )rL   rf   r+   c             	   C  s   t jdt jft jjt j t jft jdt jft jjt jt jfi| \}}| jj	dv �rD| j}t
| ƒ}|  d¡}|t jjk}z*|rˆtj||< ||dd�}	W |r²t||< n|r°t||< 0 |rÀt|	|< n8|t jjkrøt  |¡  ¡ d }
t|
ƒrøt|	d|
d …< t| jt jƒ�r|	 |¡}	n.t|t jƒ�r&|nd}t| ƒj|	 |¡|d	�}	nX|�r�t| jjt jt jfƒ�s�|  ¡ }t
|ƒ}|||< ||dd�}	||	|< n|| dd�}	|	S )
a  
    Cumulative function with skipna support.

    Parameters
    ----------
    values : np.ndarray or ExtensionArray
    accum_func : {np.cumprod, np.maximum.accumulate, np.cumsum, np.minimum.accumulate}
    skipna : bool

    Returns
    -------
    np.ndarray or ExtensionArray
    g      ð?g        r£   rŽ   r   r°   Nræ   rš   )rQ   ZcumprodrE   ÚmaximumÚ
accumulater‡   ZcumsumÚminimumr6   r¦   r"   r�   r
   rˆ   r	   r�   Znonzerork   r€   r4   Z_simple_newrA   r™   Zbool_r‘   )rL   Z
accum_funcrf   Zmask_aZmask_bré   rj   r%  Úchangedru   ZnzZnpdtypeÚvalsr/   r/   r0   Úna_accum_func  sP    üû


þ


ÿ
r.  )T)NN)NNN)N)r¬   )pÚ
__future__r   r[   rJ   ÚoperatorÚtypingr   r   rÓ   ÚnumpyrQ   Zpandas._configr   Zpandas._libsr   r   r   r	   r
   Zpandas._typingr   r   r   r   r   r   r   Zpandas.compat._optionalr   Zpandas.core.dtypes.commonr   r   r   r   r   r   r   r   r   r   r   r   r   r    Zpandas.core.dtypes.dtypesr!   Zpandas.core.dtypes.missingr"   r#   r$   Zpandas.core.constructionr%   rx   r-   r.   r1   r2   ra   rp   rr   rŠ   rŒ   r˜   r†   r    r«   ro   r¾   rÃ   rÅ   r|   r§   rÑ   rÖ   rÚ   r6   r•   rã   rê   rè   rï   rô   ZnanminZnanmaxrû   rü   r  r	  r}   rù   rÎ   rÊ   r  r   r  r  r!  rÏ   r(  ÚgtZnangtÚgeZnangeÚltZnanltÚleZnanleÚeqZnaneqÚneZnanner.  r/   r/   r/   r0   Ú<module>   s  $	@ 8 ÿ/   ûY%"%û1û.ú".û ?J 
û/&Cú1û-û-ûVû_ú +
ü. û'	ÿû 





