U
    Cvfy^                     @  s  d dl mZ d dlmZmZ d dlZd dlZd dlZ	d dlm
Z
mZ d dlmZmZmZmZmZ ejdddd	d
ddZejddejdejdgejejgfddd	dddZeejddejdejdgejejgfdd Zeeejddejdddd Zejdddgdfdd gdfd d gejfddgejffdd  Zejdddgdfdd gejfd d gejfddgdffd!d" Zd#d$ Zejd%d&dgdejgejejgfejd'd dd(gejd)dd*d+ Zejdddgd,fd dgd-fd d gd ffd.d/ Zejdddgd-fd dgd-fdd gd fd d gd ffejd)dd0d1 Zejd2ejd%d&dgdejgejejgfejd)dejd'ddd(gd3d4 Z ejdd-d5gd6fdd gd&fd d gejffd7d8 Z!ejdd9d:d;d9d;d<d:gd=d>d?d@gfd:d:d<d;d;d9d9gdAdBdCdDgffdEdF Z"dGdH Z#dIdJ Z$ejd)ddKdL Z%ejd%ej&ddMdNddOdPd,gdQdRej&ddMdNddOdPejgdSdRej&ejejejgdTejdUdVfejdWdXejd)dejd'dd(gddYddZd	d[d\d]Z'ejj(d^d_ejd%ddMdNddOdPd,gddMdNddOdPejgejejejgfejdWdXejd)dejd`dadbdcdddedfgdgdh Z)didj Z*ejdWdkdldm Z+ejdd-d5gdnfdd gejfd d gejffejd)ddodp Z,dqdr Z-ejdddgdsfdd gd fd d gd fddgd ffdtdu Z.ejdddgd fdd gd fd d gd fddgd ffdvdw Z/ejd2ejd%d&dgdejgfejd)dejd'ddd(gdxdy Z0ejdd-d5gdzfdd gd{fd d gejffd|d} Z1ejdd-d5gd fdd gejfd d gejffd~d Z2dd Z3ejd2ejd%d&dgdejgfejd)dejd'ddd(gdd Z4ejdd-d5ge5dzfdd gd{fd d gejffdd Z6ejdd-d5gd fdd gejfd d gejffdd Z7dd Z8dd Z9dd Z:ejddejddejd)dejddd Z;ejddejdWdejddejd)ddd Z<ejdd dddgdddd-gdfd dddgddd-d,gdfddd-d,gd dddgdfgdddZd	dddZ=ejddejddejddejd)dejddd Z>ejddejddejdddd Z?ejdddd Z@ejddejdddd ZAdS )    )annotations)AnyIterableN)	DataArrayDataset)assert_allcloseassert_equalraise_if_dask_computesrequires_cftimerequires_dask
as_dataset)TFboolNone)r   returnc              	   C  sH   t ddg}| r|jdd}tjtdd |ddg W 5 Q R X d S )N      datanamez`weights` must be a DataArraymatchr   
to_datasetpytestraises
ValueErrorweighted)r   r    r   >/tmp/pip-unpacked-wheel-h316xyqg/xarray/tests/test_weighted.py#test_weighted_non_DataArray_weights   s
    r   weightsr   zlist[float])r   r    r   c              	   C  sH   t ddg}| r|jdd}tjtdd |t | W 5 Q R X d S )Nr   r   r   r   (`weights` cannot contain missing values.r   r   )r   r    r   r   r   r    test_weighted_weights_nan_raises   s
    r"   c              	   C  s~   t ddgddi}| r&|jdd}t |ddi}t  ||}W 5 Q R X tjtdd | 	  W 5 Q R X d S )	Nr   r   dim_0r   r   r!   r   )
r   chunkr   r	   r   r   r   r   sumload)r   r    r   r   r   r   r   %test_weighted_weights_nan_raises_dask*   s    r(   time_chunks)r      resample_spec)1ASZ5ASZ10ASc              	   C  s   dd }t jdddd}t jtjt|dgd|id}t jtjt|dg||d	d}t d
|id| i}t	  |j
|d| W 5 Q R X d S )Nc                 S  s   |  | jdS )Ntime)r   r    mean)dsr   r   r   	mean_funcD   s    z.test_weighted_lazy_resample.<locals>.mean_func2000   r,   )startZperiodsfreqr-   dimscoords)r-   r    r   )r-   )xrZcftime_ranger   nprandomZrandlenr   r%   r	   Zresamplemap)r)   r+   r0   tr    r   r/   r   r   r   test_weighted_lazy_resample<   s    "  r>   )r    expectedr      r$   c                 C  s8   t ddg}t | } ||  }t |}t|| d S Nr   r   r   r   sum_of_weightsr   r    r?   daresultr   r   r   #test_weighted_sum_of_weights_no_nanS   s
    rG   c                 C  s:   t tjdg}t | } ||  }t |}t|| d S Nr   )r   r9   nanr   rC   r   rD   r   r   r    test_weighted_sum_of_weights_nanb   s
    rJ   c                  C  s<   t ddg} t ddg}| | }t d}t|| d S )Nr   r   TrB   )rE   r    rF   r?   r   r   r   !test_weighted_sum_of_weights_boolq   s
    rK   rE         ?factorQ	@skipnac                 C  sD   t | } t| |}| j|d| }| |j|d}t|| d S NrO   )r   r8   	full_liker&   r   r   )rE   rM   rO   r    r?   rF   r   r   r   test_weighted_sum_equal_weights}   s
    rS   r*      c                 C  s8   t ddg}t | } ||  }t |}t|| d S rA   )r   r   r&   r   rD   r   r   r   test_weighted_sum_no_nan   s
    rU   c                 C  sN   t tjdg}t | } || j|d}|r6t |}n
t tj}t|| d S Nr   rQ   )r   r9   rI   r   r&   r   r    r?   rO   rE   rF   r   r   r   test_weighted_sum_nan   s    

rX   errorc                 C  s@   t | } t| |}| j|d}| |j|d}t|| d S rP   )r   r8   rR   r.   r   r   rE   rO   rM   r    r?   rF   r   r   r    test_weighted_mean_equal_weights   s
    r[      g?c                 C  s8   t ddg}t | } t |}||  }t|| d S rA   r   r   r.   r   rD   r   r   r   test_weighted_mean_no_nan   s
    r^         ?g?g333333?皙?gf?gCbԵ@g      @g#g]%@gQ@g%T@gM-N@gqS@c                 C  sX   t dddddddg}dd	d
dg}t | } t |d|id}|| |}t|| d S )Nr   ffffff?皙@r@   皙@ffffff@r*   皙?皙?333333?皙?quantiler7   r   r   ri   r   )r    r?   rE   qrF   r   r   r   test_weighted_quantile_no_nan   s    rm   c                  C  sT   t ddddg} t ddddg}d}| ||}t ddgd}t|| d S )Nr   r   r   r@         ?rk   )rE   r    rl   rF   r?   r   r   r   #test_weighted_quantile_zero_weights   s    ro   c                  C  s   t ddddg} t ddddg}t ddddg}d}t tddg|d|id}t|| || t|| ||d	d
 d S )Nr   r   r   r@   g-C6?rn   ri   rj   gMbP?)Zrtol)r   r9   ri   r   r   r   )rE   wZw_epsrl   r?   r   r   r   test_weighted_quantile_simple   s    rq   c                 C  s   t ddddtjg}t dddddg}ddg}||j|| d}| rdt tddg|d|id	}nt tt|tjd|id	}t|| d S )
Nr   r   r   r@         ?rn   rQ   ri   rj   )r   r9   rI   r   ri   fullr;   r   )rO   rE   rp   rl   rF   r?   r   r   r   test_weighted_quantile_nan  s    rt   ra   rb   rc   rd   Znonan)idZ	singlenanZallnanz/ignore:All-NaN slice encountered:RuntimeWarning)ru   Zmarksrl   )rr   )re   rh   zfloat | tuple[float, ...]float)rE   rl   rO   rM   r   c                 C  sD   t | }t||}|j||d}||j||d}t|| d S rP   r   r8   rR   ri   r   r   )rE   rl   rO   rM   r   r    r?   rF   r   r   r   $test_weighted_quantile_equal_weights  s
    rx   z*`method` argument is not currently exposed)reasonmethodZlinearZinterpolated_inverted_cdfZhazenZweibullZmedian_unbiasedZnormal_unbiased2c                 C  sH   t | } t| d}| j|||d}| |j|||d}t|| d S )NrN   )rO   rz   rw   )rE   rl   rO   rM   rz   r    r?   rF   r   r   r   0test_weighted_quantile_equal_weights_all_methods2  s
    r{   c                  C  sR   t ddg} t ddg}d}t dgd|gid }| ||}t|| d S )Nr   Trr   ri   rj   )r   squeezer   ri   r   )rE   r    rl   r?   rF   r   r   r   test_weighted_quantile_boolT  s    r}   )r$   皙?)rr   r~   ))re   rf   )rg   rh   c              	   C  s   t dddddddg}t| } t|}| jdkr`tjtdd	 |	|
|  W 5 Q R X n*tjtd
d	 |	|
|  W 5 Q R X d S )Nr   ra   rb   r@   rc   rd   r*   z q values must be between 0 and 1r   zq must be a scalar or 1d)r   r9   Zasarrayr8   	ones_likendimr   r   r   r   ri   )rl   rE   r    r   r   r   %test_weighted_quantile_with_invalid_q`  s    


r          @c                 C  sN   t tjdg}t | } |r$t |}n
t tj}|| j|d}t|| d S rV   )r   r9   rI   r   r.   r   rW   r   r   r   test_weighted_mean_nano  s    

r   c                  C  s<   t ddg} t ddg}t d}| | }t|| d S )Nr   Tr]   rE   r    r?   rF   r   r   r   test_weighted_mean_bool  s
    r   gUUUUUU?c                 C  s8   t ddg}t | } ||  }t |}t|| d S rA   )r   r   sum_of_squaresr   rD   r   r   r   #test_weighted_sum_of_squares_no_nan  s
    r   c                 C  s:   t tjdg}t | } ||  }t |}t|| d S rH   )r   r9   rI   r   r   r   rD   r   r   r    test_weighted_sum_of_squares_nan  s
    r   c                 C  s@   t | } t| |}| j|d}| |j|d}t|| d S rP   )r   r8   rR   varr   r   rZ   r   r   r   test_weighted_var_equal_weights  s
    r   gQ?g        c                 C  s8   t ddg}t | } t |}||  }t|| d S rA   r   r   r   r   rD   r   r   r   test_weighted_var_no_nan  s
    r   c                 C  s:   t tjdg}t | } t |}||  }t|| d S rH   )r   r9   rI   r   r   r   rD   r   r   r   test_weighted_var_nan  s
    r   c                  C  s<   t ddg} t ddg}t d}| | }t|| d S Nr   Tr   r   r   r   r   r   test_weighted_var_bool  s
    r   c                 C  s@   t | } t| |}| j|d}| |j|d}t|| d S rP   )r   r8   rR   stdr   r   rZ   r   r   r   test_weighted_std_equal_weights  s
    r   c                 C  s8   t ddg}t | } t |}||  }t|| d S rA   r   r   r   r   rD   r   r   r   test_weighted_std_no_nan  s
    r   c                 C  s:   t tjdg}t | } t |}||  }t|| d S rH   )r   r9   rI   r   r   r   rD   r   r   r   test_weighted_std_nan  s
    r   c                  C  s<   t ddg} t ddg}t d}| | }t|| d S r   r   r   r   r   r   test_weighted_std_bool  s
    r   c                 C  s   | | j ||d}|dkr|S ||  }|j |dd}|dk}||}|dkrX|S || }	|dkrl|	S | |	 }
|
d | j ||d}|dkr|S || }|d	kr|S |d
krt|S dS )z
    Generate expected result using ``*`` and ``sum``. This is checked against
    the result of da.weighted which uses ``dot``
    dimrO   r&   Tr   rC   r.   r   r   r   r   N)r&   whereZnotnullr9   sqrt)rE   r    r   rO   	operationZweighted_sumZmasked_weightsrC   Zvalid_weightsZweighted_meanZdemeanedr   r   r   r   r   expected_weighted  s*    
r   c                 C  s  |  ||}t| |||d}t|| |  |j||d}t| |||d}t|| |  |j||d}t| |||d}t|| |  |j||d}t| |||d}t|| |  |j||d}t| |||d}t|| |  |j||d}t| |||d}t|| d S )NrC   rQ   r&   r.   r   r   r   )	r   rC   r   r   r&   r.   r   r   r   )r   r    r   rO   rF   r?   r   r   r   check_weighted_operationsD  s$    




r   r   )abc)r   r   r   r   r   Nadd_nans)NTFz(ignore:invalid value encountered in sqrtc                 C  s   d}t ddddgddddgddddgd}ttjddd||d}tjddd}|rt|jd }tj| tjj	|j|d	d
< t|||d}t
||| | |jdd}t
||| | d S )Nr   r   r   r   r@   rT   r5   r_   Freplacer   r   )dictr   r9   r:   randnintsizeNaNravelchoicer   r   )r   r   rO   r6   r7   r    r   r   r   r   r   test_weighted_operations_3De  s    &r   )rr   )r`   g?)re   rf   rg   rh   c                 C  s   d}t dddgddddgdddddgd}tddddt}|rtt|jd	 }tj|	 tj
j|j|d
d< t|||d}t|}	||	j|| |d}
|j|| |d}t||
 |jdd}||	j|| |d}t||j d S )Nr   r   r   r   r@   rT   <   r*   r_   Fr   r5   r   r   r   )r   r9   ZarangeZreshapeZastyperv   r   r   r   r   r:   r   r   r8   r   r   ri   r   r   r   )r   rl   r   rO   r6   r7   r   r   rE   r    rF   r?   r/   Zresult2r   r   r   test_weighted_quantile_3D  s    &

r   z@coords_weights, coords_data, expected_value_at_weighted_quantileg      @g?gffffff@zIterable[Any])coords_weightscoords_data#expected_value_at_weighted_quantiler   c           
      C  s   t ddddgdt| dd}t dddd	gdt|dd}t||d
dd d}||j|d
d}t |gd|gid }t|| |jdd}t||d
dd ||j|d
d}	t|	|jdd dS )aW  Check that weighted operations work with unequal coords.


    Parameters
    ----------
    coords_weights : Iterable[Any]
        The coords for the weights.
    coords_data : Iterable[Any]
        The coords for the data.
    expected_value_at_weighted_quantile : float
        The expected value for the quantile of the weighted data.
    rr   rL   r   )r   r5   r   r   r@   rT   r   Nr   )r   ri   rj   r   r   )r   r   r   r   ri   r|   r   r   )
r   r   r   Z
da_weightsZda_datari   Z	da_actualZda_expectedZds_dataZ	ds_actualr   r   r   (test_weighted_operations_nonequal_coords  s$    
   

r   
shape_data))rT   )rT   rT   )rT   rT   rT   shape_weightsc                 C  s   t tjj| }tjj|  }|rLt|jd }tj| tjj|j|dd< t |}t	||d| t	||d | |j
dd}t	||d| t	||d | d S )Nr_   Fr   r#   r   r   )r   r9   r:   r   r   r   r   r   r   r   r   )r   r   r   rO   r    r   r   r   r   r   )test_weighted_operations_different_shapes  s    	r   r   )rC   r&   r.   r   r   r   ri   
keep_attrs)TFNc                 C  s   t tjddtddd}t tjdd}|r>|jdd}tdd|_d|i}| dkrbd	|d
< t||| f |}| dkr|j|r|jni kst	|j|r|jni kst	n0|j|r|jni kst	|j|r|jni kst	d S )Nr   r    attrattrsr   r   r   ri   rr   rl   rC   )
r   r9   r:   r   r   r   r   getattrr   AssertionError)r   r   r   r    r   kwargsrF   r   r   r   "test_weighted_operations_keep_attr  s    r   c                 C  s   t tjdd}t tjddtddd}|jdd}ddi}| d	krRd
|d< t||| f |}|jj	|jj	ks|t
d S )Nr   r   r   r   r   r   r   Tri   rr   rl   )r   r9   r:   r   r   r   r   r   r   r   r   )r   r    r   r   rF   r   r   r   +test_weighted_operations_keep_attr_da_in_ds  s    r   )rC   r&   r.   ri   c              	   C  s   t tjdd}t|}|r,|jdd}ddi}| dkrDd|d< |jj d	}t	j
t|d
 t||| f | W 5 Q R X d S )Nr   r   r   r   Zbad_dimri   rr   rl   z5Weighted does not contain the dimensions: {'bad_dim'}r   )r   r9   r:   r   r8   r   r   	__class____name__r   r   r   r   r   )r   r   r   r    r   	error_msgr   r   r   test_weighted_bad_dim  s    
r   )B
__future__r   typingr   r   Znumpyr9   r   Zxarrayr8   r   r   Zxarray.testsr   r   r	   r
   r   markZparametrizer   rI   r"   r(   r>   rG   rJ   rK   rS   rU   rX   filterwarningsr[   r^   rm   ro   rq   rt   paramrx   skipr{   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s  	

.
.
$  
 *
$ "





 $*
*

 "
 $

 (
 $
'!
%

