U
    `»{jÃÅ  ã                   @  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 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k	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=dMd–œd—d˜„ƒZ^d™d œdšd›„Z_e8dJdjƒddedœœd'd'd=d=dMd�œ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ÚCallableÚcast)Ú
get_option)ÚNaTÚNaTTypeÚ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/   úQ/var/www/html/bwave/python/venv/lib/python3.8/site-packages/pandas/core/nanops.pyÚset_use_bottleneck@   s    r1   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Údtyper/   r/   r0   Ú	<genexpr>M   s     z$disallow.__init__.<locals>.<genexpr>)ÚsuperÚ__init__Útupler3   )Úselfr3   ©Ú	__class__r/   r0   r9   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�ƒ‚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,   )rB   )r5   rA   )r;   r/   r0   r7   V   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©rC   r;   r/   r0   Ú_fS   s    
ÿ"
zdisallow.__call__.<locals>._f©Ú	functoolsÚwrapsr   r   )r;   rC   rX   r/   rW   r0   Ú__call__R   s    zdisallow.__call__)rM   Ú
__module__Ú__qualname__r9   rB   r\   Ú__classcell__r/   r/   r<   r0   r2   J   s   r2   c                   @  s,   e Zd Zd
ddœdd„Zdddœdd	„ZdS )Úbottleneck_switchNr)   r>   c                 K  s   || _ || _d S r,   )ÚnamerT   )r;   ra   rT   r/   r/   r0   r9   k   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ú
int | Noner(   )rK   rd   re   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Úmaskrd   rc   )ÚlenrT   ÚitemsÚsizeÚgetÚ_na_for_min_countr.   Ú_bn_ok_dtyper6   ÚpopÚ	_has_infs)rK   rd   re   ÚkwdsÚkr*   Úresult©rb   Zbn_funcZbn_namer;   r/   r0   rC   w   s    

z%bottleneck_switch.__call__.<locals>.f)
ra   rM   ÚgetattrÚbnÚAttributeErrorÚ	NameErrorrZ   r[   r   r   )r;   rb   rC   r/   ru   r0   r\   o   s    
ü"'zbottleneck_switch.__call__)N)rM   r]   r^   r9   r\   r/   r/   r/   r0   r`   j   s   r`   r   Ústr)r6   ra   r+   c                 C  s   t | ƒst| ƒs|dkS dS )N)ÚnansumÚnanprodÚnanmeanF)r   r   )r6   ra   r/   r/   r0   ro   ¢   s    ro   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k
rZ   Y dS X d S )NÚf8Zf4ÚKF)Ú
isinstancerP   Úndarrayr6   r
   Zhas_infsZravelÚisinfrL   rO   ÚNotImplementedError)rt   r/   r/   r0   rq   ¶   s    rq   zScalar | None)r6   Ú
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_dtyperP   rD   Úinfr
   Úi8maxr	   )r6   r„   Úfill_value_typr/   r/   r0   Ú_get_fill_valueÃ   s    
rŠ   rf   únpt.NDArray[np.bool_] | None)rK   re   ri   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   r6   r   r   r"   )rK   re   ri   r/   r/   r0   Ú_maybe_get_maskÙ   s    !rŒ   r   z
str | NonezHtuple[np.ndarray, npt.NDArray[np.bool_] | None, np.dtype, np.dtype, Any])rK   re   r„   r‰   ri   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Œ   r6   r   rP   ÚasarrayÚviewr†   rŠ   rL   ÚcopyÚputmaskÚwherer   r   Úint64r   Úfloat64)	rK   re   r„   r‰   ri   r6   ÚdatetimelikeZdtype_okÚ	dtype_maxr/   r/   r0   Ú_get_values  s4    .
  ÿr™   )r6   r+   c                 C  s   t | ƒrdS t| jtjƒ S )NF)r   r@   r4   rP   Úinteger©r6   r/   r/   r0   r†   ^  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rHtj} t| ƒr^t 	dd¡} nt 
| ¡ d¡} | 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   Únszdatetime64[ns]F©r’   zoverflow in timedelta operationúm8[ns])r   r   r	   r€   rP   r�   r"   r�   rD   Z
datetime64r•   r‘   Úastyper   ÚisnanZtimedelta64Úfabsr
   rˆ   rR   )rt   r6   r„   r/   r/   r0   Ú_wrap_resultsd  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©rd   re   ri   rf   rg   r(   r‹   )rK   rd   re   ri   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„   )r6   Úkindr"   r¢   r	   r�   Ú_mask_datetimelike_result)rK   rd   re   ri   rT   Úorig_valuesr—   rt   ©r£   r/   r0   Únew_func“  s    	z&_datetimelike_compat.<locals>.new_funcrY   )r£   r¬   r/   r«   r0   Ú_datetimelike_compat�  s    ûr­   rg   zScalar | np.ndarray)rK   rd   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#   r6   ÚndimÚshaperP   Úfull)rK   rd   r„   Zresult_shaper/   r/   r0   rn   ¯  s    


 rn   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©rd   rf   rg   )rK   rd   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   ri   c                   s(   g | ] }ˆˆ | fd ˆ| iˆ—Ž‘qS ©ri   r/   )r5   Úi)Úarrsr£   rT   ri   r/   r0   Ú
<listcomp>ä  s    z:maybe_operate_rowwise.<locals>.newfunc.<locals>.<listcomp>c                   s   g | ]}ˆ |fˆŽ‘qS r/   r/   )r5   Úx)r£   rT   r/   r0   r·   è  s     rd   )r¯   Úflagsr°   r6   Úobjectr(   Úlistrm   rp   Úrangerj   rP   Úarray)rK   rd   rT   Úresultsr«   )r¶   rT   ri   r0   ÚnewfuncÕ  s*    ÿþýúùø


ÿ
z&maybe_operate_rowwise.<locals>.newfuncrY   )r£   r¿   r/   r«   r0   Úmaybe_operate_rowwiseÎ  s    rÀ   r¤   ©rK   rd   re   ri   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„   ri   )r™   r   rŸ   r(   rL   ©rK   rd   re   ri   Ú_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)rd   re   rh   ri   ÚintÚfloat)rK   rd   re   rh   ri   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›   ©rh   )	r™   r   r   rP   r6   r–   ÚsumÚ_maybe_null_outr°   )
rK   rd   re   rh   ri   r6   r˜   rÄ   Ú	dtype_sumÚthe_sumr/   r/   r0   r{   L  s    "   ÿr{   z+np.ndarray | np.datetime64 | np.timedelta64znpt.NDArray[np.bool_]z5np.ndarray | np.datetime64 | np.timedelta64 | NaTType)rt   rd   ri   rª   r+   c                 C  sR   t | tjƒr4|  d¡ |j¡} |j|d�}t| |< n| ¡ rNt t¡ |j¡S | S )NrŽ   r²   )	r€   rP   r�   rŸ   r‘   r6   rL   r	   r•   )rt   rd   ri   rª   Z	axis_maskr/   r/   r0   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
    --------
    >>> import pandas.core.nanops as nanops
    >>> s = pd.Series([1, 2, np.nan])
    >>> nanops.nanmean(s)
    1.5
    r   rÂ   r¥   r›   Nr¯   FrF   ©rÆ   )r™   rP   r6   r–   r¨   r   r   Ú_get_countsr°   Ú_ensure_numericrË   rv   r   r�   rQ   rL   rD   )rK   rd   re   ri   r6   r˜   rÄ   rÍ   Zdtype_countÚcountrÎ   Zthe_meanZct_maskr/   r/   r0   r}   �  s4    "   ÿ
r}   c          
   
     s  ‡ fdd„}t | ˆ |d�\} }}}}t| jƒs€z|  d¡} W n0 tk
rl } 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 | |¡}	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
    --------
    >>> import pandas.core.nanops as nanops
    >>> s = pd.Series([1, np.nan, 2, 2])
    >>> nanops.nanmedian(s)
    2.0
    c              	     sL   t | ƒ}ˆ s| ¡ stjS t ¡ �  t dd¡ t | | ¡}W 5 Q R X |S )NrF   úAll-NaN slice encountered)r$   rÆ   rP   rD   ÚwarningsÚcatch_warningsÚfilterwarningsÚ	nanmedian)r¸   ri   Úres©re   r/   r0   Ú
get_medianë  s    
znanmedian.<locals>.get_medianr´   r~   Nr®   rF   rÓ   )r™   r   r6   rŸ   rR   rO   rz   rP   rD   rl   r¯   Zapply_along_axisrÔ   rÕ   rÖ   r×   Úget_empty_reduction_resultr°   Zfloat_r¢   )
rK   rd   re   ri   rÚ   r6   rÄ   ÚerrZnotemptyrØ   r/   rÙ   r0   r×   Ò  s(    

 

r×   ztuple[int, ...]znp.dtype | type[np.floating])r°   rd   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›   )rP   r½   Zarangerj   ÚemptyÚfill)r°   rd   r6   r„   ZshpZdimsÚretr/   r/   r0   rÛ     s
    

rÛ   r   z-tuple[float | np.ndarray, float | np.ndarray])Úvalues_shaperi   rd   Ú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   rP   rD   r   r�   rL   r“   )rà   ri   rd   rá   r6   rÒ   Údr/   r/   r0   Ú_get_counts_nanvar8  s    rã   r®   ©rá   ©rd   re   rá   ri   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™   rP   ÚsqrtÚnanvarr¢   )rK   rd   re   rá   ri   Ú
orig_dtyperÄ   rt   r/   r/   r0   Únanstdg  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
    --------
    >>> import pandas.core.nanops as nanops
    >>> s = pd.Series([1, np.nan, 2, 3])
    >>> nanops.nanvar(s)
    1.0
    Tr�   r~   Nr   )rd   r6   r³   Fr�   )r%   r6   rŒ   r   rŸ   rP   rD   r   rã   r°   r’   r“   rÑ   rË   r–   Úexpand_dims)rK   rd   re   rá   ri   r6   rÒ   râ   ÚavgZsqrrt   r/   r/   r0   rè   Ž  s.    



rè   )rK   rd   re   rá   ri   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~   )rd   re   rá   )	rè   rŒ   r   r6   rŸ   rã   r°   rP   rç   )rK   rd   re   rá   ri   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 )NrD   )ra   Tr¤   rf   rg   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‰   ri   r   r›   )r™   r°   rl   rv   rÞ   rP   rD   rx   rO   rR   rÌ   )rK   rd   re   ri   r6   r˜   r„   rt   ©r‰   Úmethr/   r0   Ú	reduction  s    
   ÿ z_nanminmax.<locals>.reduction)r`   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©rK   rd   re   ri   rÄ   rt   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   Ú	nanargminU  s    '
rû   c             	   C  s®  t | dd�} t| ||ƒ}t| jƒs<|  d¡} t| j||ƒ}nt| j||| jd�}|rr|dk	rr|  ¡ } t 	| |d¡ | 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|ƒ�rX|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³   rF   ©rH   Údivider®   g      à?g      ø?Fr�   é   )r%   rŒ   r   r6   rŸ   rÐ   r°   r’   rP   r“   rË   r–   rë   Ú_zero_out_fperrrQ   r€   r�   r”   rD   )rK   rd   re   ri   rÒ   ÚmeanÚadjustedÚ	adjusted2Z	adjusted3Úm2Zm3rt   r6   r/   r/   r0   Únanskewƒ  sB    '

.

r  c             	   C  s  t | dd�} t| ||ƒ}t| jƒs<|  d¡} t| j||ƒ}nt| j||| jd�}|rr|dk	rr|  ¡ } t 	| |d¡ | 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
    --------
    >>> 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³   rF   rü   rþ   r®   é   Fr�   )r%   rŒ   r   r6   rŸ   rÐ   r°   r’   rP   r“   rË   r–   rë   rQ   rÿ   r€   r�   rD   r”   )rK   rd   re   ri   rÒ   r   r  r  Z	adjusted4r  Zm4ZadjÚ	numeratorÚdenominatorrt   r6   r/   r/   r0   ÚnankurtÛ  sN    '

 "


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
    --------
    >>> 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°   )rK   rd   re   rh   ri   rt   r/   r/   r0   r|   <  s     
    ÿr|   znp.ndarray | int)rt   rd   ri   re   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éÿÿÿÿ)rv   rÆ   rL   )rt   rd   ri   re   Zna_maskr/   r/   r0   rø   i  s    
rø   zfloat | np.ndarray)rà   ri   rd   r6   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�   )rl   rË   rP   r	  r4   r°   r   rŸ   )rà   ri   rd   r6   ÚnrÒ   r/   r/   r0   rÐ   „  s    


rÐ   znp.ndarray | float | NaTType)rt   rd   ri   r°   rh   r+   c                 C  sä   |dk	rÆt | tjƒrÆ|dk	r:|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| |< qàd| |< n| tk	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~   Fr�   )r€   rP   r�   r°   rË   Zbroadcast_torL   r   ZiscomplexobjrŸ   r   rD   r   Úcheck_below_min_count)rt   rd   ri   r°   rh   Z	null_maskZbelow_countZ	new_shaper/   r/   r0   rÌ   ­  s$    


rÌ   )r°   ri   rh   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)rP   r	  rl   rË   )r°   ri   rh   Z	non_nullsr/   r/   r0   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 )NrF   rG   g›+¡†›„=r   )r€   rP   r�   rQ   r”   Úabsr6   r4   )Úargr/   r/   r0   rÿ   ó  s    ,rÿ   Úpearson)ÚmethodÚmin_periods)ÚaÚbr  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®   )rj   r�   r$   rÆ   rP   rD   Úget_corr_func)r  r  r  r  ÚvalidrC   r/   r/   r0   Únancorrü  s    r  z)Callable[[np.ndarray, np.ndarray], float]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®   )rP   Zcorrcoefr  r/   r/   r0   r£   &  s    zUnknown method 'z@', expected one of 'kendall', 'spearman', 'pearson', or callable)Zscipy.statsr  r  ÚcallablerR   )r  r£   r/   )r  r  r0   r    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  )rj   r�   r$   rÆ   rP   rD   Zcov)r  r  r  rá   r  r/   r/   r0   Únancov3  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€   rP   r�   r   r   rŸ   r–   r   Z
complex128rO   rR   rL   ÚimagÚrealr   r   r   rÉ   Úcomplex)r¸   rÜ   r/   r/   r0   rÑ   L  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 )NrF   rÏ   r÷   )r"   rP   rQ   rL   r   rŸ   r“   rD   )r¸   ÚyZxmaskZymaskri   rt   ©Úopr/   r0   rC   m  s    
zmake_nancomp.<locals>.fr/   )r%  rC   r/   r$  r0   Úmake_nancompl  s    r&  r   )rK   re   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�r8| j}t
| ƒ}|  d¡}|t jjk}z|rˆtj||< ||dd�}	W 5 |r¤t||< X |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›   )rP   ZcumprodrD   ÚmaximumÚ
accumulater‡   ZcumsumÚminimumr6   r¨   r"   r‘   r	   r
   rˆ   r�   Znonzerorj   r€   r4   Z_simple_newr@   rš   Zbool_r’   )rK   Z
accum_funcre   Zmask_aZmask_bré   ri   r#  Úchangedrt   ZnzZnpdtypeÚvalsr/   r/   r0   Úna_accum_func‡  sV        
üû



 ÿ
r,  )T)NN)NNN)N)r®   )pÚ
__future__r   rZ   rI   ÚoperatorÚtypingr   r   r   rÔ   ÚnumpyrP   Zpandas._configr   Zpandas._libsr   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%   rw   r-   r.   r1   r2   r`   ro   rq   rŠ   rŒ   r™   r†   r¢   r­   rn   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û_ú +
ü. û'	 ÿû 





