U
    CvfCu                     @  s^  d dl mZ d dlZd dl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 d dl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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) d d	l*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2 e%d
Z3G dd dZ4dd Z5dd Z6dd Z7G dd dZ8dd Z9dd Z:dd Z;dd Z<e+e	j=>de	j=?d
e-rvddgndgd d!d"d#d$Z@e1e	j=?d
ddgd%d& ZAe1e2d'd( ZBe1d)d* ZCd+d, ZDe	j=?d-d.d/ge	j=?d0eEeFejGejHge	j=?d
ddge	j=?d1d2d3d4d5d6ge	j=?d7ddge	j=?d8dd9gd:d; ZIe	j=?d-d.d/ge	j=?d0eEeFejGejHeJge	j=?d<ddge	j=?d
ddge	j=?d1d3d4ge	j=?d7ddge	j=?d8d9d=gd>d? ZKd@dA ZLe	j=?dBe
eMdCeMdDge
eNd.dEeNdDge
dFejge
dGejgej
dHejgeOdIgdJdK ZPe2dLdM ZQe	j=jRe- dNdOe	j=?dPd dQd.ge	j=?dRd.d/gdSdT ZSe	j=?d-d.d/ge	j=?d0eEeFejGejHge	j=?d
ddge	j=?d1d2dUge	j=?d8dd9ge	j=?d<ddge	j=?d7dddgdVdW ZTe	j=?d0eEeFejGejHge	j=?d
ddge	j=?d1d2dUgdXdY ZUe	j=?d
ddge	j=?d1d2dUge	j=?dZdd[d\gd]d^ ZVe	j=?d1d2dUgd_d` ZWe	j=?d0eEeFejGejHge	j=?d
ddge	j=?d7ddge	j=?d1d2dUgdadb ZXe	j=?d
ddgdcdd ZYe1e	j=?d
ddgdedf ZZe1dgdh Z[didj Z\e	j=?dkeNd.dldmgeNd.dndogfdpdq Z]e	j=?dke^d.dldmge^d.dndogfdrds Z_e	j=?dtej`d.dueNd.dle^d.dldvgdwdx Zae	j=?dyddge	j=?d7ddgdzd{ Zbe2e0d|d} ZcdS )~    )annotationsN)arraynan)	DataArrayDatasetcftime_rangeconcat)dtypesduck_array_ops)array_notnull_equivconcatenatecountfirstgradientlastleast_squaresmeannp_timedelta64_to_floatpd_timedelta_to_floatpushpy_timedelta_to_floatstacktimedelta_to_numericwhere)
array_type)assert_allcloseassert_equalassert_identical)	arm_xfailassert_array_equalhas_dask	has_scipyraise_if_dask_computesrequires_bottleneckrequires_cftimerequires_daskdaskc                   @  sd   e Zd Zejdddd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd Zejddd ZdS )TestOpsT)Zautousec                 C  sN   t ttdtgtddtgdddtggtddd	gtd
dtgtdttggg| _d S )N       @      @      @       @g      "@g      $@g      *@g      ,@g      .@g      1@g      2@g      5@)r   r   xself r/   D/tmp/pip-unpacked-wheel-h316xyqg/xarray/tests/test_duck_array_ops.pysetUp/   s     


zTestOps.setUpc              	   C  s  t tdddgtddtgdddtggt dddtgtdd	dggt dddgdd
dggg}tddddddgd| D ]\}}t| j|}t|| qr| jd }t| jddd}t|| | jd }t| jddd}t|| tjtdd t| jd W 5 Q R X d S )N                  	   
            r      Faxisskipna).r   out of boundsmatch   )	r   r   zipr   r,   r   pytestraises
IndexErrorr.   Zexpected_resultsrB   expectedactualr/   r/   r0   
test_first<   s    $"



zTestOps.test_firstc              	   C  s  t tdddgtddtgdddtggt dd	dtgtdddggt d
ddgdddggg}tddd
dddgd
| D ]\}}t| j|}t|| qr| jd }t| jddd}t|| | jd }t| jddd}t|| tjtdd t| jd W 5 Q R X d S )Nr2   r:   r4   r;      r7   r<   r9   r8   r3   r6   r   r=   r>   r?   r@   FrA   ).r@   rD   rE   rG   )	r   r   rH   r   r,   r   rI   rJ   rK   rL   r/   r/   r0   	test_lastQ   s    $"



zTestOps.test_lastc                 C  sX   dt | jksttdddgdddgg}t|t | jdd dt tdksTtd S )N   r=   r3   rG   r@   rB   
2000-01-01)r   r,   AssertionErrorr   r   np
datetime64)r.   rM   r/   r/   r0   
test_countf   s    zTestOps.test_countc                 C  s   t ddgddgddg}t|tjddgtd t ddgtddgtjtj}|jtjks`tt|tjdtjgtjd d S )NTFr=   r3   abdtype)	r   r   rV   r   objectfloat32r   r\   rU   r.   resultr/   r/   r0   test_where_type_promotionn   s
     z!TestOps.test_where_type_promotionc                 C  s(   t ddg}t|tjddgtd d S Nr=   rZ   r[   )r   r   rV   r   r]   r_   r/   r/   r0   test_stack_type_promotionv   s    z!TestOps.test_stack_type_promotionc                 C  s,   t dgdgg}t|tjddgtd d S rb   )r   r   rV   r   r]   r_   r/   r/   r0   test_concatenate_type_promotionz   s    z'TestOps.test_concatenate_type_promotionerrorc                 C  s   t tt jt jgstd S N)rV   isnanr   r   rU   r-   r/   r/   r0   test_all_nan_arrays~   s    zTestOps.test_all_nan_arraysN)__name__
__module____qualname__rI   Zfixturer1   rO   rQ   rX   ra   rc   rd   markfilterwarningsrh   r/   r/   r/   r0   r'   .   s   


r'   c                  C  s   t ddddg} t ddddg}t| }t|| tj| dd}t|| tj| dd}t|| tj| dd}t|| tj| d	d}t| | d S )
Nr   r=   r3   rG   r6   rS   r@   )r   r/   rV   r   r
   Zcumsumr   inputsrM   rN   r/   r/   r0   test_cumsum_1d   s    




rq   c                  C  st   t ddgddgg} t ddgddgg}t| }t|| tj| dd}t|| tj| dd}t| | d S )	Nr=   r3   rG      r9   r   r=   rS   r/   rn   ro   r/   r/   r0   test_cumsum_2d   s    


rt   c                  C  st   t ddgddgg} t ddgddgg}t| }t|| tj| dd}t|| tj| dd}t| | d S )	Nr=   r3   rG   rr      rs   rS   r/   )rV   r   r
   Zcumprodr   ro   r/   r/   r0   test_cumprod_2d   s    


rv   c                   @  s   e Zd Zejdedddgedddgfeddejgedejdgfeejdejgedejejgfgdd Z	dd Z
d	d
 Zejdededededfdddejfddddejfgdd ZdS )TestArrayNotNullEquivz
arr1, arr2r=   r3   rG   c                 C  s   t ||std S rf   )r   rU   )r.   arr1arr2r/   r/   r0   
test_equal   s    	z TestArrayNotNullEquiv.test_equalc                 C  s4   t dddg}t dt jdg}t||r0td S )Nr=   r3   rr   rG   rV   r   r   r   rU   r.   rY   rZ   r/   r/   r0   test_some_not_equal   s    z)TestArrayNotNullEquiv.test_some_not_equalc                 C  sB   t dt jt jdgg}t ddgt jdgg}t||r>td S )Nr=   rr   r3   r{   r|   r/   r/   r0   test_wrong_shape   s    z&TestArrayNotNullEquiv.test_wrong_shapezval1, val2, val3, null2000Z2001Z2002NaT      ?r(         @)foobarbazNr   r   r   c                 C  sP   t |trtnd }tj||||g|d}tj||||g|d}t||sLtd S )Nr[   )
isinstancestrr]   rV   r   r   rU   )r.   Zval1Zval2Zval3nullr\   rx   ry   r/   r/   r0   
test_types   s    z TestArrayNotNullEquiv.test_typesN)ri   rj   rk   rI   rl   parametrizerV   r   r   rz   r}   r~   rW   r   r/   r/   r/   r0   rw      s.   "&
rw   c                 C  s@  t jd}dddgd |  }dd |  }t |t jrJ|j| |}npt |t jrp|jdd|d|}nJt |t j	r|jdd|d|}n$|t
kr|jd	d
ddg|d}nt|r|t|jt|jd }t|j\}}	||}|	|j|< t||dt didd}
|r<tr<dd |D }|
|}
|
S )Nr      r7   rr   )r,   yzr9   )sizer=   rY   rZ   cdg?r,   da)dimscoordsnamec                 S  s   i | ]
}|d qS )rr   r/   ).0r   r/   r/   r0   
<dictcomp>   s      z'construct_dataarray.<locals>.<dictcomp>)rV   randomZRandomStateZ
issubdtypeZfloatingrandnastypeintegerrandintbool_r   choice
ValueErrorranger   intr	   Zmaybe_promoter\   Zflatr   aranger    chunk)dim_numr\   contains_nanr&   rngZshapesr   r   ZindsZ
fill_valuer   chunksr/   r/   r0   construct_dataarray   s,    


r   c                 C  s"   t | tjrt| S t| S d S rf   )r   pdZSeriesr   Zfrom_series)ser/   r/   r0   from_series_or_scalar   s    
r   c           	      K  s   | dddkrd|d< |dks*| jdkrF|  }tt||f |S g }t| j}|| |d }tt	| | D ]&}|
t| jf ||i||f| qv|| jkrt|| | dS t||dS dS )zwconvert DataArray to pd.Series, apply pd.func, then convert back to
    a DataArray. Multiple dims cannot be specified.rC   TNr=   r   dim)getndimZ	to_seriesr   getattrlistr   remover   lenappendseries_reduceiselr   r   )	r   funcr   kwargsr   Zda1r   r   ir/   r/   r0   r     s    

$
r   c                 C  s"   |r| j dkrt| jtstd S )Nr   )r   r   datadask_array_typerU   )r   r&   r/   r/   r0   assert_dask_array  s    r   z,ignore:All-NaN .* encountered:RuntimeWarningFTboolNone)r&   returnc                 C  s,  t tjdddddgdddgd}| r4|ddi}t tjd	dd}t tjddd}| }| rr|jd k	srtt|| |jd
d}| r|jd k	stt|| t|dg  | t|dg jd
d| t|d  |d  t|d jd
d|d  t|d  | t|d jd
d| d S )Nz
2010-01-01r   z
2010-01-03zM8[ns]r[   timer   rG   z
2010-01-02FrC   r=   r   )r   rV   r   r   r   r   rU   r   )r&   r   expectZ
expect_natrN   r/   r/   r0   test_datetime_mean!  s,    

r   c              	   C  s   | rt std tddd}t|dgd}t|jdd}| r^|ddi}|ddi}|jd	d
}t	dd |jd	d

 }W 5 Q R X t||  t|| t|dddd}t	dd |
 }W 5 Q R X t||  t|| t	dd |
 }W 5 Q R X t||  t|| d S )Nrequires daskr   rr   )periodsr   r   r3   Zdim_0r   r   r=   )Zmax_computesi  rR   )r    rI   skipr   r   valuesZreshaper   r   r"   r   r   r   Z	date_type)r&   timesr   Zda_2drM   r`   r/   r/   r0   test_cftime_datetime_meanF  s,    





r   c                  C  sP   t dtddddfdttdfd} | d}| i d}t|| d S )	Nr   z
2021-10-31r9   Dr   freq)r,   )var1Zvar2r,   )r   r   r   r   r   r   r   )dsrM   r`   r/   r/   r0   Ctest_mean_over_non_time_dim_of_dataset_with_dask_backed_cftime_datag  s    
r   c                  C  s  dd l } t| ddddddd| dddddddg| ddddddd| dddddddg| ddddddd| dddddddgg}t|dd	gd
}|d	}t| ddddddd| ddddddd| dddddddgdgd
}t|| d S )Nr   i  rR      i  i  i  r   Zd2r   i  iD  i  )cftimerV   r   ZDatetimeNoLeapr   r   r   )r   r   r   r`   rM   r/   r/   r0   *test_cftime_datetime_mean_long_time_periodw  s.    
r   c                  C  s   t  } dddg| d< dddgdd	gd
dggf| d< ddddgf| d< t| jddd | d  t| jddd | d  t| jddd | d  t| jddd | d  d S )Nr=   r3   rG   pos)r   r   r   r(   r         @r)   r*   r   rr   varr   r   )r   r   r   maxminsum)r   r/   r/   r0   test_empty_axis_dtype  s    r   r   r=   r3   r\   r   r   r   r   r   r   rC   aggdimr,   c                 C  s  |dkr| dk rt d |tjkr6|dkr6t d |rHtsHt d |rj|dkrj|tjfkrjt d |tjkrxd	nd
}t| |d|d}|d krd n||}t	 b t
dd t
dd t
dd |jjdkrv|rvzr|r
ttd| |j|d}	ntt||j|d}	t||||d}
t|
| tjj|
jt|	d	dd W n tttfk
rt   Y nX t||||d}
t| |||d}	t|
|	|d |dkr$t||||dd}	t|
|	|d t||||dd}
|rt|jtstt||||dd}	t|
|	|d nt||||d}	t|
|	|d |dkrzt||||td}
t|
| |
jtksztt| |d|d}t|||d}
|rt|jtstttd| |j}	|
jtkr|
jt|	ks
tntj|
jt|	|ds
tW 5 Q R X d S )Nr   r3   dim not in this testr   znumpy does not support thisr   Fz(dask does not compute object-typed arrayg-C6?gh㈵>Tr   r&   ignorezMean of empty sliceAll-NaN slicezinvalid value encountered inOr   rS   )rC   r   )rtolZ	equal_nan)r   )r   Zstdr   )rC   r   Zddofr5   )r   r   )rC   r   r\   r   )rI   r   rV   r   r    r^   r   Zget_axis_numwarningscatch_warningsrm   r\   kindr   r   r   testingr   r   	TypeErrorAttributeErrorZeroDivisionErrorcomputer   r   r   r   rU   floatr]   Zallclose)r   r\   r&   r   rC   r   r   r   rB   rM   rN   r/   r/   r0   test_reduce  sn    	




   



r   r   r   c           
   	   C  s   |dkr| dk rt d |r,ts,t d |r\|s>t d |r\t|jdkr\t d t| |||d}t l t	d	d
 |j
f |t|d| ||d i}t||||d}	t|t|j|	t|	j W 5 Q R X d S )Nr   r3   r   r   z;numpy's argmin (not nanargmin) does not handle object-dtypeZiufcz4numpy's nanargmin raises ValueError for all nan axisr   r   r   arg)r   rC   )rI   r   r    rV   r\   r   r   r   r   rm   r   r   r   r   Z	drop_varsr   r   )
r   r\   r   r&   r   rC   r   r   rN   rM   r/   r/   r0   test_argmin_max  s(    




r   c               	   C  sB   t dtjddd} tj| d< tt | jdd W 5 Q R X d S )Nr3   TFr   r   r   r   )r   rV   r   r   rI   rJ   r   Zargminr   r/   r/   r0   test_argmin_max_error"  s    
r   r   rT   r   hg        y              ?r   r[   c                 C  s*   t ddg}t| }t j|| d S )NFT)rV   r   r
   isnullr   r   )r   rM   rN   r/   r/   r0   test_isnull)  s    
r   c                  C  sD   t dtjddd} t|  jts&tt|  	 | 	   d S )Nr3   Tr   )
r   rV   r^   r   r   r   r   rU   r   loadr   r/   r/   r0   test_isnull_with_dask9  s    r   zThis is for dask.)reasonrB   r@   
edge_orderc                 C  s   dd l m} ttjddd}ttdd|j|  }|j|dddgd}t	||| |d	}t	||| |d	}t
||jstt|| d S )
Nr   d   r5   (   r=   )r6      r      r:   r7   r   )rB   r   )
dask.arrayr   rV   r   r   expZlinspaceshape
from_arrayr   r   ArrayrU   r   )rB   r   r   r   r,   ZdarrayrM   rN   r/   r/   r0   test_dask_gradient@  s    r  prodc              	   C  sv   |rt std t| |||d}d}t  t|||||d}	W 5 Q R X t|||||d}
t|	|
 t|	| d S )Nr   r   rG   r   rC   	min_count)rC   r   r  )	r    rI   r   r   r"   r   r   r   r   )r   r\   r&   r   r   r   rC   r   r  rN   rM   r/   r/   r0   test_min_countQ  s    

r  c              	   C  s   |rt std d}d}t|| d|d}t   t||dddgd|d}W 5 Q R X t||d	d|d}t|| t|| d S )
Nr   rG   Tr   r,   r   r   r  .)r    rI   r   r   r"   r   r   r   )r\   r&   r   r  r   r   rN   rM   r/   r/   r0   test_min_count_ndh  s    
  
r  r   rY   rZ   c              	   C  sH  | rt std ttjdtjdtj dd}d|d d< d|d d< d|d d< d|d d< | rt|ddd}|rd}td	tjtjgd |d
krdnd
fd}nd}t|dkrdnd}t	  t
|||d|d}W 5 Q R X t||  t|| |d7 }|tj9 }t	  t
|||d|d}W 5 Q R X t||  t|| d S )Nr   )r6   r6   r[   )rY   rZ   r   r3   r   rG   r   rZ   rY   rr   r   r+   g      0@T)rC   r  r=   )r    rI   r   r   rV   ZonesZfloat64r   r   r"   r   r   r   )r&   r   r   r   r  rM   rN   r/   r/   r0   test_min_count_specific  s6    
 



r  c                 C  sb   t dtddd}td|iddid}t|| d	dd
dd }t|d | d	dd
d}t|| d S )Nr3   TF)r\   r   r&   r   Zscalarr   )r   r,   rG   r  )r   r   r   r   r   )r   r   r   rN   rM   r/   r/   r0   test_min_count_dataset  s
    r  c                 C  sb   |rt std td| d|d}t||d|d}tt||d|d|d|d}t|| d S )	Nr   rG   Tr   )r,   r   r   r,   r   )r    rI   r   r   r   r   )r\   r&   rC   r   r   rN   rM   r/   r/   r0   test_multiple_dims  s    
 r	  c              	   C  s  | rt std tjddddj}| r@dd l} | jj|dd}t	  t
j|d	d
}W 5 Q R X dtddd }tj|| |d }t	  t
j||d	d}W 5 Q R X dtddd }tj|| tj}t	  t
j|d	|d}W 5 Q R X dtddd| }tj|| d S )Nr   r   r5   7Dr   r   r@   r   r   datetime_unitru   #      r=   )offsetr     r  r\   )r    rI   r   r   
date_ranger   r   r   r   r"   r
   datetime_to_numericrV   r   r   r   r^   r   )r&   r   r`   rM   r  r\   r/   r/   r0   #test_datetime_to_numeric_datetime64  s8    
    r  c              	   C  s  | rt std tdddddj}| r@dd l} | jj|dd	}t  t	j
|d
td}W 5 Q R X dtddd }tj|| |d }t  t	j
||d
td}W 5 Q R X dtddd }tj|| tj}t  t	j
|d
|d}W 5 Q R X dtddd| }tj|| t B | r<| j|d }nt|d }t	j
||d d
td}W 5 Q R X tdt}tj|| d S )Nr   r   r5   r
  standardr   r   calendarr   r@   r   r   r  ru   r  r  r=   r  r  r\   r  r     )r    rI   r   r   r   r   r   r   r"   r
   r  r   rV   r   r   r   r^   r   Zasarray)r&   r   r`   rM   r  r\   r   r/   r/   r0   test_datetime_to_numeric_cftime  sR    
        r  c                  C  s   dd l } tjddddjd}tdddddj}td	}| d
d
d
}t	j
||dtd}t	j
||dtd}dtddd }tj|| tj|| d S )Nr   r   r5   r
  r   zdatetime64[us]Zproleptic_gregorianr  z
0001-01-01r=   r   r  i$ r  r  )r   r   r  r   r   r   rV   rW   ZDatetimeProlepticGregorianr
   r  r   r   r   r   )r   r   Zcftimesr  Zcfoffsetr`   ZcfresultrM   r/   r/   r0   +test_datetime_to_numeric_potential_overflow  s2       
      r  c                   C  s   t tjddddkstt tjddddks4tt tjddddksNtt tjddd	d
kshtt tjddddkstt tjddddkstt tjddddkstd S )Nr=   daysns  S$Bg    .AZpsgV.KDg )Dusg yE/sCmssg   `4Br   )r   dt	timedeltarU   r/   r/   r/   r0   test_py_timedelta_to_float'  s    r&  ztd, expectedr   r   r  r   c                 C  sL   t | dd}tj|| t|ts(tt t| dd}tj|| d S Nr  r  )r   rV   r   r   r   r   rU   Z
atleast_1dtdrM   outr/   r/   r0   test_np_timedelta64_to_float1  s
    r+  c                 C  s,   t | dd}tj|| t|ts(td S r'  )r   rV   r   r   r   r   rU   r(  r/   r/   r0   test_pd_timedelta_to_float>  s    r,  r)  r  z1 dayc                 C  s*   t | d}tj|d t|ts&td S )Nr  r   )r   rV   r   r   r   r   rU   )r)  r*  r/   r/   r0   test_timedelta_to_numericG  s    
r-  use_daskc                 C  s   | rt rtstd tddgddgddgg}ttdddgdd}| r\|d	di}t||j	|d
\}}tj
|ddg tj
|dg d S )Nzrequires dask and scipyr=   r3   rG   r5   r  )r   r   r   r   g      ?g      ?r(   )r    r!   rI   r   rV   r   r   r   r   r   r   r   )r.  rC   lhsrhsZcoeffsZ	residualsr/   r/   r0   test_least_squaresQ  s    
r1  c                  C  s   dd l } dd l}ttjdddtjtjtjtjddtjdg}dD ]}| j|d|d	}tdd
D ]>}t   t|jj||dd|d	}W 5 Q R X tj	
|| q`t   t|jj|ddd|d	}W 5 Q R X tj	
|| qBd S )Nr   r=   r3   rG   rr   r5   r6   )Nr=   r3   rG   rr   r5      )rB   nr2  r   )r=   r3   rG   r3   r3   r=   r=   )
bottleneckr   rV   r   r   r   r   r"   r   r   r   )r4  r&   r   r3  rM   r   rN   r/   r/   r0   test_push_daskb  s     .$  r5  )d
__future__r   datetimer$  r   ZnumpyrV   Zpandasr   rI   r   r   Zxarrayr   r   r   r   Zxarray.corer	   r
   Zxarray.core.duck_array_opsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zxarray.core.pycompatr   Zxarray.testingr   r   r   Zxarray.testsr   r   r    r!   r"   r#   r$   r%   r   r'   rq   rt   rv   rw   r   r   r   r   rl   rm   r   r   r   r   r   r   r   r   r^   r   r   r   r   r   rW   Ztimedelta64r]   r   r   Zskipifr  r  r  r  r  r	  r  r  r  r&  r+  Z	Timedeltar,  r%  r-  r1  r5  r/   r/   r/   r0   <module>   s   D(U+ 
"
!R


'


 *


	 
 "
