o
    թZh5                     @   s  d dl m Z  d dlZd dlZd dlmZ d dlmZmZ d dl	m
Z
 d dlm  mZ d dlZd dlmZ d dlmZ d dlmZmZ d dlmZ d d	lmZ ejd
d Zejdd Zej !dddgdd Z"dd Z#dd Z$dd Z%ej !dd dde&ddgfdde&ddgfdddgfd dde&dgfd ddgfdde&dgfgdd  Z'ej !dd!d" d#d" d$d" d%d" d&d" gd'd( Z(d)d* Z)ej !dg d+g d,d-g d.g d,d-e*g d/e*g d.e*g d,d0gd1d2 Z+d3d4 Z,d5d6 Z-d7d8 Z.d9d: Z/ej j0e
d;d<d=d> Z1ej !di d?g igd@dA Z2dadCdDZ3ej !dEdFdGgej !dHg dIdJdK Z4dLdM Z5dadNdOZ6dPdQ Z7dRdS Z8dTdU Z9dVdW Z:ej !dXdYej;dZe<d[d\gdXe=dBdfd]d^Z>d_d` Z?dS )b    )datetimeN)iNaT)is_ci_environmentis_platform_windows)np_version_lt1p23)PandasColumn)ColumnNullType	DtypeKindfrom_dataframe)ArrowCTypesc                   C   s.   t jtdd ddt jtdd dddS )NZtestdata   T)orderedF)r   	unordered)pdCategoricallist r   r   Y/var/www/html/lang_env/lib/python3.10/site-packages/pandas/tests/interchange/test_impl.pydata_categorical   s   r   c                   C   s   dddddt jgiS )Nseparator datazabC|DeF,Hikz234,3245.67zgSaf,qWer|Grez
asd3,4sad|)npnanr   r   r   r   string_data!   s   r   data)r   T)r   Fc                 C   s   t d|| d  i}| d}|jd tjksJ |jdks#J |jt	j
dfks-J | dks5J |j}|d | d ksBJ |d du sJJ t|d tsSJ t|d jt g d	 t|t|  d S )
NAr      Z
is_orderedZis_dictionaryT
categories)adest)r   	DataFrame__dataframe__get_column_by_namedtyper	   ZCATEGORICAL
null_countdescribe_nullr   USE_SENTINELZ
num_chunksZdescribe_categorical
isinstancer   tmZassert_series_equalZ_colSeriesassert_frame_equalr   )r   r   dfcolZdesc_catr   r   r   test_categorical_dtype.   s   r1   c                  C   sl   t dd} g d}| d| | i}| }t|}tj|g dd}t	d|i}t
|| d S )Npyarrow11.0.0)	MonTuer4   Wedr4   ThuFriSatSunweekday)r4   r5   r6   r7   r8   r9   r:   )r   )pytestimportorskiptablearraydictionary_encoder%   r   r   r   r$   r,   r.   )paarrr>   exchange_dfresultr;   expectedr   r   r   test_categorical_pyarrowB   s   rF   c                  C   sj   t dd} d g}| d| |d i}| }tjj	|}t
dttjgi}t|| d S )Nr2   r3   rB   Zfloat64)r<   r=   r>   r?   r@   r%   r   apiinterchanger   r$   r   r   r   r,   r.   rA   rB   r>   rC   rD   rE   r   r   r   test_empty_categorical_pyarrowQ   s   rJ   c                  C   sv   t dd} ddg}| d| |di}| }t|}tdddgi}t	|| | j
| j||s9J d S )Nr2   r3   r4   r5   r;   Zlarge_string)r<   r=   r>   r?   r%   r   r   r$   r,   r.   TableequalsrH   rI   r   r   r   test_large_string_pyarrow]   s   rM   )offsetlengthexpected_valuesffffff
@r    @r      c           	      C   sr   t dd}g d}|d|i| |}| }t|}td|i}t	|| |j
|j||s7J d S )Nr2   r3   )rQ   NrR   rB   )r<   r=   r>   slicer%   r   r   r$   r,   r.   rK   rL   rH   )	rN   rO   rP   rA   rB   r>   rC   rD   rE   r   r   r   test_bitmasks_pyarrowl   s   rU   c                   C      t jdddS )NrS   id   r   randomdefault_rngintegersr   r   r   r   <lambda>       r\   c                   C   rV   )NrS   r   rW   rX   r   r   r   r   r\      r]   c                   C   s   t jd S )NrS   )r   rY   rZ   r   r   r   r   r\      s    c                   C   s   t jdddgS )NrS   TF)r   rY   rZ   choicer   r   r   r   r\      s    c                   C   s>   t tjdddtjdddtjddddS )NrS   il  i4  r         )yearmonthday)r   r   rY   rZ   r[   r   r   r   r   r\      s
    c                    s   d\  fddt  D t}| }|  ks"J | ks*J t| t ks8J d}t	fdd|D }t
||}t
||}t|| t|jd tscJ t|jd tsmJ d S )N)
   r`   c                    s>   i | ]}d t | d    d  fddtD qS )r0   rS   r   c                    s   g | ]}  qS r   r   ).0_r   r   r   
<listcomp>   s    z-test_dataframe.<locals>.<dictcomp>.<listcomp>)intrange)re   iZNCOLSZNROWSr   r   r   
<dictcomp>   s    0z"test_dataframe.<locals>.<dictcomp>)r   rS   c                 3   s     | ]}t   | V  qd S N)r   keys)re   idxrg   r   r   	<genexpr>   s    z!test_dataframe.<locals>.<genexpr>Z_INTERCHANGE_PROTOCOL_BUFFERS)rj   r   r$   r%   Znum_columnsZnum_rowsr   column_namesro   tupler   Zselect_columnsZselect_columns_by_namer,   r.   r+   attrs)r   r/   df2indicesnamesrD   rE   r   rl   r   test_dataframe   s    
rx   c                     s   t tg dtg dtg dd tjd fdd jD } |  D ]\}} jj	t
t |dd	 }d  j||f< q-  }|d
j| d
 ksYJ |dj| d kseJ |dj| d ksqJ d S )N)      ?g       @g      @g      @        )      ?      @      @g      @r   )ry   rz   ry   ry   ry   xyzrS   c                    s    i | ]}|j d t dqS )r   )lowhigh)r[   len)re   r0   r/   rngr   r   rm      s     z,test_missing_from_masked.<locals>.<dictcomp>F)sizereplacer   r   r   )r   r$   r   r?   rY   rZ   columnsitemsindexr^   Zaranger   locr%   r&   r(   )Z	dict_nullr0   Z	num_nullsZnull_idxru   r   r   r   test_missing_from_masked   s"   r   )r{   r|   r}   )ffffff"@      %@皙'@)r   r   )r   rS   r   )TTFr~   c                 C   s6   t | }| }|jD ]}||jdksJ qd S )Nr   )r   r$   r%   r   r&   r(   )r   r/   ru   col_namer   r   r   test_mixed_data   s
   

r   c                  C   s\   t tg dtg dtg dd} |  }| jD ]}||jdks+J qd S )N)TNFNT)NrS   Nr   rS   )r   r   Nr   Nr~   rS   )r   r$   r   r?   r%   r   r&   r(   )r/   ru   r   r   r   r   test_mixed_missing   s   
r   c                 C   s   | d dg }t d|i}| d}| dksJ |jdks$J |jd tjks.J |j	t
jdfks8J |dd  }| d}| dksMJ |jdksTJ |jd tjks^J |j	t
jdfkshJ d S )Nr    r      r   r      )r   r$   r%   r&   r   r(   r'   r	   STRINGr)   r   ZUSE_BYTEMASK)r   Ztest_str_datar/   r0   Z	df_slicedr   r   r   test_string   s   r   c                  C   sZ   t dg di} |  d}tjtdd |j W d    d S 1 s&w   Y  d S )Nr   )r   rd   ry   r   znot supported yetmatch)r   r$   r%   r&   r<   raisesNotImplementedErrorr'   r/   r0   r   r   r   test_nonstring_object   s
   "r   c                  C   s   t dt dt jgi} |  d}| dksJ |jdks#J |jd t	j
ks-J |jtjtfks7J t| t|   d S )Nr   z
2022-01-01rS   r   r   )r   r$   	TimestampNaTr%   r&   r   r(   r'   r	   ZDATETIMEr)   r   r*   r   r,   r.   r   r   r   r   r   test_datetime  s   r   zNumpy > 1.23 required)reasonc                  C   s^   t dt g di} |  d}t| d d }tjg ddd}t	
|| d S )Nr   )r   br   r   r   )r   r   r   int8r'   )r   r$   r   r%   r&   r   Zfrom_dlpackget_buffersr?   r,   Zassert_numpy_array_equal)r/   r0   rD   rE   r   r   r    test_categorical_to_numpy_dlpack  s
   r   r   c                 C   sB   t dd ddlm} t| }||}t|}t|| d S )Nr2   r3   r   r
   )r<   r=   Zpyarrow.interchanger   r   r$   r,   r.   )r   Zpa_from_dataframerE   Zarrow_dfrD   r   r   r   test_empty_pyarrow  s   
r   returnc                  C   s~   t dd} | g dg dg}dg}| j|g|d}t jtdd tjjj	|d	d
 W d    d S 1 s8w   Y  d S )Nr2   r3   )rS   rS      )r   r   rW   n_legs)rw   zHTo join chunks a copy is required which is forbidden by allow_copy=Falser   FZ
allow_copy)
r<   r=   Zchunked_arrayr>   r   RuntimeErrorr   rG   rH   r   )rA   r   rw   r>   r   r   r   test_multi_chunk_pyarrow$  s   "r   tzUTCz
US/Pacificunit)r"   msusnsc                 C   sB   t jdddd| |}t d|i}t|t|  d S )Nz
2018-01-01r   D)ZperiodsfreqZts_tz)	r   Z
date_rangeZtz_localizeZas_unitr$   r,   r.   r   r%   )r   r   Ztz_datar/   r   r   r   test_datetimetzdtype1  s   r   c           	      C   s   t dd}dd lm} t r t r t jj|jdd}| 	| |
tdddd tdddg}||d	}|d
|i}| }t|}tjg dd
gdd}t|| d S )Nr2   r3   r   z_TODO: Set ARROW_TIMEZONE_DATABASE environment variable on CI to path to the tzdata for pyarrow.)r   r   i  r   rS   zAsia/KathmandurB   )z2020-01-01 00:00:00+05:45r   z2020-01-02 00:00:00+05:45zdatetime64[us, Asia/Kathmandu])r   r'   )r<   r=   Zpyarrow.computeZcomputer   r   markZxfailZArrowInvalidZapplymarkerr?   r   Zassume_timezoner>   r%   r   r   r$   r,   r.   )	requestrA   Zpcr   rB   r>   rC   rD   rE   r   r   r   )test_interchange_from_non_pandas_tz_aware<  s&   
 r   c                    s   t dddgi }| d   d }|d }tjdtj|d f}|d |f d<  fd	d
_fdd
_| 	|dfdd
 t j
j| d S )Nr   Zfoobarr   r         r   c                          S rn   r   r   )buffersr   r   r\   h      z?test_interchange_from_corrected_buffer_dtypes.<locals>.<lambda>c                    r   rn   r   )rf   )columnr   r   r\   i  r   r%   c                    r   rn   r   r   )rH   r   r   r\   j  r   )r   r$   r%   r&   r   r	   ZUINTr   ZUINT8setattrrG   rH   r   )Zmonkeypatchr/   Zbuffers_dataZbuffer_dtyper   )r   r   rH   r   -test_interchange_from_corrected_buffer_dtypesY  s    
r   c                  C   s8   t jdg itd} |  }t jj|}t| | d S )Nr   r   )	r   r$   strr%   rG   rH   r   r,   r.   )r/   ru   rD   r   r   r   test_empty_string_columnn  s   r   c                  C   sT   t d tjddgidd} tjj|  }tjddgidd}t	|| d S )Nr2   r   r   zlarge_string[pyarrow]r   object)
r<   r=   r   r$   rG   rH   r   r%   r,   r.   )r/   rD   rE   r   r   r   test_large_stringv  s
   
r   c                  C   s4   t jg ddd } |   }|dgksJ d S )Nr   rS   r   r   )name0)r   r-   Zto_framer%   rr   )r/   rw   r   r   r   test_non_str_names  s   r   c                  C   sf   t g dg dd} |  }tjtdd t jjj|dd W d    d S 1 s,w   Y  d S )Nr   )r   r   r   )r   r   a   Expected a Series, got a DataFrame. This likely happened because you called __dataframe__ on a DataFrame which, after converting column names to string, resulted in duplicated names: Index\(\['0', '0'\], dtype='object'\). Please rename these columns before using the interchange protocol.r   Fr   )	r   r$   r%   r<   r   	TypeErrorrG   rH   r   )r/   dfir   r   r   test_non_str_names_w_duplicates  s   
"r   r'   ZInt8zInt8[pyarrow]r2   )Zmarksc                 C   sJ   t jddgi| d}t jddgidd}t jj| }t|| d S )Nr   r   r   r   )r   r$   rG   rH   r   r%   r,   r.   )r'   r/   rE   rD   r   r   r   test_nullable_integers  s   r   c                  C   sN   t jdg idd} |  }t jjj|dd}t jdg idd}t|| d S )Nr   r   r   Fr   )r   r$   r%   rG   rH   r   r,   r.   )r/   r   rD   rE   r   r   r   test_empty_dataframe  s
   r   )r   N)@r   numpyr   r<   Zpandas._libs.tslibsr   Zpandas.compatr   r   Zpandas.compat.numpyr   Zpandas.util._test_decoratorsutilZ_test_decoratorstdZpandasr   Zpandas._testingZ_testingr,   Zpandas.core.interchange.columnr   Z*pandas.core.interchange.dataframe_protocolr   r	   Z&pandas.core.interchange.from_dataframer   Zpandas.core.interchange.utilsr   Zfixturer   r   r   Zparametrizer1   rF   rJ   rM   floatrU   rx   r   r?   r   r   r   r   r   Zskipifr   r   r   r   r   r   r   r   r   r   paramZ
skip_if_nor   r   r   r   r   r   r   <module>   s    








	

	
	