U
    ¿mœd³Æ  ã                   @  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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 d dl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  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
l0m1Z1 d dl2m3Z3m4Z4m5Z5 d dl6m7Z7 eddd�Z8e8dk	Z9da:d¯dddœdd„Z;e;edƒƒ G dd„ dƒZ<G dd„ dƒZ=d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,„ZAd±d(dd-d.d)d/d0œd1d2„ZBddd3œd4d5„ZCd²d6d7œd8d9„ZDd:d:d;œd<d=„ZEd(d>d?d@œdAdB„ZFd:d:d;œdCdD„ZGddddEœd(d>dd)ddFœdGdH„ZHddddEœd(d>dd)ddFœdIdJ„ZIe<dKƒeEeGddd ddLœd(d>ddMd)dNdOœdPdQ„ƒƒƒZJdRd>dSd(dTdUœdVdW„ZKe<e1ƒe=ƒ eEddddEœd(d>dd)dNdFœdXdY„ƒƒƒZLe=ƒ ddddEœd>ddZœd[d\„ƒZMd]d^d_d-d(d`œdadb„ZNe OejP¡fdcd)d>dMd6dddeœdfdg„ZQe=dhdi�dddhddjœd>ddMdkœdldm„ƒZRe<dKdnƒe=dhdi�dddhddjœd>ddMdkœdodp„ƒƒZSe<dKdnƒdddhddjœd(d>ddMd)dNdqœdrds„ƒZTdtdu„ ZUeUdvdwdx�ZVeUdydzdx�ZWe<d{ƒddddEœd(d>dd)d|dFœd}d~„ƒZXe<d{ƒddddEœd(d>dd)d|dFœdd€„ƒZYe<dKdnƒeGddddEœd(d>dd)dNdFœd�d‚„ƒƒZZe<dKdnƒeGddddEœd(d>dd)dNdFœdƒd„„ƒƒZ[e<dKdnƒeGddd ddLœd(d>ddMd)dNdOœd…d†„ƒƒZ\d(d>d)dd‡dˆœd‰dŠ„Z]e OejP¡fdcd)d>d6d‹dŒœd�dŽ„Z^d³d�d>d)d]dMd�d�œd‘d’„Z_d]d)dMdd“œd”d•„Z`d–d—„ Zae<dKdnƒd˜dd™œd(d(dšd›dNdœœd�dž„ƒZbdšdŸd œd¡d¢„Zce<dKdnƒddhd£œd(d(d›d›dNd¤œd¥d¦„ƒZdd§d¨„ Zed©dª„ ZfefejgƒZhefejiƒZjefejkƒZlefejmƒZnefejoƒZpefejqƒZrd«dd«d¬œd­d®„ZsdS )´é    )ÚannotationsN)ÚAnyÚCallableÚcast)Ú
get_option)ÚNaTÚNaTTypeÚiNaTÚlib)	Ú	ArrayLikeÚAxisIntÚCorrelationMethodÚDtypeÚDtypeObjÚFÚScalarÚShapeÚnpt)Úimport_optional_dependency)Úfind_stack_level)Ú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-   © r2   úK/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/pandas/core/nanops.pyÚset_use_bottleneckC   s    r4   zcompute.use_bottleneckc                      sB   e Zd Zdddœ‡ fdd„Zddœdd	„Zd
d
dœdd„Z‡  ZS )Údisallowr   r,   )Údtypesr.   c                   s"   t ƒ  ¡  tdd„ |D ƒƒ| _d S )Nc                 s  s   | ]}t |ƒjV  qd S r/   )r#   Útype)Ú.0Údtyper2   r2   r3   Ú	<genexpr>P   s     z$disallow.__init__.<locals>.<genexpr>)ÚsuperÚ__init__Útupler6   )Úselfr6   ©Ú	__class__r2   r3   r<   N   s    
zdisallow.__init__r+   ©r.   c                 C  s   t |dƒot|jj| jƒS )Nr9   )ÚhasattrÚ
issubclassr9   r7   r6   )r>   Úobjr2   r2   r3   ÚcheckR   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�ƒ‚z0tjdd�� ˆ | |ŽW  5 Q R £ W S Q R X W n: t	k
r® } zt
| d	 ƒrœt|ƒ|‚‚ W 5 d }~X Y nX d S )
Nc                 3  s   | ]}ˆ   |¡V  qd S r/   )rE   )r8   rD   )r>   r2   r3   r:   Y   s     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©rF   r>   r2   r3   Ú_fV   s    
ÿ"
zdisallow.__call__.<locals>._f©Ú	functoolsÚwrapsr   r   )r>   rF   r[   r2   rZ   r3   Ú__call__U   s    zdisallow.__call__)rP   Ú
__module__Ú__qualname__r<   rE   r_   Ú__classcell__r2   r2   r?   r3   r5   M   s   r5   c                   @  s,   e Zd Zd
ddœdd„Zdddœdd	„ZdS )Úbottleneck_switchNr,   rA   c                 K  s   || _ || _d S r/   )ÚnamerW   )r>   rd   rW   r2   r2   r3   r<   n   s    zbottleneck_switch.__init__r   )Úaltr.   c              	     sp   ˆj p
ˆ j‰zttˆƒ‰W n ttfk
r6   d ‰Y nX t ˆ ¡d ddœddddœ‡ ‡‡‡fdd„ƒ}tt	|ƒS )	NT©ÚaxisÚskipnaú
np.ndarrayúAxisInt | Noner+   )rN   rg   rh   c                  sê   t ˆjƒdkr2ˆj ¡ D ]\}}||kr|||< q| jdkrT| d¡d krTt| |ƒS trÐ|rÐt| jˆƒrÐ| dd ¡d kr¸| 	dd ¡ ˆ| fd|i|—Ž}t
|ƒrÎˆ | f||dœ|—Ž}qæˆ | f||dœ|—Ž}nˆ | f||dœ|—Ž}|S )Nr   Ú	min_countÚmaskrg   rf   )ÚlenrW   ÚitemsÚsizeÚgetÚ_na_for_min_countr1   Ú_bn_ok_dtyper9   ÚpopÚ	_has_infs)rN   rg   rh   ÚkwdsÚkr-   Úresult©re   Zbn_funcZbn_namer>   r2   r3   rF   z   s    

z%bottleneck_switch.__call__.<locals>.f)
rd   rP   ÚgetattrÚbnÚAttributeErrorÚ	NameErrorr]   r^   r   r   )r>   re   rF   r2   rx   r3   r_   r   s    
ü"'zbottleneck_switch.__call__)N)rP   r`   ra   r<   r_   r2   r2   r2   r3   rc   m   s   rc   r   Ústr)r9   rd   r.   c                 C  s   t | ƒst| ƒs|dkS dS )N)ÚnansumÚnanprodÚnanmeanF)r   r"   )r9   rd   r2   r2   r3   rr   ¥   s    rr   rA   c              	   C  sV   t | tjƒr&| jdkr&t |  d¡¡S zt | ¡ ¡ W S  t	t
fk
rP   Y dS X d S )N)Úf8Zf4ÚKF)Ú
isinstancerS   Úndarrayr9   r
   Zhas_infsZravelÚisinfrO   rR   ÚNotImplementedError)rw   r2   r2   r3   rt   ¹   s    
rt   zScalar | None)r9   Ú
fill_valuec                 C  sP   |dk	r|S t | ƒr:|dk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_dtyperS   rG   Úinfr
   Úi8maxr	   )r9   r‡   Úfill_value_typr2   r2   r3   Ú_get_fill_valueÆ   s    
r�   ri   únpt.NDArray[np.bool_] | None)rN   rh   rl   r.   c                 C  s:   |dk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   r9   r   r"   r%   )rN   rh   rl   r2   r2   r3   Ú_maybe_get_maskÜ   s    !r�   r   z
str | NonezHtuple[np.ndarray, npt.NDArray[np.bool_] | None, np.dtype, np.dtype, Any])rN   rh   r‡   rŒ   rl   r.   c           	      C  sò   t |ƒst‚t| dd�} t| ||ƒ}| j}d}t| jƒrLt |  d¡¡} d}t	|ƒ}t
|||d�}|r®|dk	r®|dk	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    ÚAssertionErrorr(   r�   r9   r"   rS   ZasarrayÚviewr‰   r�   rO   ÚcopyÚputmaskÚwherer   r   Úint64r   Úfloat64)	rN   rh   r‡   rŒ   rl   r9   ÚdatetimelikeZdtype_okÚ	dtype_maxr2   r2   r3   Ú_get_values  s4    .
  ÿr›   )r9   r.   c                 C  s   t | ƒrdS t| jtjƒ S )NF)r"   rC   r7   rS   Úinteger©r9   r2   r2   r3   r‰   a  s    r‰   znp.dtyper�   c                 C  s  | t kr�n t|ƒr’|dkr t}t| tjƒs†t|ƒr<tdƒ‚| |krJtj} t| ƒrft 	dd¡ 
|¡} nt | ¡ |¡} | j
|dd�} n
|  
|¡} nzt|ƒ�rt| tjƒsü| |ksºt | ¡rÌt d¡ 
|¡} n.t | ¡tjkrætdƒ‚nt | ¡j
|dd�} n|  
d¡ |¡} | S )	zwrap our results if neededNzExpected non-null fill_valuer   ÚnsF©r”   zoverflow in timedelta operationúm8[ns])r   r   r	   rƒ   rS   r„   r%   r’   rG   Z
datetime64Úastyper—   r“   r!   ÚisnanZtimedelta64Úfabsr
   r‹   rU   )rw   r9   r‡   r2   r2   r3   Ú_wrap_resultsg  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©rg   rh   rl   ri   rj   r+   rŽ   )rN   rg   rh   rl   c                  sr   | }| j jdk}|r$|d kr$t| ƒ}ˆ | f|||dœ|—Ž}|rnt||j td�}|sn|d k	s`t‚t||||ƒ}|S )N©ÚmÚMr¦   )r‡   )r9   Úkindr%   r¤   r	   r’   Ú_mask_datetimelike_result)rN   rg   rh   rl   rW   Úorig_valuesr™   rw   ©r¥   r2   r3   Únew_func–  s    	z&_datetimelike_compat.<locals>.new_funcr\   )r¥   r®   r2   r­   r3   Ú_datetimelike_compat�  s    ûr¯   rj   zScalar | np.ndarray)rN   rg   r.   c                 C  sl   t | ƒr|  d¡} t| jƒ}| jdkr*|S |dk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&   r9   ÚndimÚshaperS   Úfull)rN   rg   r‡   Zresult_shaper2   r2   r3   rq   ²  s    


 rq   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©rg   ri   rj   )rN   rg   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 k	rŠˆ d¡‰‡ ‡‡‡fdd„t	t
ˆ ƒƒD ƒ}n‡‡fd	d„ˆ D ƒ}t |¡S ˆ| fd
|iˆ—ŽS )Nr°   é   ZC_CONTIGUOUSiè  r   rl   c                   s(   g | ] }ˆˆ | fd ˆ| iˆ—Ž‘qS ©rl   r2   )r8   Úi)Úarrsr¥   rW   rl   r2   r3   Ú
<listcomp>ç  s    z:maybe_operate_rowwise.<locals>.newfunc.<locals>.<listcomp>c                   s   g | ]}ˆ |fˆŽ‘qS r2   r2   )r8   Úx)r¥   rW   r2   r3   r¹   ë  s     rg   )r±   Úflagsr²   r9   Úobjectr+   Úlistrp   rs   Úrangerm   rS   Úarray)rN   rg   rW   Úresultsr­   )r¸   rW   rl   r3   ÚnewfuncØ  s*    ÿþýúùø


ÿ
z&maybe_operate_rowwise.<locals>.newfuncr\   )r¥   rÁ   r2   r­   r3   Úmaybe_operate_rowwiseÑ  s    rÂ   r¦   ©rN   rg   rh   rl   r.   c                C  s^   t | jƒr(| jjdkr(tjdttƒ d� t| |d|d�\} }}}}t| ƒrT|  	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
    --------
    >>> from pandas.core import nanops
    >>> s = pd.Series([1, 2])
    >>> nanops.nanany(s)
    True

    >>> from pandas.core import nanops
    >>> s = pd.Series([np.nan])
    >>> nanops.nanany(s)
    False
    r¨   zz'any' with datetime64 dtypes is deprecated and will raise in a future version. Use (obj != pd.Timestamp(0)).any() instead.©Ú
stacklevelF©r‡   rl   )r"   r9   rª   Úwarningsr)   ÚFutureWarningr   r›   r   r¡   r+   rO   ©rN   rg   rh   rl   Ú_r2   r2   r3   Únananyó  s    "ü
rË   c                C  s^   t | jƒr(| jjdkr(tjdttƒ d� t| |d|d�\} }}}}t| ƒrT|  	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
    --------
    >>> from pandas.core import nanops
    >>> s = pd.Series([1, 2, np.nan])
    >>> nanops.nanall(s)
    True

    >>> from pandas.core import nanops
    >>> s = pd.Series([1, 0])
    >>> nanops.nanall(s)
    False
    r¨   zz'all' with datetime64 dtypes is deprecated and will raise in a future version. Use (obj != pd.Timestamp(0)).all() instead.rÄ   TrÆ   )r"   r9   rª   rÇ   r)   rÈ   r   r›   r   r¡   r+   ÚallrÉ   r2   r2   r3   Únanall*  s    "ü
rÍ   ZM8)rg   rh   rk   rl   ÚintÚfloat)rN   rg   rh   rk   rl   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
    --------
    >>> from pandas.core import nanops
    >>> s = pd.Series([1, 2, np.nan])
    >>> nanops.nansum(s)
    3.0
    r   rÆ   r�   ©rk   )	r›   r   r!   rS   r9   r˜   ÚsumÚ_maybe_null_outr²   )
rN   rg   rh   rk   rl   r9   rš   rÊ   Ú	dtype_sumÚthe_sumr2   r2   r3   r~   a  s    "   ÿr~   z+np.ndarray | np.datetime64 | np.timedelta64znpt.NDArray[np.bool_]z5np.ndarray | np.datetime64 | np.timedelta64 | NaTType)rw   rg   rl   r¬   r.   c                 C  sR   t | tjƒr4|  d¡ |j¡} |j|d�}t| |< n| ¡ rNt t¡ |j¡S | S )Nr‘   r´   )	rƒ   rS   r„   r¡   r“   r9   rO   r	   r—   )rw   rg   rl   r¬   Z	axis_maskr2   r2   r3   r«   ’  s    
r«   c             	   C  s  t | |d|d�\} }}}}|}t tj¡}|jdkrBt tj¡}n&t|ƒrXt tj¡}nt|ƒrh|}|}t| j|||d�}	t	| j
||d�ƒ}
|dk	rèt|
ddƒrèttj|	ƒ}	tjdd	�� |
|	 }W 5 Q R X |	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
    --------
    >>> from pandas.core import nanops
    >>> s = pd.Series([1, 2, np.nan])
    >>> nanops.nanmean(s)
    1.5
    r   rÆ   r§   r�   Nr±   FrI   ©rÌ   )r›   rS   r9   r˜   rª   r   r   Ú_get_countsr²   Ú_ensure_numericrÑ   ry   r   r„   rT   rO   rG   )rN   rg   rh   rl   r9   rš   rÊ   rÓ   Zdtype_countÚcountrÔ   Zthe_meanZct_maskr2   r2   r3   r€   ¥  s4    "   ÿ
r€   rf   c          
   
     s  d
‡ fdd„	}t | ˆ |dd�\} }}}}t| jƒsrz|  d¡} W n0 tk
rp } ztt|ƒƒ|‚W 5 d}~X Y nX |dk	r„tj| |< | j	}| j
dkrú|dk	rú|räˆ s´t ||| ¡}	qøt ¡ �  t dd	t¡ t | |¡}	W 5 Q R X 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
    --------
    >>> from pandas.core import nanops
    >>> s = pd.Series([1, np.nan, 2, 2])
    >>> nanops.nanmedian(s)
    2.0
    Nc              	     s^   |d krt | ƒ}n| }ˆ s*| ¡ s*tjS t ¡ �" t ddt¡ t | | ¡}W 5 Q R X |S )NrI   úAll-NaN slice encountered)	r'   rÌ   rS   rG   rÇ   Úcatch_warningsÚfilterwarningsÚRuntimeWarningÚ	nanmedian)rº   Z_maskÚres©rh   r2   r3   Ú
get_median   s    

  ÿznanmedian.<locals>.get_medianr   )rl   r‡   r�   r°   rI   rÙ   )N)r›   r   r9   r¡   rU   rR   r}   rS   rG   ro   r±   Zapply_along_axisrÇ   rÚ   rÛ   rÜ   rÝ   Úget_empty_reduction_resultr²   Zfloat_r¤   )
rN   rg   rh   rl   rà   r9   rÊ   ÚerrZnotemptyrÞ   r2   rß   r3   rÝ   ç  s0    
 

  ÿrÝ   ztuple[int, ...]r   znp.dtype | type[np.floating])r²   rg   r9   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�   )rS   r¿   Zarangerm   ÚemptyÚfill)r²   rg   r9   r‡   ZshpZdimsÚretr2   r2   r3   rá   8  s
    

rá   r   z-tuple[float | np.ndarray, float | np.ndarray])Úvalues_shaperl   rg   Úddofr9   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Ö   r7   r    rS   rG   r   r„   rO   r•   )ræ   rl   rg   rç   r9   rØ   Údr2   r2   r3   Ú_get_counts_nanvarS  s    ré   r°   ©rç   ©rg   rh   rç   rl   )rg   rh   rç   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
    --------
    >>> from pandas.core import nanops
    >>> s = pd.Series([1, np.nan, 2, 3])
    >>> nanops.nanstd(s)
    1.0
    zM8[ns]r    r¶   rë   )r9   r“   r›   rS   ÚsqrtÚnanvarr¤   )rN   rg   rh   rç   rl   Z
orig_dtyperÊ   rw   r2   r2   r3   Únanstd‚  s    $

rî   Zm8c                C  s  t | dd�} | j}t| ||ƒ}t|ƒrB|  d¡} |dk	rBtj| |< t| jƒrft| j	|||| jƒ\}}nt| j	|||ƒ\}}|rœ|dk	rœ|  
¡ } t | |d¡ t| j|tjd�ƒ| }|dk	rÈt ||¡}t||  d ƒ}	|dk	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
    --------
    >>> from pandas.core import nanops
    >>> s = pd.Series([1, np.nan, 2, 3])
    >>> nanops.nanvar(s)
    1.0
    Tr�   r�   Nr   )rg   r9   rµ   FrŸ   )r(   r9   r�   r   r¡   rS   rG   r   ré   r²   r”   r•   r×   rÑ   r˜   Úexpand_dims)rN   rg   rh   rç   rl   r9   rØ   rè   ÚavgZsqrrw   r2   r2   r3   rí   °  s.    %



rí   )rN   rg   rh   rç   rl   r.   c                C  sŠ   t | ||||d� t| ||ƒ}t| jƒs2|  d¡} |sL|dk	rL| ¡ rLtjS 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
    --------
    >>> from pandas.core import nanops
    >>> s = pd.Series([1, np.nan, 2, 3])
    >>> nanops.nansem(s)
     0.5773502691896258
    rë   r�   N)rí   r�   r   r9   r¡   rO   rS   rG   ré   r²   rì   )rN   rg   rh   rç   rl   rØ   rÊ   Úvarr2   r2   r3   Únansemü  s    &

rò   c              	     s>   t dˆ› �d�td dd dœddddd	d
œ‡ ‡fdd„ƒƒ}|S )NrG   )rd   Tr¦   ri   rj   r+   rŽ   r   rÃ   c             
     s¢   t | |ˆ |d�\} }}}}|d k	r0| j| dks:| jdkr€z"t| ˆƒ||d�}| tj¡ W qŽ ttt	fk
r|   tj}Y qŽX nt| ˆƒ|ƒ}t
|||| jƒ}|S )N©rŒ   rl   r   r�   )r›   r²   ro   ry   rä   rS   rG   r{   rR   rU   rÒ   )rN   rg   rh   rl   r9   rš   r‡   rw   ©rŒ   Úmethr2   r3   Ú	reduction2  s    	   ÿ z_nanminmax.<locals>.reduction)rc   r¯   )rõ   rŒ   rö   r2   rô   r3   Ú
_nanminmax1  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
    --------
    >>> from pandas.core import 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©rN   rg   rh   rl   rÊ   rw   r2   r2   r3   Ú	nanargmaxR  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
    --------
    >>> from pandas.core import 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ý   r2   r2   r3   Ú	nanargmin€  s    '
rÿ   c             	   C  sÊ  t | dd�} t| ||ƒ}t| jƒs<|  d¡} t| j||ƒ}nt| j||| jd�}|rt|dk	rt|  ¡ } t 	| |d¡ n|sŽ|dk	rŽ| 
¡ rŽtjS | j|tjd�| }|dk	r¶t ||¡}| | }|rØ|dk	rØt 	||d¡ |d }|| }|j|tjd�}	|j|tjd�}
t|	ƒ}	t|
ƒ}
tjddd	��* ||d
 d  |d  |
|	d   }W 5 Q R X | j}t|ƒ�rt|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
    --------
    >>> from pandas.core import nanops
    >>> s = pd.Series([1, np.nan, 1, 2])
    >>> nanops.nanskew(s)
    1.7320508075688787
    Tr�   r�   r�   Nr   rµ   rI   ©rK   Údivider°   g      à?g      ø?FrŸ   é   )r(   r�   r   r9   r¡   rÖ   r²   r”   rS   r•   rO   rG   rÑ   r˜   rï   Ú_zero_out_fperrrT   rƒ   r„   r–   )rN   rg   rh   rl   rØ   ÚmeanÚadjustedÚ	adjusted2Z	adjusted3Úm2Zm3rw   r9   r2   r2   r3   Únanskew®  sF    '

.

r  c             	   C  s$  t | dd�} t| ||ƒ}t| jƒs<|  d¡} t| j||ƒ}nt| j||| jd�}|rt|dk	rt|  ¡ } t 	| |d¡ n|sŽ|dk	rŽ| 
¡ rŽtjS | j|tjd�| }|dk	r¶t ||¡}| | }|rØ|dk	rØt 	||d¡ |d }|d }|j|tjd�}	|j|tjd�}
tjddd	��V d
|d d  |d |d
   }||d  |d  |
 }|d |d
  |	d  }W 5 Q R X t|ƒ}t|ƒ}t|tjƒ�s®|dk �r tjS |dk�r®dS tjddd	�� || | }W 5 Q R X | j}t|ƒ�rò|j|dd�}t|tjƒ�r t |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
    --------
    >>> from pandas.core import nanops
    >>> s = pd.Series([1, np.nan, 1, 3, 2])
    >>> nanops.nankurt(s)
    -1.2892561983471076
    Tr�   r�   r�   Nr   rµ   rI   r   r  r°   é   FrŸ   )r(   r�   r   r9   r¡   rÖ   r²   r”   rS   r•   rO   rG   rÑ   r˜   rï   rT   r  rƒ   r„   r–   )rN   rg   rh   rl   rØ   r  r  r  Z	adjusted4r  Zm4ZadjÚ	numeratorÚdenominatorrw   r9   r2   r2   r3   Únankurt  sR    '

 "


r  c                C  sF   t | ||ƒ}|r(|dk	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
    --------
    >>> from pandas.core import nanops
    >>> s = pd.Series([1, 2, 3, np.nan])
    >>> nanops.nanprod(s)
    6.0
    Nr°   rÐ   )r�   r”   ÚprodrÒ   r²   )rN   rg   rh   rk   rl   rw   r2   r2   r3   r   k  s     
    ÿr   znp.ndarray | int)rw   rg   rl   rh   r.   c                 C  sn   |d kr| S |d ks t | ddƒs@|r2| ¡ r>dS qj| ¡ rjdS n*|rP| |¡}n
| |¡}| ¡ rjd| |< | S )Nr±   Féÿÿÿÿ)ry   rÌ   rO   )rw   rg   rl   rh   Zna_maskr2   r2   r3   rü   ˜  s    
rü   zfloat | np.ndarray)ræ   rl   rg   r9   r.   c                 C  sz   |dkr4|dk	r |j | ¡  }n
t | ¡}| |¡S |dk	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Ÿ   )ro   rÑ   rS   r  r7   r²   r    r¡   )ræ   rl   rg   r9   ÚnrØ   r2   r2   r3   rÖ   ³  s    


rÖ   znp.ndarray | float | NaTType)rw   rg   rl   r²   rk   r.   c           	      C  s  |dkr|dkr| S |dk	rÚt | tjƒrÚ|dk	rN|j| | |¡ | dk }n8|| | dk }|d|… ||d d…  }t ||¡}t |¡rØt| ƒrÐt | ¡r®|  	d¡} nt
| ƒsÄ| j	ddd�} tj| |< nd| |< n@| tk	�rt|||ƒ�rt| ddƒ}t
|ƒ�r| d	¡} ntj} | S )
zu
    Returns
    -------
    Dtype
        The product of all elements on a given axis. ( NaNs are treated as 1)
    Nr   r°   Zc16r�   FrŸ   r9   rG   )rƒ   rS   r„   r²   rÑ   Zbroadcast_torO   r   Ziscomplexobjr¡   r   rG   r   Úcheck_below_min_country   r7   )	rw   rg   rl   r²   rk   Z	null_maskZbelow_countZ	new_shapeZresult_dtyper2   r2   r3   rÒ   Ü  s.    




rÒ   )r²   rl   rk   r.   c                 C  s:   |dkr6|dk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)rS   r  ro   rÑ   )r²   rl   rk   Z	non_nullsr2   r2   r3   r    s    r  c              
   C  sh   t | tjƒrFtjdd��& t t | ¡dk d| ¡W  5 Q R £ S Q R X nt | ¡dk r`| j d¡S | S d S )NrI   rJ   g›+¡†›„=r   )rƒ   rS   r„   rT   r–   Úabsr9   r7   )Úargr2   r2   r3   r  +  s    ,r  Úpearson)ÚmethodÚmin_periodsr   z
int | None)ÚaÚbr  r  r.   c                C  sp   t | ƒt |ƒkrtdƒ‚|dk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°   )rm   r’   r'   rÌ   rS   rG   Úget_corr_func)r  r  r  r  ÚvalidrF   r2   r2   r3   Únancorr4  s    r  z)Callable[[np.ndarray, np.ndarray], float])r  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   r2   ©r  r  r  r2   r3   r¥   W  s    zget_corr_func.<locals>.funcZspearman©Ú	spearmanrc                   s   ˆ | |ƒd S r  r2   r  r  r2   r3   r¥   ^  s    r  c                 S  s   t  | |¡d S )N©r   r°   )rS   Zcorrcoefr  r2   r2   r3   r¥   d  s    zUnknown method 'z@', expected one of 'kendall', 'spearman', 'pearson', or callable)Zscipy.statsr  r   ÚcallablerU   )r  r¥   r2   )r  r   r3   r  Q  s     
ÿr  )r  rç   )r  r  r  rç   r.   c                C  sr   t | ƒt |ƒkrtdƒ‚|d k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!  )rm   r’   r'   rÌ   rS   rG   Zcov)r  r  r  rç   r  r2   r2   r3   Únancovq  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k
r    z|  tj¡} W n4 t
k
rš } zt	d| › d�ƒ|‚W 5 d }~X Y nX Y nX t t | ¡¡s¸| j} nŠt| ƒ�sDt| ƒ�sDt| ƒ�sDzt| ƒ} W n^ t	t
fk
�rB   zt| ƒ} W n6 t
k
�r< } zt	d| › d�ƒ|‚W 5 d }~X Y nX Y nX | S )NzCould not convert z to numeric)rƒ   rS   r„   r   r   r¡   r˜   r   Z
complex128rR   rU   rO   ÚimagÚrealr   r   r   rÏ   Úcomplex)rº   râ   r2   r2   r3   r×   Š  s,    **r×   c                   s   ‡ fdd„}|S )Nc              	     sh   t | ƒ}t |ƒ}||B }tjdd�� ˆ | |ƒ}W 5 Q R X | ¡ rdt|ƒrT| d¡}t ||tj¡ |S )NrI   rÕ   rû   )r%   rS   rT   rO   r   r¡   r•   rG   )rº   ÚyZxmaskZymaskrl   rw   ©Úopr2   r3   rF   «  s    
zmake_nancomp.<locals>.fr2   )r)  rF   r2   r(  r3   Úmake_nancompª  s    r*  r   )rN   rh   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ksVt
‚|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´   )rS   ZcumprodrG   ÚmaximumÚ
accumulaterŠ   ZcumsumÚminimumr9   rª   r’   rC   r7   rœ   Zbool_r”   r%   )rN   Z
accum_funcrh   Zmask_aZmask_bÚvalsrl   rw   r2   r2   r3   Úna_accum_funcÅ  s(        
üû
r/  )T)NN)NNN)N)r°   )tÚ
__future__r   r]   rL   ÚoperatorÚtypingr   r   r   rÇ   ÚnumpyrS   Zpandas._configr   Zpandas._libsr   r   r	   r
   Zpandas._typingr   r   r   r   r   r   r   r   r   Zpandas.compat._optionalr   Zpandas.util._exceptionsr   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(   rz   r0   r1   r4   r5   rc   rr   rt   r�   r�   r›   r‰   r¤   r¯   rq   rÂ   rË   rÍ   r~   r«   r€   rÝ   rá   r9   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/  r2   r2   r2   r3   Ú<module>   s  ,@ 8   ÿ/   ûY)"%û:û7ú".û ?P 
û/ú-úJú4û-û-ûXûaú +
ü. û0	û û 





