o
    ŀgM                  	   @   sV  d dl mZ d dlZd dlZd dlm  m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mZ d dl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'ej()dg ddd Z*dd Z+ej()ddej,de-ddgd d! Z.dS )"    )partialN)is_unsigned_integer_dtype)IntervalDtype)
CategoricalCategoricalDtypeCategoricalIndexIndexIntervalIntervalIndex
date_rangenotnaperiod_rangetimedelta_range)IntervalArrayfooparamsc                 C   s   | j S Nparam)request r   c/var/www/html/myenv/lib/python3.10/site-packages/pandas/tests/indexes/interval/test_constructors.pyname      r   c                   @   s  e Zd ZdZejg dejfejdddejfe	ejddejdejfe	ejddej
dej
fe	ed	d
dejdejfeddddfedddddfeddddfgddd Zdd Zejde	g dejddfe	g dejddfe	g dejddfe	g dejddfeddddfeddddfgd d! Zejd"e	g dejde	g dej
de	g dejdedddedddgd#d$ Zejd"ejgd% ejgd& ejgd' gd(d) Zejd"g ejg dd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d0d1 Zejd2eegd3d4 Zd5d6 Zd7S )8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.
    )         \   i  
   int64dtypei            g      ?20180101periodsz<M8[ns]z
US/Easternr*   tzzdatetime64[ns, US/Eastern]z1 dayz<m8[ns]r   c                 C      |j S r   r   selfr   r   r   r   breaks_and_expected_subtype(   s   z,ConstructorTests.breaks_and_expected_subtypec           	      C   s   |\}}|  ||}|d||d|}|j|ksJ |j|ks"J |jj|ks*J t|jt|d d |d t|j	t|dd  |d d S )N)closedr   r"      r   )
get_kwargs_from_breaksr1   r   r#   subtypetmassert_index_equalleftr   right)	r/   constructorr0   r1   r   breaksexpected_subtyperesult_kwargsresultr   r   r   test_constructor:   s   "z!ConstructorTests.test_constructorzbreaks, subtype)r   r3      r      float64zdatetime64[ns]ztimedelta64[ns]
2017-01-01   c           
      C   sf   |  ||}|di |}|  |}t|d}|t|fD ]}|dd|i|}	t|	| qd S )Nr9   r#   r   )r4   astyper   strr6   r7   )
r/   r:   r;   r5   expected_kwargsexpectedr=   iv_dtyper#   r>   r   r   r   test_constructor_dtypeG   s   

z'ConstructorTests.test_constructor_dtyper;   c              	   C   sx   t |j}| |}|t|fD ])}td  |d|dd|}W d    n1 s,w   Y  |jjdks9J qd S )Nr8   r#   r1   r   )r   r#   r4   rF   r6   assert_produces_warningr1   )r/   r:   r;   rI   r=   r#   r>   r   r   r   test_constructor_pass_closed]   s   

z-ConstructorTests.test_constructor_pass_closedr@   rA   2   c                 C   sl   |  |}|dd|i|}tj}tj|d d td}|j|ks#J |jj|ks+J t	t|| d S )Nr1   r2   r"   r   )
r4   nprB   arrayobjectr1   r#   r5   r6   assert_numpy_array_equal)r/   r:   r;   r1   r=   r>   r<   expected_valuesr   r   r   test_constructor_nanr   s   
z%ConstructorTests.test_constructor_nanuint64c                 C   sv   |  |}|dd|i|}tjg td}t|dtj}|js!J |j|ks(J |jj	|ks0J t
t|| d S )Nr1   r"   r#   r   )r4   rO   rP   rQ   getattrr!   emptyr1   r#   r5   r6   rR   )r/   r:   r;   r1   r=   r>   rS   r<   r   r   r   test_constructor_empty   s   

z'ConstructorTests.test_constructor_empty
0123456789
abcdefghijz<U1c                 C   sL   d}t jt|d |di | | W d    d S 1 sw   Y  d S )NIcategory, object, and string subtypes are not supported for IntervalIndexmatchr   )pytestraises	TypeErrorr4   )r/   r:   r;   msgr   r   r   test_constructor_string   s
   "z(ConstructorTests.test_constructor_stringcat_constructorc                 C   sH   t jddd}t|}||}| |}|di |}t|| d S )Nr    r!   r"   r   )rO   aranger
   from_breaksr4   r6   r7   )r/   r:   rc   r;   rH   
cat_breaksr=   r>   r   r   r   "test_constructor_categorical_valid   s   

z3ConstructorTests.test_constructor_categorical_validc                 C   s  |  td}d}tjt|d |dddi| W d    n1 s$w   Y  d}tjt|d |dddi| W d    n1 sFw   Y  d	}tjt|d |dddi| W d    n1 shw   Y  td
dd}|  |}d}tjt|d |di | W d    n1 sw   Y  |  tddd}d}tjt|d |di | W d    d S 1 sw   Y  d S )Nr    z8closed must be one of 'right', 'left', 'both', 'neither'r\   r1   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 insteadr2   z+left side of interval must be <= right sider   )r4   ranger^   r_   
ValueErrorr`   r   )r/   r:   fillerra   r*   periods_kwargsdecreasing_kwargsr   r   r   test_generic_errors   s0   
"z$ConstructorTests.test_generic_errorsN) __name__
__module____qualname____doc__r^   fixturerO   r!   rd   r   rU   rB   r   r   r0   r?   markparametrizerJ   rM   nanrT   rP   rX   tuplelistrQ   rb   r   r   rg   rn   r   r   r   r   r   !   s~    





*


		
r   c                   @   st   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ej	
deegdd ZdS )TestFromArraysz+Tests specific to IntervalIndex.from_arraysc                 C      t jS r   )r
   from_arraysr/   r   r   r   r:      r   zTestFromArrays.constructorr9   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
        Nr2   r3   )r8   r9   r   r/   r;   r1   r   r   r   r4      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 d    n1 s*w   Y  g d}d	d
g}d}tjt|d t|| W d    d S 1 sRw   Y  d S )N
01234abcdeTorderedr[   r\   r2   r3   )r   r3   r@   r@   r   z(left and right must have the same length)r   rx   r^   r_   r`   r
   r{   rj   )r/   datara   r8   r9   r   r   r   test_constructor_errors   s   "z&TestFromArrays.test_constructor_errorszleft_subtype, right_subtypec           	      C   s|   t jd|d}t jdd|d}t||}t|t jd}t|t jd}t j}t|j| t|j	| |j
j|ks<J dS )z:mixed int/float left/right results in float for both sides	   r"   r3   r    N)rO   rd   r
   r{   r   rB   r6   r7   r8   r9   r#   r5   )	r/   left_subtyperight_subtyper8   r9   r>   expected_leftexpected_rightr<   r   r   r   test_mixed_float_int   s   z#TestFromArrays.test_mixed_float_intinterval_clsc                 C   s   t dddd}t dddd}|||}||d|}t|| ||d  }||d  }|||}||d|}	t||	 |d}
|d}||
|}||
d|}t|| d S )	Nz
2016-01-01r   s)r*   unitrC   msr   UTC)r   r{   as_unitr6   assert_equaltz_localize)r/   r   r8   r9   r>   rH   left2right2result2	expected2left3right3result3	expected3r   r   r   .test_from_arrays_mismatched_datetimelike_resos  s   

z=TestFromArrays.test_from_arrays_mismatched_datetimelike_resosNr9   )ro   rp   rq   rr   r^   rs   r:   r4   r   rt   ru   rO   r!   rB   r   r   r
   r   r   r   r   r   ry      s    


ry   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   rz   r   )r
   re   r|   r   r   r   r:   !  r   zTestFromBreaks.constructorr9   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   r}   r   r   r   r4   %  s   z%TestFromBreaks.get_kwargs_from_breaksc                 C   sR   t tddd}d}tjt|d t| W d    d S 1 s"w   Y  d S )Nr~   Tr   r[   r\   )r   rx   r^   r_   r`   r
   re   )r/   r   ra   r   r   r   r   ,  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
   re   r6   r7   )r/   r;   r>   rH   r   r   r   test_length_one6  s   

zTestFromBreaks.test_length_onec                 C   s>   t d}t|j}|jjd u s|jj|jjusJ d S d S )NrD   )rO   rd   r
   re   _data_leftbase_right)r/   r;   r>   r   r   r   test_left_right_dont_share_data=  s   
(z.TestFromBreaks.test_left_right_dont_share_dataNr   )ro   rp   rq   rr   r^   rs   r:   r4   r   r   r   r   r   r   r   r     s    


r   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   rz   r   )r
   from_tuplesr|   r   r   r   r:   G  r   zTestFromTuples.constructorr9   c                 C   s   t |rt|j d t|dkrd|iS tt|dd |dd }t|ttfr1d|iS tt	|ddt
rAd||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
        z- not relevant IntervalIndex.from_tuples testsr   r   Nr2   r3   r#   )r   r^   skipr#   lenrx   zip
isinstancerw   rV   r   _constructorcomasarray_tuplesafe)r/   r;   r1   tuplesr   r   r   r4   K  s   z%TestFromTuples.get_kwargs_from_breaksc                 C   s   g d}d}t jt|j|dd t| W d    n1 s!w   Y  g d}d}t jt|j|dd t| W d    n1 sGw   Y  g d}t jt|j|dd t| W d    d S 1 slw   Y  d S )N)r   r3   r@   r   rA   z5IntervalIndex.from_tuples received an invalid item, 2)tr\   )r   )r@   r   z>IntervalIndex.from_tuples requires tuples of length 2, got {t})r   )r@   r   rA   )rD      )r^   r_   r`   formatr
   r   rj   )r/   r   ra   r   r   r   r   ]  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   )rO   rv   r
   r   r6   r7   )r/   na_tupleidx_na_tupleidx_na_elementr   r   r   test_na_tuplesn  s   
zTestFromTuples.test_na_tuplesNr   )
ro   rp   rq   rr   r^   rs   r:   r4   r   r   r   r   r   r   r   D  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	ejd	d
 Z
d%ddZdd Zdd Zdd Z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   idsc                 C   r-   r   r   r.   r   r   r   klassy  s   zTestClassConstructors.klassc                 C   s   t S r   )r
   r|   r   r   r   r:     s   z!TestClassConstructors.constructorr9   c                    s   t |rt|j d t|dkrd|iS  fddt|dd |dd D }t|tr4d|iS tt|d	d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
        z) not relevant for class constructor testsr   r   c                    s(   g | ]\}}t |rt|| n|qS r   )r   r	   ).0r8   r9   r1   r   r   
<listcomp>  s    z@TestClassConstructors.get_kwargs_from_breaks.<locals>.<listcomp>Nr2   r3   r#   r"   )r   r^   r   r#   r   r   r   rx   rV   r   r   rO   rP   rQ   )r/   r;   r1   ivsr   r   r   r4     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   )r/   r:   r   r   r   rn     s    z)TestClassConstructors.test_generic_errorsc                 C   s   d S r   r   r|   r   r   r   rb     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 d    n1 s&w   Y  d
}tjt|d	 |d W d    n1 sCw   Y  d}tjt|d	 |ddg W d    d S 1 scw   Y  d S )Nr   r3   r9   r   r@   r   r8   z-intervals must all be closed on the same sider\   zX(IntervalIndex|Index)\(...\) must be called with a collection of some kind, 5 was passedrD   z?type <class 'numpy.int(32|64)'> with value 0 is not an interval)r	   r^   r_   rj   r`   )r/   r   r   ra   r   r   r   r     s   

"z-TestClassConstructors.test_constructor_errorszdata, closedbothneitherr   r   r   r@   rD   r8   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   r8   r9   )r   ivr   r   r   r     s   $ zGTestClassConstructors.test_override_inferred_closed.<locals>.<listcomp>r   )r   r
   	to_tuplesr   r6   r7   )r/   r:   r   r1   r   rH   r>   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u s J t|jt| d S )Nr   r3   r@   r   r"   )	r	   r   rQ   typer6   rR   valuesrO   rP   )r/   r   	intervalsr   r>   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   r3   r8   r   r@   r9   r   r   rA   r   r"   )r	   r   rQ   r6   r7   )r/   r   r>   rH   r   r   r   test_index_mixed_closed  s   z-TestClassConstructors.test_index_mixed_closedNr   )ro   rp   rq   rr   r^   rs   r
   r   r   r   r:   r4   rn   rb   r   rt   ru   rO   rv   r	   re   ri   r   rx   rP   r   r   r   r   r   r   r   r   v  s@    





	r   timezone)r   z
US/PacificGMTc                 C   sj   t dd| d}d|  d| d}tjddgdd	g||d
}tj|d d |dd  |d}t|| d S )N2022r   r+   zinterval[datetime64[ns, z], ]z
2022-01-01z
2022-01-02z
2022-01-03r1   r#   r2   r3   r   )r   r
   r{   r6   r7   )r   inclusive_endpoints_fixturedatesr#   r>   rH   r   r   r   test_interval_index_subtype  s   r   c                  C   s   t tjd} d}tjt|d tg | dd W d    n1 s!w   Y  tjt|d tg | dd W d    d S 1 s@w   Y  d S )Nr8   z*closed keyword does not match dtype.closedr\   r   rK   )r   rO   r!   r^   r_   rj   r
   r   )r#   ra   r   r   r   test_dtype_closed_mismatch  s   "r   r#   Float64zfloat64[pyarrow]pyarrow)marksc                 C   sV   ddg}t | dd}tj|d|d}|j|ksJ tj|dd|}t|| d S )N)g        皙?)r   g333333?r8   )r5   r1   r   r   )r   r
   r   r#   rE   r6   r7   )r#   binsinterval_dtyper>   rH   r   r   r   test_ea_dtype  s   r   )/	functoolsr   numpyrO   r^   pandas.util._test_decoratorsutil_test_decoratorstdpandas.core.dtypes.commonr   pandas.core.dtypes.dtypesr   pandasr   r   r   r   r	   r
   r   r   r   r   pandas._testing_testingr6   pandas.core.arraysr   pandas.core.commoncorecommonr   rs   r   r   ry   r   r   r   rt   ru   r   r   r   
skip_if_nor   r   r   r   r   <module>   s4    0
 6H&2x
