a
    Pªf¦M  ã                   @   s4  d dl m Z 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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j-ed;d<d=d>„ ƒZ.ej di d?g ig¡d@dA„ ƒZ/ddBœdCdD„Z0ddBœdEdF„Z1dGdH„ Z2ej dIdJdKg¡ej dLg dM¢¡dNdO„ ƒƒZ3dPdQ„ Z4ddBœdRdS„Z5dTdU„ Z6dVdW„ Z7dXdY„ Z8dZd[„ Z9ej d\g d]¢d^d_fg d]¢d`d_fg d]¢dadbfg d]¢dcdbfg d]¢dddefg d]¢dfdefg dg¢dhdifg dg¢djdifg dk¢dldmfg dk¢dndmfg do¢dpdqfg do¢drdqfe dsddƒe dsddƒdgdtdufe dsddƒe dsddƒdgdvdwfe dsddej:dxe dsddej:dxdgdydzfg¡e;e<e<dd{œd|d}„ƒZ=ej d\g d~¢d^d_fg d~¢d`d_fg d~¢dadbfg d~¢dcdbfg d~¢dddefg d~¢dfdefg d¢dhdifg d¢djdifg d€¢dldmfg d€¢dndmfg d¢dpdqfg d¢drdqfe dsddƒe dsddƒe dsdd‚ƒgdtdufe dsddƒe dsddƒe dsdd‚ƒgdvdwfe dsddej:dxe dsddej:dxe dsdd‚ej:dxgdydzfg¡e;e<e<dd{œdƒd„„ƒZ>ddBœd…d†„Z?ddBœd‡dˆ„Z@d‰dŠ„ ZAdS )‹é    )ÚdatetimeÚtimezoneN)Ú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   ú[/var/www/ai-form-bot/venv/lib/python3.9/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s8J ‚|jdksFJ ‚|jt	j
dfksZJ ‚| ¡ dksjJ ‚|j}|d | d ks„J ‚|d du s”J ‚t|d tƒs¦J ‚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_dtype0   s    ÿr2   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ÚTuer5   ÚWedr5   ÚThuÚFriÚSatÚSunÚweekday)r5   r6   r7   r8   r9   r:   r;   )r   )ÚpytestÚimportorskipÚtableÚarrayÚdictionary_encoder&   r   r   r   r%   r-   r/   )ÚpaÚarrr?   Úexchange_dfÚresultr<   Úexpectedr   r   r   Útest_categorical_pyarrowD   s    ÿrG   c                  C   sj   t  dd¡} d g}|  d|  |d¡ ¡ i¡}| ¡ }tjj 	|¡}t 
dt tjg¡i¡}t ||¡ d S )Nr3   r4   rC   Úfloat64)r=   r>   r?   r@   rA   r&   r   ÚapiÚinterchanger   r%   r   r   r   r-   r/   ©rB   rC   r?   rD   rE   rF   r   r   r   Útest_empty_categorical_pyarrowS   s    rL   c                  C   sv   t  dd¡} ddg}|  d|  |d¡i¡}| ¡ }t|ƒ}t dddgi¡}t 	||¡ | j
 | j |¡|¡srJ ‚d S )Nr3   r4   r5   r6   r<   Úlarge_string)r=   r>   r?   r@   r&   r   r   r%   r-   r/   ÚTableÚequalsrJ   rK   r   r   r   Útest_large_string_pyarrow_   s    rP   )ÚoffsetÚlengthÚexpected_valuesçffffff
@r   çÍÌÌÌÌÌ @r   é   c           	      C   sr   t  dd¡}g d¢}| d|i¡ | |¡}| ¡ }t|ƒ}t d|i¡}t 	||¡ |j
 |j |¡|¡snJ ‚d S )Nr3   r4   )rT   NrU   rC   )r=   r>   r?   Úslicer&   r   r   r%   r-   r/   rN   rO   rJ   )	rQ   rR   rS   rB   rC   r?   rD   rE   rF   r   r   r   Útest_bitmasks_pyarrown   s    rX   c                   C   s   t j d¡ dd¡S )NrV   iœÿÿÿéd   ©r   ÚrandomÚdefault_rngÚintegersr   r   r   r   Ú<lambda>‹   ó    r^   c                   C   s   t j d¡ dd¡S )NrV   r   rY   rZ   r   r   r   r   r^   Œ   r_   c                   C   s   t j d¡ ¡ S )NrV   )r   r[   r\   r   r   r   r   r^      r_   c                   C   s   t j d¡ ddg¡S )NrV   TF)r   r[   r\   Úchoicer   r   r   r   r^   Ž   r_   c                   C   s>   t tj d¡ dd¡tj d¡ dd¡tj d¡ dd¡dS )NrV   il  i4  r   é   é   )ÚyearÚmonthÚday)r   r   r[   r\   r]   r   r   r   r   r^      s   ýc                    sÞ   d\‰ ‰‡ ‡‡fdd„t ˆ ƒD ƒ‰t ˆ¡}| ¡ }| ¡ ˆ ksDJ ‚| ¡ ˆksTJ ‚t| ¡ ƒtˆ ¡ ƒkspJ ‚d}t	‡fdd„|D ƒƒ}t
| |¡ƒ}t
| |¡ƒ}t ||¡ t|jd tƒsÆJ ‚t|jd tƒsÚJ ‚d S )N)é
   rb   c                    s>   i | ]6}d t |ˆ d  ˆ  d ƒ› ‡fdd„tˆƒD ƒ“qS )r1   rV   r   c                    s   g | ]
}ˆ ƒ ‘qS r   r   )Ú.0Ú_©r   r   r   Ú
<listcomp>™   r_   z-test_dataframe.<locals>.<dictcomp>.<listcomp>)ÚintÚrange)rg   Úi©ZNCOLSZNROWSr   r   r   Ú
<dictcomp>˜   s   ÿz"test_dataframe.<locals>.<dictcomp>)r   rV   c                 3   s   | ]}t ˆ  ¡ ƒ| V  qd S ©N)r   Úkeys)rg   Úidxri   r   r   Ú	<genexpr>¦   r_   z!test_dataframe.<locals>.<genexpr>Z_INTERCHANGE_PROTOCOL_BUFFERS)rl   r   r%   r&   Znum_columnsZnum_rowsr   Úcolumn_namesrq   Útupler   Zselect_columnsZselect_columns_by_namer-   r/   r,   Úattrs)r   r0   Údf2ÚindicesÚnamesrE   rF   r   rn   r   Útest_dataframeˆ   s     þ
rz   c                     sæ   t  t g d¢¡t g d¢¡t g d¢¡dœ¡‰ tj d¡‰‡ ‡fdd„ˆ jD ƒ} |  ¡ D ]6\}}ˆ jˆj	t 
tˆ ƒ¡|dd	 }d ˆ j||f< qZˆ  ¡ }| d
¡j| d
 ks²J ‚| d¡j| d ksÊJ ‚| d¡j| d ksâJ ‚d S )N)ç      ð?ç       @g      @g      @ç        )ç      ø?ç      @ç      @g      @r   )r{   r}   r{   r{   r{   ©ÚxÚyÚzrV   c                    s    i | ]}|ˆj d tˆ ƒd“qS )r   )ÚlowÚhigh)r]   Úlen)rg   r1   ©r0   Úrngr   r   ro   º   r_   z,test_missing_from_masked.<locals>.<dictcomp>F)ÚsizeÚreplacer‚   rƒ   r„   )r   r%   r   r@   r[   r\   ÚcolumnsÚitemsÚindexr`   Zaranger‡   Úlocr&   r'   r)   )Z	dict_nullr1   Z	num_nullsZnull_idxrw   r   rˆ   r   Útest_missing_from_masked°   s"    ýÿÿr   )r~   r   r€   )çffffff"@ç      %@çš™™™™™'@)r‚   rƒ   )r   rV   r   )TTFr   c                 C   s6   t  | ¡}| ¡ }|jD ]}| |¡jdksJ ‚qd S )Nr   )r   r%   r&   rŒ   r'   r)   )r   r0   rw   Ú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)NrV   Nr   rV   )r‘   r’   Nr“   Nr   rV   )r   r%   r   r@   r&   rŒ   r'   r)   )r0   rw   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sHJ ‚|jd tjks\J ‚|j	t
jdfkspJ ‚|dd … }| ¡  d¡}| ¡ dksšJ ‚|jdks¨J ‚|jd tjks¼J ‚|j	t
jdfksÐJ ‚d S )Nr   Ú r   é   r   r   é   )r   r%   r&   r'   rŠ   r)   r(   r
   ÚSTRINGr*   r	   ZUSE_BYTEMASK)r   Ztest_str_datar0   r1   Z	df_slicedr   r   r   Útest_stringë   s    r›   c                  C   sX   t  dg d¢i¡} |  ¡  d¡}tjtdd |j W d   ƒ n1 sJ0    Y  d S )Nr   )r    rf   r{   r   znot supported yet©Úmatch)r   r%   r&   r'   r=   ÚraisesÚNotImplementedErrorr(   ©r0   r1   r   r   r   Útest_nonstring_objectý   s    r¡   c                  C   s†   t  dt  d¡t jgi¡} |  ¡  d¡}| ¡ dks8J ‚|jdksFJ ‚|jd t	j
ksZJ ‚|jtjtfksnJ ‚t | t|  ¡ ƒ¡ d S )Nr   z
2022-01-01rV   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)r0   r1   rE   rF   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 )Nr3   r4   r   r   )r=   r>   Úpyarrow.interchanger   r   r%   r-   r/   )r   Zpa_from_dataframerF   Zarrow_dfrE   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   ƒ n1 sn0    Y  d S )Nr3   r4   )rV   rV   é   )r®   r™   rY   Ún_legs)ry   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   rI   rJ   r   )rB   r¯   ry   r?   r   r   r   Útest_multi_chunk_pyarrow&  s    þr²   c                  C   sþ   t  dd¡ tjg d¢dd} tj| | gdd d¡}| ¡ }t jtd	d
& tj	j
 |jdd¡ W d   ƒ n1 sx0    Y  tj	j
 |jdd¡}tjdg d¢idd}t ||¡ t ||¡ t|d jjjƒdksàJ ‚t|d jjjƒdksúJ ‚d S )Nr3   r4   ©r   rV   NúInt64[pyarrow]r¨   T)Zignore_indexr    z:Found multi-chunk pyarrow array, but `allow_copy` is Falserœ   Fr°   )r{   r|   Nr{   r|   NrH   rV   )r=   r>   r   r.   ÚconcatÚto_frameÚcopyrž   r±   rI   rJ   r   r&   r%   r-   r/   r‡   r@   Z	_pa_arrayÚchunks)Zserr0   Zdf_origrE   rF   r   r   r   Útest_multi_chunk_column3  s    ÿ4r¹   c                  C   s|   t  dd¡ dddddddœ} tjtf i | ¤Žgddd ¡ }| ¡ }tjj 	|¡d  
¡ }tjf i | ¤Ž}||ksxJ ‚d S )	Nr3   r4   iÐ  r   )rc   rd   re   ÚhourÚminuteÚsecondútimestamp[ns][pyarrow]Zcol0)r(   Úname)r=   r>   r   r.   r   r¶   r&   rI   rJ   r   Úitemr¢   )Ztimestamp_argsr0   ÚdfirE   rF   r   r   r   Útest_timestamp_ns_pyarrowH  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_datar0   r   r   r   Útest_datetimetzdtype`  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 )Nr3   r4   r   z_TODO: Set ARROW_TIMEZONE_DATABASE environment variable on CI to path to the tzdata for pyarrow.)rž   r¥   éä  r   rV   úAsia/KathmandurC   )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/   )	ÚrequestrB   ZpcrÍ   rC   r?   rD   rE   rF   r   r   r   Ú)test_interchange_from_non_pandas_tz_awarek  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   ˆ S rp   r   r   )Úbuffersr   r   r^   —  r_   z?test_interchange_from_corrected_buffer_dtypes.<locals>.<lambda>c                    s   ˆ S rp   r   )rh   )Úcolumnr   r   r^   ˜  r_   r&   c                    s   ˆ S rp   r   r°   )rJ   r   r   r^   ™  r_   )r   r%   r&   r'   r©   r
   ZUINTr   ZUINT8ÚsetattrrI   rJ   r   )Zmonkeypatchr0   Zbuffers_dataZbuffer_dtyper   )rÓ   rÔ   rJ   r   Ú-test_interchange_from_corrected_buffer_dtypesˆ  s     
ürÖ   c                  C   s8   t jdg itd} |  ¡ }t jj |¡}t | |¡ d S )Nr    r¨   )	r   r%   Ústrr&   rI   rJ   r   r-   r/   )r0   rw   rE   r   r   r   Útest_empty_string_column  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 )Nr3   r    r‚   úlarge_string[pyarrow]r¨   Úobject)
r=   r>   r   r%   rI   rJ   r   r&   r-   r/   )r0   rE   rF   r   r   r   Útest_large_string¥  s
    
rÛ   c                  C   s4   t jg d¢dd ¡ } |  ¡  ¡ }|dgks0J ‚d S )N©r   rV   rÒ   r   )r¾   Ú0)r   r.   r¶   r&   rt   )r0   ry   r   r   r   Útest_non_str_names®  s    rÞ   c                  C   sd   t  g d¢g d¢dœ¡} |  ¡ }tjtdd" t jjj|dd W d   ƒ n1 sV0    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ž   Ú	TypeErrorrI   rJ   r   )r0   rÀ   r   r   r   Útest_non_str_names_w_duplicatesµ  s    ý
rà   )r   r(   Úexpected_dtyper³   ZInt64Zint64r´   ZInt8r§   zInt8[pyarrow]ZUInt64Zuint64zUInt64[pyarrow])r{   ç      @NZFloat32Zfloat32zFloat32[pyarrow])TFNÚbooleanÚboolzboolean[pyarrow])úmuch adoÚaboutNzstring[pyarrow_numpy]rM   zstring[pyarrow]rË   r½   ztimestamp[ns]ztimestamp[us][pyarrow]ztimestamp[us])Útzinfoz&timestamp[us, Asia/Kathmandu][pyarrow]ú timestamp[us, tz=Asia/Kathmandu])r   r(   rá   r­   c                 C   s¦   t  dd¡}dd lm} |dkr,| dd¡}tjd| i|d}| | ¡ ¡d }|j	|ks^J ‚|d  
¡ | d ksvJ ‚|d	  
¡ | d	 ksŽJ ‚|d
  
¡ d u s¢J ‚d S ©Nr3   r4   r   rè   rÆ   rÌ   r    r¨   r   rV   ©r=   r>   r«   rJ   Ú	timestampr   r%   r   r&   ÚtypeZas_py©r   r(   rá   rB   Zpair0   rE   r   r   r   Ú(test_pandas_nullable_with_missing_valuesÆ  s    1rî   rÜ   )r{   râ   g      @)TFF)rå   ræ   ZnothingrÒ   c                 C   sª   t  dd¡}dd lm} |dkr,| dd¡}tjd| i|d}| | ¡ ¡d }|j	|ks^J ‚|d  
¡ | d ksvJ ‚|d	  
¡ | d	 ksŽJ ‚|d
  
¡ | d
 ks¦J ‚d S ré   rê   rí   r   r   r   Ú+test_pandas_nullable_without_missing_values  s    0rï   c                  C   sF   t  dd¡ tjddgidd} |  ¡  d¡ ¡ d }|d u sBJ ‚d S )Nr3   r4   r    r‚   rÙ   r¨   Úvalidity)r=   r>   r   r%   r&   r'   r©   )r0   rE   r   r   r   Útest_string_validity_bufferC  s    rñ   c                  C   sl   t  dd¡ tjddd gidd} |  ¡  d¡ ¡ d }|d usDJ ‚|d }tjdt	jd	f}||kshJ ‚d S )
Nr3   r4   r    r‚   rÙ   r¨   rð   r   ú=)
r=   r>   r   r%   r&   r'   r©   r
   ZBOOLr   )r0   rð   rE   rF   r   r   r   Ú&test_string_validity_buffer_no_missingK  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&   rI   rJ   r   r-   r/   )r0   rÀ   rE   rF   r   r   r   Útest_empty_dataframeV  s
    rô   )Br   r   Únumpyr   r=   Zpandas._libs.tslibsr   Zpandas.compatr   r   Zpandas.compat.numpyr   Z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parametrizer2   rG   rL   rP   ÚfloatrX   rz   r   r@   r•   r–   r›   r¡   r¤   Zskipifrª   r¬   r²   r¹   rÁ   rÊ   rÏ   rÖ   rØ   rÛ   rÞ   rà   Úutcr   r×   rî   rï   rñ   ró   rô   r   r   r   r   Ú<module>   s8  




úþ
ûþ
ýýþ

	
		ýýýýýùáþ-þýý ý ýýùáþ-þ