U
    CvfO[                     @  sb  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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 edZejdd Zejd	d
 Zejdd Z dddZ!edd Z"eej#$ddddddgdd Z%edd Z&edd Z'edd  Z(d!d" Z)d#d$ Z*d%d& Z+d'd( Z,d)d* Z-ed+d, Z.d-d. Z/d/d0 Z0eej#$d1d2d3 d4D d5d6 Z1ed7d8 Z2ed9d: Z3ed;d< Z4d=d> Z5ed?d@ Z6edAdB Z7eeej#$dCe8dDfe8dEfgdFdG Z9edHdI Z:dJdK Z;edLdM Z<dNdO Z=edPdQ Z>eeej#$ddRdSgdTdU Z?edVdW Z@edXdY ZAedZd[ ZBed\d] ZCd^d_ ZDed`da ZEedbdc ZFeej#$ddeGdedfdfdfd dfdfd dgdgg	ggeGdedf dededed deded dhdhg	ggd dgdidhdjdkdldmdng	dhdhdhd dodod dodog	gggdpdq ZHeej#$dredsdt ZIeej#$dueJdvdwgdxdydzgd{d| ZKed}d~ ZLej#$dd dgdgd ddgfdd ZMejdd ZNdd ZOeej#$dejPejQe	jRedgej#$ddd dd gej#$ddeSdfdeTdgdd ZUeej#$dejQdej#V deGdoeGddgdd ZWedd ZXdS )    )annotationsN)NumpyInterpolatorScipyInterpolatorSplineInterpolator_get_nan_block_lengthsget_clean_interp_index)
array_type)	_CFTIME_CALENDARSassert_allcloseassert_array_equalassert_equalraise_if_dask_computesrequires_bottleneckrequires_cftimerequires_daskrequires_scipyZdaskc                   C  s*   t jdtjddtjdddtjddgd	d
S )Nr                        timedimsxr	DataArraynpnan r!   r!   =/tmp/pip-unpacked-wheel-h316xyqg/xarray/tests/test_missing.pyda!   s    r#   c                  C  s   ddd} | S )N1Dc                 S  s0   t jd|d| d}td}t j|dd|idS )Nz
1970-01-01
   )startfreqperiodscalendarr   r   r   coords)r   cftime_ranger   aranger   )r)   r'   timesvaluesr!   r!   r"   _cf_da(   s       
zcf_da.<locals>._cf_da)r$   r!   )r1   r!   r!   r"   cf_da&   s    
r2   c                  C  sh   t  } t jdtjddtjdddtjddgd	d
| d< t jdtjddtjdddtjddgdd
| d< | S )Nr   r   r   r   r   r   r   r   r   r   var1r%                        xvar2)r   ZDatasetr   r   r    dsr!   r!   r"   r>   2   s     
 
r>   90  Fc                 C  s  t j|}|j| d}|dkr0t j|d d < nv|dkr:nlt|j| }t | d }t | d }|rt j| |d | }t j| |d | }t j|||f< |rt	j
d|j| d ddd}	dt	d	|	  i}
ndt	jd	d
| d di}
tj|d|
d}| }||fS )N)sizer   r   dr%   )r@   Zscale)unitdatar   z
2000-01-01Dr'   r(   r   r;   r+   )r   randomZRandomStatenormalr    intr@   r.   shufflepdZTimedeltaIndexZ	TimestampZsort_values
date_ranger   r   Z	to_pandas)shapefrac_nanseednon_uniformrsvalsZ	n_missingZysxsZdeltasr,   r#   dfr!   r!   r"   make_interpolate_example_data>   s,    rU   c                  C  s   ddddg} dddg}dd	d
dddg}t | ||D ]x\}}}t||\}}dD ]Z}|j||tjd}	|j|||tjtjfd}
tj|
jt	
|	j< tj|	j|
j qPq4d S )N   rW   r      rY   r   d   r\   r         ?r   linearnearestzeroslinear	quadraticcubicrF   )methoddim
fill_valuerd   axisrf   	itertoolsproductrU   interpolate_nar   r    interpolateget_axis_numr0   rK   isnulltestingr
   shapes	frac_nansmethodsrM   rN   rd   r#   rT   re   actualexpectedr!   r!   r"   test_interpolate_pd_compat_   s    
  
rw   rd   ZbarycentricZkrogZpchipsplineZakimac                 C  s@   t dddd\}}|j| dd}|d|dk s<td S )N)   ry   g?TrP   r   )rd   re   )rU   rl   countallAssertionError)rd   r#   _ru   r!   r!   r"   test_scipy_methods_functionw   s    r   c                  C  s   ddddg} dddg}dd	d
g}t | ||D ]\}}}t||dd\}}dD ]h}|dkrd|dkrdqN|jd|dtjd}	|j|||tjd}
tj|
jt	
|	j< tj|	j|
j qNq.d S )NrV   rX   rZ   r[   r   r]   r   r   indexr0   Trz   rF   r^   )rd   re   use_coordinaterf   rg   ri   rq   r!   r!   r"   ,test_interpolate_pd_compat_non_uniform_index   s*    

     r   c                  C  s   ddddg} dddg}ddd	g}t | ||D ]\\}}}t||\}}d
D ]>}|jd||dd}	|jd|||d}
tj|	j	|
j	 qJq.d S )NrV   rX   rZ   r[   r   r]   r   r   r   rF   
polynomialF)rd   orderre   r   )rd   r   rh   )
rj   rk   rU   rl   rm   rn   r   rp   r
   r0   )rr   rs   ZordersrM   rN   r   r#   rT   re   ru   rv   r!   r!   r"   %test_interpolate_pd_compat_polynomial   s$    

     r   c               	   C  s\   t jdddgt jd} tj| dddddgid}tjtdd |jdd	d
 W 5 Q R X d S )Nr   r   r   dtyper;   r+   z*Index 'x' must be monotonically increasingmatchr   re   rd   )	r   arrayfloat64r   r   pytestraises
ValueErrorrl   )rR   rv   r!   r!   r"   &test_interpolate_unsorted_index_raises   s    r   c               	   C  sN   t jtjddtjdgtjddd} tjtdd | j	d	d
 W 5 Q R X d S )Nr   r   r   r   r;   r   zdim is a required argumentr   r^   rd   )
r   r   r   r   r    r   r   r   NotImplementedErrorrl   r#   r!   r!   r"   test_interpolate_no_dim_raises   s    $r   c               	   C  sP   t jtjddtjdgtjddd} tjtdd | j	dd	d
 W 5 Q R X d S )Nr   r   r   r   r;   r   znot a validr   foor   )
r   r   r   r   r    r   r   r   r   rl   r   r!   r!   r"   ,test_interpolate_invalid_interpolator_raises   s    $r   c               	   C  s^   t jdd} tj| dddgfddddgfgd}tjtd	d
 |jddd W 5 Q R X d S )Nr   r   r;   ayr   r   r,   zIndex 'x' has duplicate valuesr   r   r   )	r   rG   randnr   r   r   r   r   rl   )rC   r#   r!   r!   r"   (test_interpolate_duplicate_values_raises   s    $r   c               	   C  sr   t jdd} t j| d< tj| dddgfddd	dgfgd
}|jdd}tjt	dd |j
dd W 5 Q R X d S )Nr   r   r   r   r;   r   br   r   r   r   r;   r   )zz%Index 'z' must be castable to float64r   r   re   )r   rG   r   r    r   r   stackr   r   	TypeErrorrl   )rC   r#   Zdasr!   r!   r"   "test_interpolate_multiindex_raises   s    
$r   c               	   C  s   t dtdddt dtdddd d} tjdd}tj|d< t j|d| d}t	j
tdd	 |jd
dd W 5 Q R X d S )N)r   r   r   r   r   r   r   r+   zinterpolation must be 1Dr   r   r;   re   r   )r   Variabler   r.   ZreshaperG   r   r    r   r   r   r   rl   )r,   rC   r#   r!   r!   r"    test_interpolate_2d_coord_raises   s    
r   c                  C  s   t jtjddtjgtjddd} t jtjdddgtjddd}| jddd}t|| t jtjddd	gtjddd}| jdd	d}t|| d S )
Nr   r   r   r;   r   r   Zextrapolate)re   rf   i)r   r   r   r   r    r   rl   r   r#   rv   ru   r!   r!   r"   test_interpolate_kwargs   s    " 
 r   c                  C  sj   t jddddddgt jd} |  }t j|d< tj|dd	}d
di|_|jddd}|jd
diksft	d S )Nr   r   r   r   r   r   r   r;   r   testvalueT)re   Z
keep_attrs)
r   r   r   copyr    r   r   attrsrl   r}   )rR   mvalsmissingru   r!   r!   r"   test_interpolate_keep_attrs   s    

r   c                  C  sd   t jddddddgt jd} tj| dd	}|  }t j|d< tj|dd	}|jdd
}t|| d S Nr   r   r   r   r   r   r   r;   r   r   )	r   r   r   r   r   r   r    rl   r   )rR   rv   r   r   ru   r!   r!   r"   test_interpolate   s    
r   zmethod,valsc              
   C  s   g | ]|}d t jddddddgt jdfdt jdt jt jgt jdfd	t jdt jt jdffD ]"\}}tj||| d
| dq\qS )zno nansr   r   r   r   r   r   r   zone nanzall nans:)id)r   r   r   r    fullr   param).0rd   descrR   r!   r!   r"   
<listcomp>	  s   
 r   )r^   r_   r`   ra   rb   rc   r   c                 C  s*   t j|dd}|jd| d}t|| d S )Nr;   r   r   )r   r   rl   r   )rd   rR   rv   ru   r!   r!   r"   test_interp1d_fastrack  s    r   c                  C  s   t jtjddtjtjtjdgtjddd} | jdd d}|  dksNt	| jddd}t jtjddd	d
tjdgtjddd}t
|| d S )Nr   r   r   r   r;   r   )re   limitr   r   r   )r   r   r   r   r    r   rl   ro   sumr}   r   )r#   ru   rv   r!   r!   r"   test_interpolate_limits"  s       r   c                  C  s   dD ]} i }t jtjdddtjtjtjdddg	tjdd	d
}|jdd| i|}|  dksft	|jd| dd|}|  dkst	qd S )N)r^   r_   r`   ra   rb   rc   r   r   r   r   r   rW   r   r;   r   rd   )rd   r   )r;   )r;   )
r   r   r   r   r    r   rl   ro   r   r}   )rd   kwargsr#   ru   r!   r!   r"   test_interpolate_methods3  s    &r   c                  C  s   dt fdtfdtffD ]|\} }tjdddddgtjd}tjd	dd
ddgtjd}tjddgtjd}|||| d}||}t| dkst	qd S )Nr^   rx   r   r   r   r   r   ir%   rY   2   r   r   r   )
r   r   r   r   r   r   rK   ro   r   r}   )rd   interpolatorxiyir;   foutr!   r!   r"   test_interpolatorsB  s    r   c               	   C  s   t dddddddg} t jtjdd	tjtjtjd
gtjddd| id}|jddd}|jdd}t|| |jddd}|jdd}t|| |jddd}|jdd}t|| d S )Nr;   r\      i,  i  i  iX  r   r   r   r   xcr+   Fr   r   )	r   r   r   r   r   r    r   rl   r   )r   r#   ru   rv   r!   r!   r"   test_interpolate_use_coordinateR  s     

r   c                  C  s   t dd\} }| ddi} | d}|  d}t|jtsDtt|	 | | ddi} | jddd}|  jddd}t|jtstt|| d S )N(   r   r]   r;   r   r   r   r   )
rU   chunkrl   load
isinstancerC   dask_array_typer}   r   compute)r#   r~   ru   rv   r!   r!   r"   test_interpolate_daskj  s    
r   c               	   C  sD   t dd\} }| ddi} tjtdd | d W 5 Q R X d S )Nr   r]   r   r   zconsists of multiple chunksr   )rU   r   r   r   r   rl   )r#   r~   r!   r!   r"   2test_interpolate_dask_raises_for_invalid_chunk_dim{  s    r   zdtype, methodr^   r_   c                 C  sp   t jtjddg| ddgttddgddtdd}|jtddddg|d	}|j| jkslt	d S )
Nr   r   r   r   r*   )rC   r   r,   r   r]   )r   rd   )
r   r   r   r   dictr   Zinterpr   r   r}   )r   rd   r#   r!   r!   r"   $test_interpolate_dask_expected_dtype  s    r   c                  C  sZ   t jtjddtjgtjddd} t jtjdddgtjddd}| d}t|| d S )Nr   r   r   r;   r   )r   r   r   r   r    r   ffillr   r   r!   r!   r"   
test_ffill  s    " 
r   c               
   C  s^   t jtjddtjgtjddd} t jdd& tt	 | 
d W 5 Q R X W 5 Q R X d S Nr   r   r   r;   r   FZuse_bottleneck)r   r   r   r   r    r   set_optionsr   r   RuntimeErrorr   r   r!   r!   r"   test_ffill_use_bottleneck  s    "r   c               
   C  sl   t jtjddtjgtjddd} | ddi} t jdd& t	t
 | d W 5 Q R X W 5 Q R X d S 	Nr   r   r   r;   r   r   Fr   )r   r   r   r   r    r   r   r   r   r   r   r   r   r!   r!   r"   test_ffill_use_bottleneck_dask  s
    "r   c               
   C  s^   t jtjddtjgtjddd} t jdd& tt	 | 
d W 5 Q R X W 5 Q R X d S r   )r   r   r   r   r    r   r   r   r   r   bfillr   r!   r!   r"   test_bfill_use_bottleneck  s    "r   c               
   C  sl   t jtjddtjgtjddd} | ddi} t jdd& t	t
 | d W 5 Q R X W 5 Q R X d S r   )r   r   r   r   r    r   r   r   r   r   r   r   r   r!   r!   r"   test_bfill_use_bottleneck_dask  s
    "r   r   r   c              	   C  s,  t dd\}}|ddi}t|| }t| | }t  |d}W 5 Q R X |d}t|| t  |d}W 5 Q R X |d}t|| t  |ddd}W 5 Q R X |ddd}t|| t  |ddd}W 5 Q R X |ddd}t|| t  |dd	d}W 5 Q R X |dd	d}t|| d S )
Nr   r]   r;   r   r   r   r   r   )   )rU   r   getattrr   r   r   )rd   r#   r~   Zdask_methodZnumpy_methodru   rv   r!   r!   r"   test_ffill_bfill_dask  s0    




r   c                  C  sZ   t jddddddgt jd} tj| dd	}|jdd
}t|| |jdd
}t|| d S r   )r   r   r   r   r   r   r   r   rR   rv   ru   r!   r!   r"   test_ffill_bfill_nonans  s    
r   c                  C  sR   t jdt jt jd} tj| dd}|jdd}t|| |jdd}t|| d S )Nr   r   r;   r   r   )	r   r   r    r   r   r   r   r   r   r   r!   r!   r"   test_ffill_bfill_allnans  s    
r   c                 C  s"   |  d}|  dkstd S )Nr   r   )r   ro   r   r}   )r#   resultr!   r!   r"   test_ffill_functions  s    
r   c                  C  s   t jdtjtjtjtjdddtjddgdd} | d}t jdddddddddddgdd}t|| | jdd	d
}t jddtjtjtjddddddgdd}t|| d S )Nr   r   r   r   r   r   r   r   r   r   )r   r   r   r    r   r   )r#   r   rv   r!   r!   r"   test_ffill_limit  s    " 
$
 r   c                 C  s>   | j dd}|d d|jd ks(tt|d | d  d S )Nr   r   r3   r<   )rl   r{   r   r}   r   )r>   ru   r!   r!   r"   test_interpolate_dataset  s    r   c                 C  s   | j dd d S Nr   r   r   r=   r!   r!   r"   test_ffill_dataset  s    r   c                 C  s   | j dd d S r   r   r=   r!   r!   r"   test_bfill_dataset   s    r   z
y, lengths	   r   r   r   r   r   rW   r%   r5   r7   r   c              	   C  s   t jt jt jdt jt jdt jt jg	g}tj|d ddgddg| dd}t|dd	d
}t|d|d}|j|d d}t|| d S )Nr   r   r   r;   r   r   r   r+   Tr   )re   r   rC   )r   r    r   r   r   r   r   r   )r   lengthsZarrr#   r   ru   rv   r!   r!   r"   %test_interpolate_na_nan_block_lengths%  s    
&"r   r)   c                 C  s0   t | |dd}tj|tdd d  dS )an  The index for CFTimeIndex is in units of days. This means that if two series using a 360 and 365 days
    calendar each have a trend of .01C/year, the linear regression coefficients will be different because they
    have different number of days.

    Another option would be to have an index in units of years, but this would likely create other difficulties.
    r   r   r%   g    eAiQ N)r   r   rp   r   r.   )r2   r)   ir!   r!   r"   'test_get_clean_interp_index_cf_calendar7  s    	r   )r)   r'   Z	gregorianZproleptic_gregorianr$   Z1MZ1Yc                 C  sR   | ||d}t j|j  dd|d< t|d}t|ddd}tj|| dS )zLIn the gregorian case, the index should be proportional to normal datetimes.)r'   r*   )rC   r   Zstimer   )r   N)	r   r   r   Zto_indexZto_datetimeindexr   r   rp   r   )r2   r)   r'   gZgisir!   r!   r"   test_get_clean_interp_index_dtD  s
    
r   c               	   C  s4   t jdddgddt jdddd	id
} t| d d S )Nr   r   r   r*   r   z
0000-01-01r   Z360_day)r(   r)   r+   )r   r   r-   r   r   r!   r!   r"   .test_get_clean_interp_index_potential_overflowR  s    r   r   r   c              	   C  sj   t jdddgdd| id}tt t|d W 5 Q R X t|ddd}tj| | |j	tj
ksftd S )	Nr   r   r   r;   r;   r+   F)strict)r   r   r   r   r   r   r   rp   r   r   r   r}   )r   r#   cleanr!   r!   r"   "test_get_clean_interp_index_strict\  s    r   c                   C  s4   t jtjddtjtjdtjtjtjtjdgdgdS )Nr   r   r   r%   tr   r   r!   r!   r!   r"   da_timeh  s    &r   c              	   C  s   t jtdd | jddd W 5 Q R X t jtdd | jddd W 5 Q R X tjdd	d
d| d< t jtdd | jddd W 5 Q R X t jtdd | jdddd W 5 Q R X t jtdd | jddd W 5 Q R X d S )Nz1max_gap not implemented for unlabeled coordinatesr   r   r   max_gapzmax_gap must be a scalar.)r   
2001-01-01Hr4   rE   zExpected value of type strz"Expected integer or floating pointZ1HF)r  r   z&Could not convert 'huh' to timedelta64Zhuh)r   r   r   rl   r   rK   rL   r   )r   r!   r!   r"   "test_interpolate_na_max_gap_errorsp  s     r  time_range_func)Zmarks	transformc                 C  s   | S )Nr!   r   r!   r!   r"   <lambda>      r  c                 C  s   | j ddS )Nr   )name)Z
to_datasetr   r!   r!   r"   r    r  r  Z3Hhc                 C  sb   |dddd| d< || j tjdddd	d
tjtjtjtjdgd}|| jd|d}t|| d S )Nr  r  r4   rE   r   r   r   r   r   r   r%   r   r   )r   r   r    rl   r
   )r   r  r  r  rv   ru   r!   r!   r"   *test_interpolate_na_max_gap_time_specifier  s    *r  r,   r4   r   c                 C  s  t jddddtjddtjtjtjdgdddtjtjddtjtjtjdgdddtjtjddtjtjtjdgddddtjddtjtjtjdggdd	g| d
}|jd	dd}|jdddddddtjtjtjdgdddtjtjddtjtjtjdgdddtjtjddtjtjtjdgdddddddtjtjtjdggd}t|| |jddd}t jddddtjddtjtjtjdgddddtjddtjtjtjdgddddtjddtjtjtjdgddddtjddtjtjtjdggdd	g| d
}t|| d S )Nr   r   r   r   r   r   r4   r;   r   r+   r   r   r   )r   r   r   r    rl   r   r   )r,   r#   ru   Z
expected_yZ
expected_xr!   r!   r"   test_interpolate_na_2d  s:    	 "" ""
    
r  c                  C  s   t jdddddgt jd} t d|  }t jddd	gt jd}t jt jt jd  t dt jt jd  g|jd}d
tfd
tffD ](\}}|| ||d}||}t|| qdS )z-Ensure complex nans are used for complex datar   r   r   r   r   r   y              ?r   r^   r   N)	r   r   r   expr    r   r   r   r   )r   r   r;   rv   rd   r   r   ru   r!   r!   r"   (test_interpolators_complex_out_of_bounds  s    & r  )r?   F)Y
__future__r   rj   Znumpyr   ZpandasrK   r   Zxarrayr   Zxarray.core.missingr   r   r   r   r   Zxarray.core.pycompatr   Zxarray.testsr	   r
   r   r   r   r   r   r   r   r   Zfixturer#   r2   r>   rU   rw   markZparametrizer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rI   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r.   r   r   zipr   r   r   r   r  rL   r   r-   Ztimedelta64Zto_timedeltar  Zxfailr  r  r!   r!   r!   r"   <module>   s  ,



!



	








%



	

 $,	 

	

 %