U
    /e8                     @   sl  d Z ddlZddlmZ ddlZddlmZ ddl	m
Z
 ddlmZ ddlmZ zddlZW n, ek
r Z zedeW 5 dZ[X Y nX ddlmZ dd	lmZ ed
dZeddZeddZeddZeddZeddZeddZeddZdddddddZdddddddd d!d"d#d$gZeejdBd&dZ eejdCd(dZ!eejdDd)dZ"eejdEd*dZ#eejdFd+dZ$eejdGd,dZ%eejdHd-dZ&eejdId.d Z'eejdJd/d!Z(eejdKd0d"Z)eejd1d# Z*eejdLd2d$Z+eej,ed3Z-eej.ed3Z/d4d5 Z0d6d7 Z1d8d9 Z2d:d; Z3dMd<d=Z4dNd>d?Z5dOd@dAZ6dS )Pzu
Statistical functions and tests, following scipy.stats.

Some differences

- We don't handle missing values at all

    N)
namedtuple)delayed)wrap_elemwise)derived_fromz4`dask.array.stats` requires `scipy` to be installed.)special)distributionsF_onewayResult)Z	statisticZpvalueKurtosistestResultNormaltestResultPower_divergenceResultSkewtestResultTtest_1sampResultTtest_indResultTtest_relResult   g      gUUUUUU?)pearsonzlog-likelihoodzfreeman-tukeyzmod-log-likelihoodZneymanzcressie-read	ttest_indttest_1samp	ttest_rel	chisquarepower_divergenceskewskewtestkurtosiskurtosistest
normaltestf_onewaymomentTc                 C   s   t j| |dd}t j||dd}| j| }|j| }|rLt||||\}}	nt||||\}}	tt | |t |||	|}
ttdd|
 S )Nr   ddof   Znout)	davarshape_equal_var_ttest_denom_unequal_var_ttest_denom_ttest_ind_from_statsmeanr   r   )abaxisZ	equal_varv1v2n1n2dfdenomres r5   4/tmp/pip-unpacked-wheel-dbjnr7gq/dask/array/stats.pyr   X   s    

	propagatec              	   C   s   |dkrt d| j| }|d }t| || }tj| |dd}t|t| }tjddd t	||}	W 5 Q R X t
||	\}	}
ttdd|	|
S 	Nr7   >`nan_policy` other than 'propagate' have not been implemented.r   r    ignoredivideinvalidr"   r#   )NotImplementedErrorr&   r$   r*   r%   sqrtfloatnperrstater<   _ttest_finishr   r   )r+   Zpopmeanr-   
nan_policynr2   dvr3   tprobr5   r5   r6   r   i   s    
c              	   C   s   |dkrt d| j| }t|d }| | tj}tj||dd}t||}t	|t| }	tj
ddd t||	}
W 5 Q R X t||
\}
}ttdd|
|S r8   )r>   r&   r@   ZastyperA   Zfloat64r$   r%   r*   r?   rB   r<   rC   r   r   )r+   r,   r-   rD   rE   r2   rF   rG   dmr3   rH   rI   r5   r5   r6   r   |   s    
c                 C   s   t | |||ddS )Nr   )f_expr!   r-   lambda_)r   )f_obsrK   r!   r-   r5   r5   r6   r      s    c           
      C   s*  t |trH|tkr>ttt dd }td|d| t| }n|d krTd}|d k	r^n| j|dd}|dkr| | d | }n`|dkrd	t| | |  }nD|dkrd	t|||   }n(| | | | d  }|d
| |d   }|j	|d}t
||d}ttjj||d | }	ttdd||	S )Nr   r   zinvalid string for lambda_: z. Valid strings are T)r-   Zkeepdimsr"   r          @      ?r-   r#   )
isinstancestr_power_div_lambda_namesreprlistkeys
ValueErrorr*   _xlogysum_countr   r   chi2sfr   )
rM   rK   r!   r-   rL   namesZtermsstatZnum_obspr5   r5   r6   r      s0    

c           	      C   st   |dkrt d| j| }t| d|}t| d|}|dk}t| ||d  d}|s^t d|jdkrp| S |S )	Nr7   r9   r"      r   g      ?g        bias=False is not implemented.)r>   r&   r   r$   wherendimmin)	r+   r-   biasrD   rE   m2Zm3zerovalsr5   r5   r6   r      s    

c                 C   sL  |dkrt dt| |}t| j| }|dk r@tdt| |t|d |d  d|d    }d	|d d
|  d  |d  |d  |d |d  |d  |d   }dtd|d   }dtdt|  }td|d  }	t	
|dkd|}|t	||	 t	||	 d d   }
ttdd|
dtjt	|
 S )Nr7   r9      zFskewtest is not valid with less than 8 samples; %i samples were given.r   r`         @r"         @   F   rN         	   r   rO   r   r#   )r>   r   r@   r&   rW   intmathr?   logrA   rb   r   r   r   normr\   abs)r+   r-   rD   b2rE   yZbeta2ZW2deltaalphaZr5   r5   r6   r      s:    
&(c              	   C   s   |dkrt d| j| }t| d|}t| d|}|dk}tjdd}	zt|d||d  }
W 5 tjf |	 X |s|t d	|r|
d
 S |
jdkr|
 S |
S d S )Nr7   r9   r"      r   r:   )allrN   ra   r`   )	r>   r&   r   rA   Zseterrr$   rb   rc   rd   )r+   r-   fisherre   rD   rE   rf   Zm4rg   Zolderrrh   r5   r5   r6   r      s&    

c              	   C   s  |dkrt dt| j| }t| |dd}d|d  |d  }d| |d  |d	  |d |d
  |d	  |d   }|| t| }d|| d|  d  |d |d   td|d	  |d  ||d  |d	    }dd| d| tdd|d      }	ddd|	   }
d|td|	d    }t|dk d|}t|dk |
tdd|	  | d}|
| tdd|	   }t|dkd|}|jdkr|d }t	t
dd|dtjt| S )Nr7   r9   F)r}   rk   r   g      8@r"   r`         ?rn   rj   ro   rp   g       @rN   g      @g      "@r   c   gUUUUUU?r5   r#   )r>   r@   r&   r   rA   r?   rb   powerrc   r   r	   r   rt   r\   ru   )r+   r-   rD   rE   rv   EZvarb2xZ	sqrtbeta1AZterm1r3   Zterm2rz   r5   r5   r6   r     s8    6,*&c                 C   s\   |dkrt dt| |\}}t| |\}}|| ||  }ttdd|ttjj|dS )Nr7   r9   r"   r#   )r>   r   r   r   r
   r   r[   r\   )r+   r-   rD   s_kZk2r5   r5   r6   r   A  s    c                  G   s   t | }t| }t |}| }||8 }t|t|t|  }d}| D ] }|t|| tt | 7 }qJ|t|t| 8 }|| }|d }	|| }
|t|	 }|t|
 }|| }t|	|
|}tt	dd||S )Nr   r   r"   r#   )
lenr$   Zconcatenater*   _sum_of_squares_square_of_sumsr@   _fdtrcr   r   )argsZ
num_groupsZalldataZbignoffsetZsstotZssbnr+   ZsswnZdfbnZdfwnZmsbZmswfrI   r5   r5   r6   r   N  s$    
c                 C   s    |dkrt dtj| ||dS )Nr7   r9   rP   )r>   r$   r   )r+   r   r-   rD   r5   r5   r6   r   q  s
    )sourcec                 C   sJ   || d }|d |  |d |  | }t |d| d|   }||fS )NrN   r   r~   )r$   r?   )r.   r0   r/   r1   r2   Zsvarr3   r5   r5   r6   r'     s    r'   c              	   C   s   | | }|| }t jddd2 || d |d |d  |d |d    }W 5 Q R X tt|d|}t|| }||fS )Nr:   r;   r"   r   )rA   rB   r$   rb   isnanr?   )r.   r0   r/   r1   Zvn1Zvn2r2   r3   r5   r5   r6   r(     s    6r(   c              	   C   sD   | | }t jddd t||}W 5 Q R X t||\}}||fS )Nr:   r;   )rA   rB   r$   r<   rC   )Zmean1Zmean2r3   r2   rF   rH   rI   r5   r5   r6   r)     s
    r)   c                 C   s6   t tjjt|| d }|jdkr.|d }||fS )z+Common code between all 3 t-test functions.r"   r   r5   )r   r   rH   r\   r$   absoluterc   )r2   rH   rI   r5   r5   r6   rC     s
    
rC   c                 C   s   |d kr| j S | j| S d S )N)sizer&   )r   r-   r5   r5   r6   rZ     s    rZ   c                 C   s   t | |  |S )a  
    Squares each element of the input array, and returns the sum(s) of that.
    Parameters
    ----------
    a : array_like
        Input array.
    axis : int or None, optional
        Axis along which to calculate. Default is 0. If None, compute over
        the whole array `a`.
    Returns
    -------
    sum_of_squares : ndarray
        The sum along the given axis for (a**2).
    See also
    --------
    _square_of_sums : The square(s) of the sum(s) (the opposite of
    `_sum_of_squares`).
    r$   rY   )r+   r-   r5   r5   r6   r     s    r   c                 C   s   t | |}|| S )a  
    Sums elements of the input array, and returns the square(s) of that sum.
    Parameters
    ----------
    a : array_like
        Input array.
    axis : int or None, optional
        Axis along which to calculate. Default is 0. If None, compute over
        the whole array `a`.
    Returns
    -------
    square_of_sums : float or ndarray
        The square of the sum over `axis`.
    See also
    --------
    _sum_of_squares : The sum of squares (the opposite of `square_of_sums`).
    r   )r+   r-   r   r5   r5   r6   r     s    r   )r   T)r   r7   )r   r7   )Nr   r   )Nr   r   N)r   Tr7   )r   r7   )r   TTr7   )r   r7   )r   r7   )r   r   r7   )N)r   )r   )7__doc__rr   collectionsr   ZnumpyrA   Z
dask.arrayarrayr$   Zdaskr   Zdask.array.ufuncr   Z
dask.utilsr   Zscipy.statsZscipyImportErrorer   r   r   r	   r
   r   r   r   r   r   rS   __all__statsr   r   r   r   r   r   r   r   r   r   r   r   ZxlogyrX   Zfdtrcr   r'   r(   r)   rC   rZ   r   r   r5   r5   r5   r6   <module>   s   








-$
"


