U
    c                     @   s   d dl Zd dlZd dlZd dlmZ ejdddZ	d dl
mZ dd ejD Zedd ejD 7 Zeejd	d
d	dgddg7 Zejedd eD ddd Zdd Zdd Zdd Zdd Zdd Zdd Zejdd Zdd  Zd!d" ZdS )#    NZpyarrowz1.0.1)Z
minversion)pyarrow_array_to_numpy_and_maskc                 C   s"   g | ]}t jd dddg|dqS )         Ndtypepdarray.0r    r   P/tmp/pip-unpacked-wheel-g7fro6k3/pandas/tests/arrays/masked/test_arrow_compat.py
<listcomp>   s     r   c                 C   s"   g | ]}t jd dddg|dqS )g?g?g333333?Nr   r   r   r   r   r   r      s     TFbooleanr   c                 C   s   g | ]}|j jqS r   )r   name)r   ar   r   r   r      s     )paramsidsc                 C   s   | j S )zi
    Fixture returning parametrized array from given dtype, including integer,
    float and boolean
    )param)requestr   r   r   data   s    r   c                 C   s>   t | }t j| jtd dt | jjd}||s:td S )N)Zna_valuetype)	par
   Zto_numpyobjectfrom_numpy_dtyper   numpy_dtypeequalsAssertionError)r   arrexpectedr   r   r   test_arrow_array   s    
r"   c                 C   s`   t d| i}t|}|djt| jjks4t	|
 }|d j| jksPt	t|| d S )Nr   )r	   	DataFramer   tablefieldr   strr   r   r   	to_pandastmassert_frame_equalr   dfr$   resultr   r   r   test_arrow_roundtrip"   s    
r-   c            
      C   s   dd } t jdd dgt  d}t jdd dgt  d}t jdd	d
gt  d}t j|||gdddg}|j| d}tj	dd dgdd}tj	dd dgdd}tj	dd	d
gdd}t
|||d}	t||	 d S )Nc                 S   s,   t j| rt S t j| r(t S d S )N)r   typesZ
is_booleanr	   ZBooleanDtype
is_integerZ
Int64Dtype)Z
arrow_typer   r   r   types_mapper,   s    z<test_dataframe_from_arrow_types_mapper.<locals>.types_mapperTFr   r   r   r      boolsints
small_ints)r0   r   r   ZInt64)r3   r4   r5   )r   r
   bool_int64Zint8ZRecordBatchZfrom_arraysr'   r	   ZSeriesr#   r(   r)   )
r0   Zbools_arrayZ
ints_arrayZsmall_ints_arrayZrecord_batchr,   r3   r4   r5   r!   r   r   r   &test_dataframe_from_arrow_types_mapper+   s     r8   c                 C   s   t d| dd i}t|}|djt| jjks<t	tjtj
g |djdg|jd}| }|d j| jks|t	t|| d S )Nr   r   r   )schema)r	   r#   r   r$   r%   r   r&   r   r   r   Zchunked_arrayr9   r'   r(   r)   r*   r   r   r    test_arrow_load_from_zero_chunks@   s    
 r:   c                  C   sN   t  } | tjddddd gdd}t jddddd gdd}t|| d S )	Nr   r   r      r7   r   ZUInt32r   )r	   ZUInt32Dtype__from_arrow__r   r
   r(   Zassert_extension_array_equal)r   r,   r!   r   r   r   test_arrow_from_arrow_uintN   s    r=   c                 C   s   t d| i}t|}|dd  }|jdd  jdd}t	|| |
| d }t|}|dd  }|jdd  jdd}t	|| d S )Nr   r   T)Zdropr   )r	   r#   r   r$   slicer'   ZilocZreset_indexr(   r)   Zfillna)r   r+   r$   r,   r!   Zdf2r   r   r   test_arrow_slicedY   s    

r?   c                 C   s\   t | }t|}tjddddg|d}t jdddg|d}t ddddg}||||fS )	zt
    Fixture returning actual and expected dtype, pandas and numpy arrays and
    mask from a given numpy dtype
    r   r   r   Nr   r   TF)npr   r   r   r
   )Zany_real_numpy_dtypenp_dtypeZpa_typepa_arraynp_expectedmask_expectedr   r   r   np_dtype_to_arraysj   s    

rE   c                 C   s  | \}}}}t ||\}}t|dd | t|| | d }| d }| d  }	t|	d }
tjj|j	t
|||
g|jd}|  t ||\}}t|dd | t|| d|j	jd  }t||	 }td}tjj|j	t
|||g|jd d}|  t ||\}}t|dd | t|| tjg |d	}tjg tjd	}tjj|j	d||g|jd}|  t ||\}}t|dd | t|| dS )
a&  
    Test conversion from pyarrow array to numpy array.

    Modifies the pyarrow buffer to contain padding and offset, which are
    considered valid buffers by pyarrow.

    Also tests empty pyarrow arrays with non empty buffers.
    See https://github.com/pandas-dev/pandas/issues/40896
    Nr   r   r       )r   lengthbuffersoffset      r   )r   r(   Zassert_numpy_array_equalrH   Z
to_pybytesr   Z	py_bufferArrayZfrom_buffersr   lenrI   validateZ	bit_widthr@   r
   r6   )rE   rA   rB   rC   rD   r   maskZmask_bufferZdata_bufferZdata_buffer_bytesZdata_buffer_trailZpa_array_trailrI   Zdata_buffer_offsetZmask_buffer_offsetZpa_array_offsetZnp_expected_emptyZmask_expected_emptyr   r   r   $test_pyarrow_array_to_numpy_and_mask|   sV    

rP   c              	   C   s:   t | d}tjtd d | j| W 5 Q R X d S )Nstring)match)r   r
   castpytestZraises	TypeErrorr   r<   )r   r    r   r   r   test_from_arrow_type_error   s    rV   )Znumpyr@   rT   Zpandasr	   Zpandas._testingZ_testingr(   Zimportorskipr   Z%pandas.core.arrays.arrow._arrow_utilsr   ZALL_INT_EA_DTYPESZarraysZFLOAT_EA_DTYPESr
   Zfixturer   r"   r-   r8   r:   r=   r?   rE   rP   rV   r   r   r   r   <module>   s(   
		
?