B
    T\7                 @   s&  d Z ddl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 yddlZW n ek
rl   edY nX 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 d
dddddddddddgZeejjd3dd
Zeejjd4ddZeejjd5ddZeejj d6ddZ eejj!d7ddZ!eejj"d8ddZ"eejj#d9ddZ#eejj$d:ddZ$eejj%d;d dZ%eejj&d<d!dZ&eejj'd"d Z'eejj(d=d$dZ(e
ej)Z*e
ej+Z,d%d& Z-d'd( Z.d)d* Z/d+d, Z0d>d-d.Z1d?d/d0Z2d@d1d2Z3dS )Azu
Statistical functions and tests, following scipy.stats.

Some differences

- We don't handle missing values at all

    N)	doc_wraps)wrap_elemwise)delayedz4`dask.array.stats` requires `scipy` to be installed.)distributions)special)Ttest_indResultTtest_1sampResultTtest_relResultPower_divergenceResultNormaltestResultSkewtestResultKurtosistestResultF_onewayResult	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 )N   )ddof   )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denomZres r/   /lib/python3.7/site-packages/dask/array/stats.pyr   =   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 d Q R X t
||	\}	}
ttdd|	|
S )	Nr1   z>`nan_policy` other than 'propagate' have not been implemented.r   )r   ignore)divideinvalidr   )r   )NotImplementedErrorr!   r   r%   r    sqrtfloatnperrstater3   _ttest_finishr   r   )r&   Zpopmeanr(   
nan_policynr-   dvr.   tprobr/   r/   r0   r   N   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 d Q R X t||
\}
}ttdd|
|S )	Nr1   z>`nan_policy` other than 'propagate' have not been implemented.r   )r   r2   )r3   r4   r   )r   )r5   r!   r7   Zastyper8   Zfloat64r   r    r%   r6   r9   r3   r:   r   r	   )r&   r'   r(   r;   r<   r-   r=   r>   Zdmr.   r?   r@   r/   r/   r0   r   `   s    
c             C   s   t | |||ddS )NZpearson)f_expr   r(   lambda_)r   )f_obsrA   r   r(   r/   r/   r0   r   u   s    
c       
      C   s8  t |trV|tjjjkrFtttjjj dd }td	||tjjj| }n|d krbd}|d k	rln| 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   z9invalid string for lambda_: {0!r}.  Valid strings are {1}T)r(   Zkeepdimsr   r   g       @g      ?)r(   )r   )
isinstancestrscipystatsZ_power_div_lambda_namesreprlistkeys
ValueErrorformatr%   _xlogysum_countr   r   chi2sfr
   )
rC   rA   r   r(   rB   namesZtermsstatZnum_obspr/   r/   r0   r   {   s.    

c       	      C   sp   |dkrt d| j| }t| d|}t| d|}|dk}t| ||d  d}|s^t d|jdkrl|S |S )	Nr1   z>`nan_policy` other than 'propagate' have not been implemented.r      r   g      ?g        zbias=False is not implemented.)r5   r!   r   r   wherendim)	r&   r(   biasr;   r<   m2Zm3zerovalsr/   r/   r0   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 )Nr1   z>`nan_policy` other than 'propagate' have not been implemented.   zFskewtest is not valid with less than 8 samples; %i samples were given.r   rV   g      @r   g      @   F   g       @      	   rD   g      ?r   )r   )r5   r   r7   r!   rL   intmathr6   logr8   rW   r   r   r   normrR   abs)r&   r(   r;   b2r<   yZbeta2ZW2ZdeltaZalphaZr/   r/   r0   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 d tjf |	 X |s|t d	|
jdkr|
S |r|
d
 S |
S d S )Nr1   z>`nan_policy` other than 'propagate' have not been implemented.r      r   r2   )allg       @zbias=False is not implemented.rV   )r5   r!   r   r8   Zseterrr   rW   rX   )r&   r(   fisherrY   r;   r<   rZ   Zm4r[   Zolderrr\   r/   r/   r0   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 )Nr1   z>`nan_policy` other than 'propagate' have not been implemented.F)rm   g      @r   g      8@r   rV   g      ?r`   g      @ra   rb   g       @g       @g      @g      "@r   c   gUUUUUU?r/   )r   )r5   r7   r!   r   r8   r6   rW   ZpowerrX   r   r   r   rf   rR   rg   )r&   r(   r;   r<   rh   EZvarb2xZ	sqrtbeta1AZterm1r.   Zterm2rj   r/   r/   r0   r      s&    8<*&c             C   s\   |dkrt dt| |\}}t| |\}}|| ||  }ttdd|ttjj|dS )Nr1   z>`nan_policy` other than 'propagate' have not been implemented.r   )r   )r5   r   r   r   r   r   rQ   rR   )r&   r(   r;   s_kZk2r/   r/   r0   r     s    c              G   s   t | }t| }t |}| }||8 }t|t|t|  }d}x(| D ] }|t|| tt | 7 }qLW |t|t| 8 }|| }|d }	|| }
|t|	 }|t|
 }|| }t|	|
|}tt	dd||S )Nr   r   r   )r   )
lenr   Zconcatenater%   _sum_of_squares_square_of_sumsr7   _fdtrcr   r   )argsZ
num_groupsZalldataZbignoffsetZsstotZssbnr&   ZsswnZdfbnZdfwnZmsbZmswfr@   r/   r/   r0   r   "  s$    

 r   c             C   s    |dkrt dtj| ||dS )Nr1   z>`nan_policy` other than 'propagate' have not been implemented.)r(   )r5   r   r   )r&   r   r(   r;   r/   r/   r0   r   E  s    c             C   sJ   || d }|d |  |d |  | }t |d| d|   }||fS )Ng       @r   g      ?)r   r6   )r)   r+   r*   r,   r-   Zsvarr.   r/   r/   r0   r"   V  s    r"   c          	   C   s   | | }|| }t jddd2 || d |d |d  |d |d    }W d Q R X tt|d|}t|| }||fS )Nr2   )r3   r4   r   r   )r8   r9   r   rW   Zisnanr6   )r)   r+   r*   r,   Zvn1Zvn2r-   r.   r/   r/   r0   r#   ]  s    6r#   c          	   C   sD   | | }t jddd t||}W d Q R X t||\}}||fS )Nr2   )r3   r4   )r8   r9   r   r3   r:   )Zmean1Zmean2r.   r-   r=   r?   r@   r/   r/   r0   r$   j  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   r/   )r   r   r?   rR   r   ZabsoluterX   )r-   r?   r@   r/   r/   r0   r:   t  s
    

r:   c             C   s   |d kr| j S | j| S d S )N)sizer!   )rp   r(   r/   r/   r0   rP     s    rP   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   rO   )r&   r(   r/   r/   r0   rv     s    rv   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   rO   )r&   r(   rr   r/   r/   r0   rw     s    rw   )r   T)r   r1   )r   r1   )Nr   r   )Nr   r   N)r   Tr1   )r   r1   )r   TTr1   )r   r1   )r   r1   )r   r   r1   )N)r   )r   )4__doc__rd   Znumpyr8   Z
dask.arrayZarrayr   Zdask.array.randomr   Zdask.array.ufuncr   Zdaskr   Zscipy.statsrG   ImportErrorr   r   Zscipy.stats.statsr   r   r	   r
   r   r   r   r   __all__rH   r   r   r   r   r   r   r   r   r   r   r   r   ZxlogyrN   Zfdtrcrx   r"   r#   r$   r:   rP   rv   rw   r/   r/   r/   r0   <module>   s`   (	




,




#





