U
    +if7C                     @   s  d dl mZ d dlZd dlZ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mZ d dlmZ d dlmZmZ d dlmZ d dlm  mZ ejddgd	d
d Z G dd dZ!G dd de!Z"G dd de!Z#G dd de!Z$G dd de!Z%dd Z&dS )    )partialN)is_categorical_dtype)IntervalDtype)	CategoricalCategoricalIndexIndexIntervalIntervalIndex
date_rangenotnaperiod_rangetimedelta_range)Float64Index
Int64Index)IntervalArrayZfoo)paramsc                 C   s   | j S Nparam)request r   b/home/mars/bis/venv/lib/python3.8/site-packages/pandas/tests/indexes/interval/test_constructors.pyname   s    r   c                   @   sj  e Zd ZdZejdejddddddgej	d	d
de
eddee	dddedd	dedd	ddedd	dgdd Zejde
dddddgdfe
dddddgdfe
dddddgdfedddddgd
fed d!dd
fedd!dd
fgd"d# Zejde
dddddge
dddddge
dddddgedddddged d!dedd!dgd$d% Zejdejdejgd ejgd ejgd& gd'd( Zejdejdg ejg d
dejg ddejg ddejg ddgd)d* Zejded+ed,ejed,edejed,d-dgd.d/ Zejd0eegd1d2 Zd3d4 Zd5S )6ConstructorTestsz
    Common tests for all variations of IntervalIndex construction. Input data
    to be supplied in breaks format, then converted by the subclass method
    get_kwargs_from_breaks to the expected format.
    +ignore:Passing keywords other:FutureWarningbreaks         \   i  
   int64dtypei         g      ?Z20180101periodsz
US/Eastern)r(   tzz1 dayc                 C   s   |  ||}|f ||d|}|j|ks.t|j|ks<t|jjt|ddksTtt|j	t
|d d  t|jt
|dd   d S )N)closedr   r#   r!      )get_kwargs_from_breaksr*   AssertionErrorr   r#   subtypegetattrtmassert_index_equalleftr   right)selfconstructorr   r*   r   result_kwargsresultr   r   r   test_constructor)   s    z!ConstructorTests.test_constructorzbreaks, subtyper   r,         float64zdatetime64[ns]ztimedelta64[ns]z
2017-01-01   c           
      C   sb   |  ||}|f |}|  |}t|d}|t|fD ]"}|f d|i|}	t|	| q:d S )Nr4   r#   )r-   Zastyper   strr1   r2   )
r5   r6   r   r/   Zexpected_kwargsexpectedr7   iv_dtyper#   r8   r   r   r   test_constructor_dtype@   s    


z'ConstructorTests.test_constructor_dtypec              
   C   s   d }t |tr|jtkrt}t|j}| |}|t|fD ]>}t	
| |f |dd|}W 5 Q R X |jjdks<tq<d S )Nr3   r#   r*   )
isinstancer   funcr   FutureWarningr   r#   r-   r>   r1   Zassert_produces_warningr*   r.   )r5   r6   r   warnr@   r7   r#   r8   r   r   r   test_constructor_pass_closedV   s    

z-ConstructorTests.test_constructor_pass_closed2   c                 C   sl   |  |}|f d|i|}tj}tj|d d td}|j|ksFt|jj|ksVtt	
t|| d S )Nr*   r+   r"   )r-   npr<   arrayobjectr*   r.   r#   r/   r1   assert_numpy_array_equal)r5   r6   r   r*   r7   r8   expected_subtypeexpected_valuesr   r   r   test_constructor_nanr   s    
z%ConstructorTests.test_constructor_nanc                 C   sv   |  |}|f d|i|}tjg td}t|dtj}|jsBt|j|ksPt|j	j
|ks`ttt|| d S )Nr*   r"   r#   )r-   rI   rJ   rK   r0   r!   emptyr.   r*   r#   r/   r1   rL   )r5   r6   r   r*   r7   r8   rN   rM   r   r   r   test_constructor_empty   s    

z'ConstructorTests.test_constructor_empty
0123456789Z
abcdefghijz<U1c              	   C   s2   d}t jt|d |f | | W 5 Q R X d S )NIcategory, object, and string subtypes are not supported for IntervalIndexmatch)pytestraises	TypeErrorr-   )r5   r6   r   msgr   r   r   test_constructor_string   s    z(ConstructorTests.test_constructor_stringcat_constructorc                 C   sD   t jddd}t|}||}| |}|f |}t|| d S )Nr    r!   r"   )rI   aranger	   from_breaksr-   r1   r2   )r5   r6   r[   r   r?   Z
cat_breaksr7   r8   r   r   r   "test_constructor_categorical_valid   s    


z3ConstructorTests.test_constructor_categorical_validc              	   C   s  |  td}d}tjt|d |f ddi| W 5 Q R X d}tjt|d |f ddi| W 5 Q R X d	}tjt|d |f ddi| W 5 Q R X td
dd}|  |}d}tjt|d |f | W 5 Q R X |  tddd}d}tjt|d |f | W 5 Q R X d S )Nr    z8closed must be one of 'right', 'left', 'both', 'neither'rT   r*   invalidz)dtype must be an IntervalDtype, got int64r#   r!   z(data type ["']invalid["'] not understoodz
2000-01-01r'   z:Period dtypes are not supported, use a PeriodIndex insteadr+   z+left side of interval must be <= right side)r-   rangerV   rW   
ValueErrorrX   r   )r5   r6   ZfillerrY   r(   Zperiods_kwargsZdecreasing_kwargsr   r   r   test_generic_errors   s&    
z$ConstructorTests.test_generic_errorsN)__name__
__module____qualname____doc__rV   markfilterwarningsparametrizerI   r\   r   r`   r   r
   r   r9   rA   rG   nanrO   rJ   rQ   tuplelistrK   rZ   r   r   r^   rb   r   r   r   r   r   "   s|   








*

	
	
r   c                   @   sZ   e Zd ZdZejdd ZdddZdd Zej	
d	ejejfejejfgd
d ZdS )TestFromArraysz+Tests specific to IntervalIndex.from_arraysc                 C   s   t jS r   )r	   from_arraysr5   r   r   r   r6      s    zTestFromArrays.constructorr4   c                 C   s   |dd |dd dS )z
        converts intervals in breaks format to a dictionary of kwargs to
        specific to the format expected by IntervalIndex.from_arrays
        Nr+   r,   )r3   r4   r   r5   r   r*   r   r   r   r-      s    z%TestFromArrays.get_kwargs_from_breaksc              	   C   s   t tddd}d}tjt|d" t|d d |dd   W 5 Q R X ddd	g}d	d
g}d}tjt|d t|| W 5 Q R X d S )N
01234abcdeTZorderedrS   rT   r+   r,   r   r:   r   z(left and right must have the same length)r   rl   rV   rW   rX   r	   rn   ra   )r5   datarY   r3   r4   r   r   r   test_constructor_errors   s    &
z&TestFromArrays.test_constructor_errorszleft_subtype, right_subtypec           	      C   sp   t jd|d}t jdd|d}t||}t|}t|}t j}t|j| t|j	| |j
j|ksltdS )z:mixed int/float left/right results in float for both sides	   r"   r,   r    N)rI   r\   r	   rn   r   r<   r1   r2   r3   r4   r#   r/   r.   )	r5   Zleft_subtypeZright_subtyper3   r4   r8   Zexpected_leftZexpected_rightrM   r   r   r   test_mixed_float_int   s    z#TestFromArrays.test_mixed_float_intN)r4   )rc   rd   re   rf   rV   fixturer6   r-   rt   rg   ri   rI   r!   r<   rv   r   r   r   r   rm      s   

 rm   c                   @   s@   e Zd ZdZejdd ZdddZdd Zd	d
 Z	dd Z
dS )TestFromBreaksz+Tests specific to IntervalIndex.from_breaksc                 C   s   t jS r   )r	   r]   ro   r   r   r   r6     s    zTestFromBreaks.constructorr4   c                 C   s   d|iS )z
        converts intervals in breaks format to a dictionary of kwargs to
        specific to the format expected by IntervalIndex.from_breaks
        r   r   rp   r   r   r   r-     s    z%TestFromBreaks.get_kwargs_from_breaksc              	   C   s<   t tddd}d}tjt|d t| W 5 Q R X d S )Nrq   Trr   rS   rT   )r   rl   rV   rW   rX   r	   r]   )r5   rs   rY   r   r   r   rt     s
    z&TestFromBreaks.test_constructor_errorsc                 C   s*   dg}t |}t g }t|| dS )z3breaks of length one produce an empty IntervalIndexr   N)r	   r]   r1   r2   )r5   r   r8   r?   r   r   r   test_length_one   s    

zTestFromBreaks.test_length_onec                 C   s:   t d}t|j}|jjd ks6|jj|jjk	s6td S )Nr=   )	rI   r\   r	   r]   _data_leftbase_rightr.   )r5   r   r8   r   r   r   test_left_right_dont_share_data'  s    
z.TestFromBreaks.test_left_right_dont_share_dataN)r4   )rc   rd   re   rf   rV   rw   r6   r-   rt   ry   r~   r   r   r   r   rx     s   


rx   c                   @   s8   e Zd ZdZejdd ZdddZdd Zd	d
 Z	dS )TestFromTuplesz+Tests specific to IntervalIndex.from_tuplesc                 C   s   t jS r   )r	   from_tuplesro   r   r   r   r6   1  s    zTestFromTuples.constructorr4   c                 C   sl   t |dkrd|iS tt|dd |dd }t|ttfrHd|iS t|r^d||iS dt|iS )z
        converts intervals in breaks format to a dictionary of kwargs to
        specific to the format expected by IntervalIndex.from_tuples
        r   rs   Nr+   r,   )	lenrl   ziprC   rk   r   _constructorcomZasarray_tuplesafe)r5   r   r*   tuplesr   r   r   r-   5  s    z%TestFromTuples.get_kwargs_from_breaksc              	   C   s   dddg}d}t jt|j|dd t| W 5 Q R X dddg}d}t jt|j|dd t| W 5 Q R X dd	d
g}t jt|j|dd t| W 5 Q R X d S )Nr   r,   r:   )r   r;   z5IntervalIndex.from_tuples received an invalid item, 2)trT   )r:   z>IntervalIndex.from_tuples requires tuples of length 2, got {t})r:   r   r;   )r=      )rV   rW   rX   formatr	   r   ra   )r5   r   rY   r   r   r   rt   D  s    


z&TestFromTuples.test_constructor_errorsc                 C   s>   dt jt jfdg}t|}tdt jdg}t|| d S )Nr   )r:   r   )rI   rj   r	   r   r1   r2   )r5   Zna_tupleZidx_na_tupleZidx_na_elementr   r   r   test_na_tuplesU  s    
zTestFromTuples.test_na_tuplesN)r4   )
rc   rd   re   rf   rV   rw   r6   r-   rt   r   r   r   r   r   r   .  s   

r   c                   @   s  e Zd ZdZejeeeddgddgddd Z	d$d
dZ
dd Zdd Zdd Zejdejdg dfejejgdfeddddeddddgdfeddddeddd	dgdfejedddd	fgdd Zejdeejeegdd  Zd!d" Zd#S )%TestClassConstructorsz6Tests specific to the IntervalIndex/Index constructorsintervalr"   r	   r   )r   Zidsc                 C   s   |j S r   r   )r5   r   r   r   r   r6   `  s    z!TestClassConstructors.constructorr4   c                    sv   t |dkrd|iS  fddt|dd |dd D }t|trNd|iS t|rdd||iS dtj|tdiS )	z
        converts intervals in breaks format to a dictionary of kwargs to
        specific to the format expected by the IntervalIndex/Index constructors
        r   rs   c                    s(   g | ] \}}t |r t|| n|qS r   )r   r   ).0r3   r4   r*   r   r   
<listcomp>o  s   z@TestClassConstructors.get_kwargs_from_breaks.<locals>.<listcomp>Nr+   r,   r"   )	r   r   rC   rl   r   r   rI   rJ   rK   )r5   r   r*   ivsr   r   r   r-   g  s    

z,TestClassConstructors.get_kwargs_from_breaksc                 C   s   dS )z
        override the base class implementation since errors are handled
        differently; checks unnecessary since caught at the Interval level
        Nr   )r5   r6   r   r   r   rb   z  s    z)TestClassConstructors.test_generic_errorsc                 C   s   d S r   r   ro   r   r   r   rZ     s    z-TestClassConstructors.test_constructor_stringc              	   C   s   t ddddt ddddg}d}tjt|d	 || W 5 Q R X d
}tjt|d	 |d W 5 Q R X d}tjt|d	 |ddg W 5 Q R X d S )Nr   r,   r4   r   r:   r   r3   z-intervals must all be closed on the same siderT   zPIntervalIndex\(...\) must be called with a collection of some kind, 5 was passedr=   z?type <class 'numpy.int(32|64)'> with value 0 is not an interval)r   rV   rW   ra   rX   )r5   r6   r   rY   r   r   r   rt     s    z-TestClassConstructors.test_constructor_errorsr   zdata, closedbothneitherr   r   r   r:   r=   r3   c                 C   sL   t |tr| }ndd |D }tj||d}|||d}t|| d S )Nc                 S   s$   g | ]}t |r|j|jfn|qS r   )r   r3   r4   )r   Zivr   r   r   r     s     zGTestClassConstructors.test_override_inferred_closed.<locals>.<listcomp>r   )rC   r	   Z	to_tuplesr   r1   r2   )r5   r6   rs   r*   r   r?   r8   r   r   r   test_override_inferred_closed  s    

z3TestClassConstructors.test_override_inferred_closedvalues_constructorc                 C   sX   t ddt ddt ddg}||}t|td}t|tks@tt|jt	| d S )Nr   r,   r:   r   r"   )
r   r   rK   typer.   r1   rL   valuesrI   rJ   )r5   r   	intervalsr   r8   r   r   r   test_index_object_dtype  s
    z-TestClassConstructors.test_index_object_dtypec                 C   sX   t ddddt ddddt ddddt dd	d
dg}t|}t|td}t|| d S )Nr   r,   r3   r   r:   r4   r   r   r;   r   r"   )r   r   rK   r1   r2   )r5   r   r8   r?   r   r   r   test_index_mixed_closed  s    z-TestClassConstructors.test_index_mixed_closedN)r4   )rc   rd   re   rf   rV   rw   r	   r   r   r6   r-   rb   rZ   rt   rg   rh   ri   rI   rj   r   r]   r`   r   rl   rJ   r   r   r   r   r   r   r   r   ]  s>   



 
	r   c               	   C   sd   t tjd} d}tjt|d tg | dd W 5 Q R X tjt|d tg | dd W 5 Q R X d S )Nr3   z*closed keyword does not match dtype.closedrT   r   rB   )r   rI   r!   rV   rW   ra   r	   r   )r#   rY   r   r   r   test_dtype_closed_mismatch  s    r   )'	functoolsr   numpyrI   rV   Zpandas.core.dtypes.commonr   Zpandas.core.dtypes.dtypesr   Zpandasr   r   r   r   r	   r
   r   r   r   Zpandas._testingZ_testingr1   Zpandas.core.apir   r   Zpandas.core.arraysr   Zpandas.core.commoncorecommonr   rw   r   r   rm   rx   r   r   r   r   r   r   r   <module>   s$   ,
 61&/r