U
    饡c                     @   sp  d dl Z d dlmZ d dlmZ d dlZd dlmZ d dlm	Z	 d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlmZmZmZ i add Zd	d
 Zejdejdejdejdejdejdejdej dej!dej"dej#dddej$dej%diZ&dd Z'dd Z(dd Z)d d! Z*d"d# Z+d$d% Z,d&d' Z-d(d) Z.d*d+ Z/d,d- Z0d.d/ Z1d0d1 Z2d2d3 Z3d4d5 Z4dmd6d7Z5dnd:d;Z6d<d= Z7d>d? Z8d@dA Z9dodBdCZ:dDdE Z;dpdGdHZ<dIdJ ej=dK ej=dL  ej=dM  dNdg D Z>dqdOdPZ?dQdR Z@dSdT ZAdUdV ZBdWdX ZCdYdZ ZDd[d\ ZEdd]d]ej$ej%ejFejej#ejGd^	ZHd_d` ZIdadb ZJdcdd ZKdedf ZLdgdh ZMdidj ZNdkdl ZOdS )r    N)Sequence)futures)deepcopy)zip_longest)_pandas_apibuiltin_pickle	frombytesc                *   C   s   t st tjjdtjjdtjjdtjjdtjjdtjj	dtjj
dtjjdtjjd	tjjd
tjjdtjjdtjjdtjjdtjjdtjjdtjjdtjjdtjjdtjjdi t S )Nemptyboolint8int16int32int64uint8uint16uint32uint64Zfloat16float32float64datetimebytesunicode)_logical_type_mapupdatepalibZType_NAZ	Type_BOOLZ	Type_INT8Z
Type_INT16Z
Type_INT32Z
Type_INT64Z
Type_UINT8ZType_UINT16ZType_UINT32ZType_UINT64ZType_HALF_FLOATZ
Type_FLOATZType_DOUBLEZType_DATE32ZType_DATE64ZType_TIME32ZType_TIME64ZType_BINARYZType_FIXED_SIZE_BINARYZType_STRING r   r   9/tmp/pip-unpacked-wheel-qoi2rb4q/pyarrow/pandas_compat.pyget_logical_type_map)   sX                        r   c                 C   s   t  }z|| j W S  tk
r   t| tjjr6Y dS t| tjjrXdt	| j
 Y S t| tjjr|| jd k	rtdnd Y S t| tjjrY dS Y dS X d S )NZcategoricalzlist[{}]
datetimetzdatetimedecimalobject)r   idKeyError
isinstancer   r   ZDictionaryTypeZListTypeformatget_logical_typeZ
value_typeTimestampTypetzZDecimal128Type)
arrow_typeZlogical_type_mapr   r   r   r(   F   s    r(   r
   r   r   r   r   r   r   r   r   r   r   zdatetime64[D]r   stringr   c                 C   sj   zt | jj W S  tk
rd   t| jdr0Y dS t| jdkrDY dS t| }|dkr\Y dS | Y S X d S )Nr*   r    datetime64[ns]r,   r   )_numpy_logical_type_mapdtypetyper%   hasattrstrr   Zinfer_dtype)Zpandas_collectionresultr   r   r   get_logical_type_from_numpyi   s    
r4   c                 C   s   | j }t|dkrJt| d| }|d k	s*tt|j|jd}t|jj }n.t|drldt	j
|ji}d}nd }t|}||fS )Ncategorycat)Znum_categoriesorderedr*   timezoner-   )r/   r2   getattrAssertionErrorlen
categoriesr7   codesr1   r   r   tzinfo_to_stringr*   )columnr/   ZcatsmetadataZphysical_dtyper   r   r   get_extension_dtype_infox   s    
rA   c                 C   s   t |}t| \}}|dkr.|j|jd}d}|dk	rVt|tsVtd|t|j	|dksxt|tsxt
tt|||dkrdn||||dS )a  Construct the metadata for a given column

    Parameters
    ----------
    column : pandas.Series or pandas.Index
    name : str
    arrow_type : pyarrow.DataType
    field_name : str
        Equivalent to `name` when `column` is a `Series`, otherwise if `column`
        is a pandas Index then `field_name` will not be the same as `name`.
        This is the name of the field in the arrow Table's schema.

    Returns
    -------
    dict
    r"   )	precisionscaler#   Nz6Column name must be a string. Got column {} of type {}Nonename
field_namepandas_type
numpy_typer@   )r(   rA   rB   rC   r&   r2   	TypeErrorr'   r0   __name__r:   )r?   rF   r+   rG   Zlogical_typestring_dtypeextra_metadatar   r   r   get_column_metadata   s.     
rN   c              	   C   s  t dd |D }t |}|d||  }	||| d }
g }t| ||	D ]$\}}}t||||d}|| qJg }|dk	rdg }t||
|D ]X\}}}t|trq|jdk	rt|jts||j t|t|j||d}|| qt |dkrt	j
d| dtd	d
 g }t|jd|jg}t|jd|jjg}t||D ]\}}t||}|| qBng  } }}dt|||| dtjdtjddiS )a  Returns a dictionary containing enough metadata to reconstruct a pandas
    DataFrame as an Arrow Table, including index columns.

    Parameters
    ----------
    columns_to_convert : list[pd.Series]
    df : pandas.DataFrame
    index_levels : List[pd.Index]
    index_descriptors : List[Dict]
    preserve_index : bool
    types : List[pyarrow.DataType]

    Returns
    -------
    dict
    c                 S   s   g | ]}t |ts|qS r   )r&   dict).0descrr   r   r   
<listcomp>   s    
z&construct_metadata.<locals>.<listcomp>N)rF   r+   rG   Fr   z&The DataFrame has non-str index name `z@` which will be converted to string and not roundtrip correctly.   
stacklevellevelsnamess   pandaspyarrow)Zlibraryversion)index_columnscolumn_indexescolumnsZcreatorZpandas_versionutf8)r;   ziprN   appendr&   rO   rF   r2   _column_name_to_stringswarningswarnUserWarningr9   r\   _get_simple_index_descriptorjsondumpsr   __version__r   rY   encode)columns_to_convertdfcolumn_namesindex_levelsindex_descriptorspreserve_indextypesZnum_serialized_index_levelsZntypesZdf_typesZindex_typesZcolumn_metadatacolZsanitized_namer+   r@   Zindex_column_metadataZnon_str_index_nameslevelZ
descriptorr[   rV   rW   rF   r   r   r   construct_metadata   sr     


 
 	rr   c                 C   sT   t | \}}t| }d|kr,tjdtdd |dkrD|r<tddi}|||||dS )	NmixedzlThe DataFrame has column names of mixed type. They will be converted to strings and not roundtrip correctly.rS   rT   r   encodingUTF-8rE   )rA   r4   ra   rb   rc   r:   )rq   rF   rL   rM   rH   r   r   r   rd     s"     rd   c                 C   sf   t | tr| S t | tr"| dS t | tr>tttt| S t | trRtdn| dkr^dS t| S )a!  Convert a column name (or level) to either a string or a recursive
    collection of strings.

    Parameters
    ----------
    name : str or tuple

    Returns
    -------
    value : str or tuple

    Examples
    --------
    >>> name = 'foo'
    >>> _column_name_to_strings(name)
    'foo'
    >>> name = ('foo', 'bar')
    >>> _column_name_to_strings(name)
    "('foo', 'bar')"
    >>> import pandas as pd
    >>> name = (1, pd.Timestamp('2017-02-01 00:00:00'))
    >>> _column_name_to_strings(name)
    "('1', '2017-02-01 00:00:00')"
    r]   z%Unsupported type for MultiIndex levelN)	r&   r2   r   decodetuplemapr`   r   rJ   rF   r   r   r   r`   "  s    





r`   c                 C   s,   | j dk	r| j |krt| j S d|S dS )zReturn the name of an index level or a default name if `index.name` is
    None or is already a column name.

    Parameters
    ----------
    index : pandas.Index
    i : int

    Returns
    -------
    name : str
    Nz__index_level_{:d}__)rF   r`   r'   )indexirk   r   r   r   _index_level_nameI  s    
r|   c                 C   s:  t | ||}| jjs(tdt| j|d k	r<t| ||S g }|dk	rRt| jng }g }g }|D ]J}| | }	t	|}t
|	rtd|||	 |d  || qbg }
g }t|D ]`\}}t|||}t|t
jjr|d krt|}n"|| |d  |}|| |
| q|| }||||
|||fS )Nz Duplicate column names found: {}F-Sparse pandas data (column {}) not supported.)_resolve_columns_of_interestr\   	is_unique
ValueErrorr'   list$_get_columns_to_convert_given_schema_get_index_level_valuesrz   r`   r   	is_sparserJ   r_   	enumerater|   r&   pd
RangeIndex_get_range_index_descriptor)rj   schemarn   r\   rk   rl   ri   convert_fieldsrF   rp   rm   index_column_namesr{   index_levelrQ   	all_namesr   r   r   _get_columns_to_convert\  sT    






  r   c                 C   sF  g }g }g }g }g }g }|j D ]
}	z| |	 }
d}W n tk
r   zt| |	}
W n& ttfk
rx   td|	Y nX |dkrtd|	n$|dkrt|
tjj	rtd|	d}Y nX t
|	}	t|
rtd|	||	}||
 || ||	 |r||	 ||	 ||
 q|| }|||||||fS )z
    Specialized version of _get_columns_to_convert in case a Schema is
    specified.
    In that case, the Schema is used as the single point of truth for the
    table structure (types, which columns are included, order of columns, ...).
    FzNname '{}' present in the specified schema is not found in the columns or indexzlname '{}' present in the specified schema corresponds to the index, but 'preserve_index=False' was specifiedNa  name '{}' is present in the schema, but it is a RangeIndex which will not be converted as a column in the Table, but saved as metadata-only not in columns. Specify 'preserve_index=True' to force it being added as a column, or remove it from the specified schemaTr}   )rW   r%   _get_index_level
IndexErrorr'   r   r&   r   r   r   r`   r   rJ   fieldr_   )rj   r   rn   rk   ri   r   rm   r   rl   rF   rp   Zis_indexr   r   r   r   r   r     sj    








  r   c                 C   s8   |}|| j jkr,t|r,t|tdd }| j |S )z_
    Get the index level of a DataFrame given 'name' (column name in an arrow
    Schema).
    Z__index_level_)rz   rW   _is_generated_index_nameintr;   get_level_values)rj   rF   keyr   r   r   r     s    r   c                 C   s2   zt |  | W S  tk
r,   t|  Y S X d S N)re   rf   rJ   r2   ry   r   r   r   _level_name  s
    
r   c                 C   s.   dt | jt| dt| dt| ddS )Nrangestartstopstep)kindrF   r   r   r   )r   rF   r   Zget_rangeindex_attribute)rq   r   r   r   r     s    


r   c                    s(   t t d g} fddt|D S )NrV   c                    s   g | ]}  |qS r   )r   )rP   r{   rz   r   r   rR     s     z+_get_index_level_values.<locals>.<listcomp>)r;   r9   r   )rz   nr   r   r   r     s    r   c                    sP   |d k	r|d k	rt dn2|d k	r*|j}n"|d k	rF fdd|D }n j}|S )NzJSchema and columns arguments are mutually exclusive, pass only one of themc                    s   g | ]}| j kr|qS r   )r\   rP   crj   r   r   rR   	  s     
 z0_resolve_columns_of_interest.<locals>.<listcomp>)r   rW   r\   )rj   r   r\   r   r   r   r~     s    
r~   c                 C   s   t | d ||\}}}}}}}g }	|D ]}
|
j}t|rJtj|
ddj}nxt|rt|
tj	j
rl|
dn
|
d d }tj|ddj}n8t||
jd \}}tj||}|d krtj|
ddj}|	| q$t|| |||||	}||	|fS )NT)from_pandasr   )r   valuesr   is_categoricalr   arrayr0   Zis_extension_array_dtyper&   r   Seriesheadget_datetimetz_typer/   r   Z_ndarray_to_arrow_typer_   rr   )rj   rn   r\   r   rk   _rm   rZ   ri   ro   r   r   type_r	   r@   r   r   r   dataframe_to_types  sH    

 
     r      Tc           !   	      s:  t | |||\}}}}	}
}}|d krZt| t| j }}||d krV|dkrVt }nd}fdd dd }|dkr fddt||D }ng }t|J}t||D ]8\}}||jr|	 || q|	|
 || qW 5 Q R X t|D ] \}}t|tjr| ||< qd	d |D }|d krxg }t||D ].\}}|d k	rT|nd
}|	t|| q>t|}t|| ||
|	||}|jrt|jnt }|| ||}d }t|dkr0zN|	d d }|dkr|	d d }|	d d }|	d d } tt||| }W n tk
r.   Y nX |||fS )Nd   r   c              
      s   |d krd}d }n|j }|j}ztj| |d d}W nN tjtjtjfk
r } z$| jd| j	| j
f7  _|W 5 d }~X Y nX |s|jdkrtdt||j|S )NT)r0   r   safez0Conversion failed for column {!s} with type {!s}r   z>Field {} was non-nullable but pandas column had {} null values)Znullabler0   r   r   ZArrowInvalidZArrowNotImplementedErrorZArrowTypeErrorargsr'   rF   r/   Z
null_countr   r2   )rp   r   Zfield_nullabler   r3   e)r   r   r   convert_columnG  s,    
 
z+dataframe_to_arrays.<locals>.convert_columnc                 S   s$   t | tjo"| jjo"t| jjtjS r   )	r&   npZndarrayflags
contiguous
issubclassr/   r0   integer)arrr   r   r   _can_definitely_zero_copy]  s
    z6dataframe_to_arrays.<locals>._can_definitely_zero_copyc                    s   g | ]\}} ||qS r   r   )rP   r   f)r   r   r   rR   c  s   z'dataframe_to_arrays.<locals>.<listcomp>c                 S   s   g | ]
}|j qS r   r0   rP   xr   r   r   rR   r  s     rD   r   r   r   r   r   r   )r   r;   r\   r   	cpu_countr^   r   ZThreadPoolExecutorr   r_   Zsubmitr   r&   ZFuturer3   r   r   rr   r@   r   rO   r   with_metadatar   r   )!rj   r   rn   Znthreadsr\   r   r   rk   r   rm   rZ   ri   r   ZnrowsZncolsr   Zarraysexecutorr   r   r{   Z	maybe_futro   fieldsrF   r   pandas_metadatar@   Zn_rowsr   r   r   r   r   )r   r   r   dataframe_to_arrays2  sz    


 

     


r   c                 C   s^   | j jtjkr| |fS t|rB|d krB|j}|j}t	||}n|d krVt
| j }| |fS r   )r/   r0   r   Z
datetime64r   is_datetimetzr*   unitr   	timestampZfrom_numpy_dtype)r   r/   r   r*   r   r   r   r   r     s    r   c                 C   s   | j }g }dd |jD }|jD ]}|j}i }t|jr^tj	|j
|d< t|dr|j}n"t|r|j|j|jd |j}|j|jj|d |jttkrd |d< tj|tjd|d	< || q ||d
S )Nc                 S   s   g | ]}|qS r   r   )rP   Zaxr   r   r   rR     s     z0dataframe_to_serialized_dict.<locals>.<listcomp>r8   r   )
dictionaryr7   )	placementblockr#   )protocolr   )blocksaxes)_datar   r   r   r   r   r/   r   r   r>   r*   r1   r   r   r<   r7   r=   Zmgr_locsZas_arrayr   r#   r   rf   HIGHEST_PROTOCOLr_   )frameZblock_managerr   r   r   r   Z
block_datar   r   r   dataframe_to_serialized_dict  s:    


 
r   c                 C   s>   dd l m  m} dd | d D }||| d }t|S )Nr   c                 S   s   g | ]}t |qS r   _reconstruct_block)rP   r   r   r   r   rR     s   z0serialized_dict_to_dataframe.<locals>.<listcomp>r   r   )pandas.core.internalscore	internalsBlockManagerr   Z
data_frame)data_intZreconstructed_blocksZ	block_mgrr   r   r   serialized_dict_to_dataframe  s    r   c                 C   s  ddl m  m} | dd}| d }d| krXtjj|| d | d d}|j||d}nd	| krt| d	 }|j|||j	|d
}nd| kr|jt
||d}npd| kr| d }	t|dkst||d  }
||
 }t|dstd||	}|j||d}n|j||d}|S )a  
    Construct a pandas Block from the `item` dictionary coming from pyarrow's
    serialization or returned by arrow::python::ConvertTableToPandas.

    This function takes care of converting dictionary types to pandas
    categorical, Timestamp-with-timezones to the proper pandas Block, and
    conversion to pandas ExtensionBlock

    Parameters
    ----------
    item : dict
        For basic types, this is a dictionary in the form of
        {'block': np.ndarray of values, 'placement': pandas block placement}.
        Additional keys are present for other types (dictionary, timezone,
        object).
    columns :
        Column names of the table being constructed, used for extension types
    extension_columns : dict
        Dictionary of {column_name: pandas_dtype} that includes all columns
        and corresponding dtypes that will be converted to a pandas
        ExtensionBlock.

    Returns
    -------
    pandas Block

    r   Nr   r   r   r7   )r<   r7   )r   r8   )r   klassr/   r#   Zpy_arrayr   __from_arrow__zGThis column does not support to be converted to a pandas ExtensionArray)r   r   r   getr   Zcategorical_typeZ
from_codesZ
make_blockmake_datetimetzZDatetimeTZBlockr   loadsr;   r:   r1   r   r   )itemr\   extension_columnsr   Z	block_arrr   r6   r   r/   r   rF   pandas_dtypeZ
pd_ext_arrr   r   r   r     s>     


r   c                 C   s   t j| } tjd| dS )Nnsr*   )r   r   string_to_tzinfor   Zdatetimetz_typer   r   r   r   r     s    r   Fc                 C   s   ddl m} g }g }|jj}|sl|d k	rl|d }|dg }|d }	t||}t||	|\}}
t|||}ntj	
|j}
t|g |}t| t|||}t| |||}||
g}|||S )Nr   )r   r\   r[   rZ   )r   r   r   r   r   _add_any_metadata_reconstruct_index_get_extension_dtypesr   r   r   num_rows'_check_data_column_metadata_consistency_deserialize_column_index_table_to_blocks)optionstabler<   Zignore_metadatatypes_mapperr   all_columnsr[   r   rm   rz   Zext_columns_dtypesr\   r   r   r   r   r   table_to_blockmanager  s0    
  r   c                 C   s   h | ]}t t|qS r   )r2   r   r/   )rP   typr   r   r   	<setcomp><  s   r   r   Zuintfloatr#   c           
   	   C   s   i }t jdkr|S |D ]f}z|d }W n tk
rB   |d }Y nX |d }|tkrt |}t|t jrt|dr|||< q| jD ]B}|j}	t|	t	j
rz|	 }W n tk
r   Y qX |||j< q|r| jD ]$}|j}	||	}|dk	r|||j< q|S )a  
    Based on the stored column pandas metadata and the extension types
    in the arrow schema, infer which columns should be converted to a
    pandas extension dtype.

    The 'numpy_type' field in the column metadata stores the string
    representation of the original pandas dtype (and, despite its name,
    not the 'pandas_type' field).
    Based on this string representation, a pandas/numpy dtype is constructed
    and then we can check if this dtype supports conversion from arrow.

    NrG   rF   rI   r   )r   Zextension_dtyper%   _pandas_supported_numpy_typesr   r&   r1   r   r0   r   ZBaseExtensionTypeZto_pandas_dtypeNotImplementedErrorrF   )
r   Zcolumns_metadatar   Zext_columnscol_metarF   r/   r   r   r   r   r   r   r   C  s:    





r   c                 C   s   t dd | D std S )Nc                 s   s.   | ]&}|d  dkrd|kp$|d  dk	V  qdS )rF   NrG   r   r   r   r   r   	<genexpr>  s   z:_check_data_column_metadata_consistency.<locals>.<genexpr>)allr:   )r   r   r   r   r   |  s    r   c                    s   dd | j D }|r6dd |D   fdd|D }n|}t|dkrLtjndd }|sftj|}n*tjjjt	t
||d	d |D pd d
}t|dkrt||}t|}|S )Nc                 S   s"   g | ]}t |trt|n|qS r   )r&   r   r   r   r   r   r   rR     s   z-_deserialize_column_index.<locals>.<listcomp>c                 S   s&   i | ]}| d t|d |d qS rG   rF   )r   r`   r   r   r   r   
<dictcomp>  s    z-_deserialize_column_index.<locals>.<dictcomp>c                    s   g | ]}  ||qS r   r   )rP   rF   Zcolumns_name_dictr   r   rR     s    r   c                 S   s   | fS r   r   )r   r   r   r   <lambda>      z+_deserialize_column_index.<locals>.<lambda>c                 S   s   g | ]}|d  qS ry   r   )rP   	col_indexr   r   r   rR     s     rW   r   )rk   r;   astliteral_evalr   r   Index
MultiIndexfrom_tuplesr   rx   "_reconstruct_columns_from_metadata _flatten_single_level_multiindex)block_tabler   r[   Zcolumn_stringsZcolumns_valuesZto_pairr\   r   r   r   r     s,    

r   c                 C   s,  dd |D }g }g }| }|D ]}t |trLt| |||\}}}	|d krqnZ|d dkr|d }	tjj|d |d |d |	d	}t|t| krqntd
|d |	| |	|	 qtj}
t|dkr|
j
j||d}nDt|dkr|d }t ||
js$|
j||d d}n|
| j}||fS )Nc                 S   s   i | ]}| d |d |qS r   r   r   r   r   r   r     s    z&_reconstruct_index.<locals>.<dictcomp>r   r   rF   r   r   r   )r   rF   zUnrecognized index kind: {}r   r   r   ry   )r&   r2   _extract_index_levelr   r   r   r;   r   r'   r_   r  from_arraysr  r   )r   rm   r   field_name_to_metadataZindex_arraysZindex_namesresult_tablerQ   r   
index_namer   rz   r   r   r   r     sN    
   

r   c                 C   s   || d }t ||}| j|}|dkr4|d d fS tj}| |}| j}	t|	drh|	j	j
sh|	 }	t|jtjjr|jjd k	rt||	|jj}
n|j|	|	jd}
||j|}||
|fS )NrF   r   )r/   ) _backwards_compatible_index_namer   get_field_indexr   r   r?   	to_pandasr   r1   r   Z	writeablecopyr&   r0   r   r   r)   r*   make_tz_awarer   r/   Zremove_column)r   r  rG   r  logical_namer  r{   r   rp   r   r   r   r   r   r	    s"    




r	  c                 C   s   | |krt | rdS |S dS )a1  Compute the name of an index column that is compatible with older
    versions of :mod:`pyarrow`.

    Parameters
    ----------
    raw_name : str
    logical_name : str

    Returns
    -------
    result : str

    Notes
    -----
    * Part of :func:`~pyarrow.pandas_compat.table_to_blockmanager`
    N)r   )raw_namer  r   r   r   r    s    r  c                 C   s   d}t || d k	S )Nz^__index_level_\d+__$)rematch)rF   patternr   r   r   r     s    r   r-   )	r   r!   r    r   r   r,   r   Zfloatingr	   c                 C   s@   z
t |  W S  tk
r:   d| kr,tj Y S t|  Y S X dS )a  Get the numpy dtype that corresponds to a pandas type.

    Parameters
    ----------
    pandas_type : str
        The result of a call to pandas.lib.infer_dtype.

    Returns
    -------
    dtype : np.dtype
        The dtype that corresponds to `pandas_type`.
    rs   N)_pandas_logical_type_mapr%   r   object_r/   )rH   r   r   r   _pandas_type_to_numpy_type-  s    

r  c                 C   s,   t | tjjr$t| dr| jS | jS d S d S )Nr=   )r&   r   r   r  r1   r=   labels)mir   r   r   _get_multiindex_codesC  s    r  c                    s  t j t| ddp| g}t| p0 fdd|D }dd t||i dD }g }tdd}|D ]\}}}	t|}
|
tj	kr|
|}|d	krtj|d
 d d }||	}|d|}n|j|
kr||
}|j|	kr|d	kr||	}|| q^ j||| jdS )a_  Construct a pandas MultiIndex from `columns` and column index metadata
    in `column_indexes`.

    Parameters
    ----------
    columns : List[pd.Index]
        The columns coming from a pyarrow.Table
    column_indexes : List[Dict[str, str]]
        The column index metadata deserialized from the JSON schema metadata
        in a :class:`~pyarrow.Table`.

    Returns
    -------
    result : MultiIndex
        The index reconstructed using `column_indexes` metadata with levels of
        the correct type.

    Notes
    -----
    * Part of :func:`~pyarrow.pandas_compat.table_to_blockmanager`
    rV   Nc                    s   g | ]}  t|qS r   )r   r;   )rP   rq   r   r   r   rR   e  s    z6_reconstruct_columns_from_metadata.<locals>.<listcomp>c                 S   s0   g | ](\}}|| d t|j| ddfqS )rH   rI   N)r   r2   r/   )rP   rq   r   r   r   r   rR   j  s   
)	fillvaluerh   ru   r    r   r@   r8   utcr   )r   r   r9   r  r   operatormethodcallerr  r   bytes_rx   r   r   r   Zastypetz_localize
tz_convertr/   r_   r  rW   )r\   r[   rV   r  Zlevels_dtypesZ
new_levelsencoderrq   r   Znumpy_dtyper/   r*   dtr   r  r   r  K  s<      





r  c                    s4   |j  tj| ||t } fdd|D S )Nc                    s   g | ]}t | qS r   r   )rP   r   r\   r   r   r   rR     s   z$_table_to_blocks.<locals>.<listcomp>)rk   r   r   Ztable_to_blocksr   keys)r   r  r<   r   r3   r   r)  r   r     s    
r   c                    sj   t j}t| |jrf| jdkrf| j\ t| \} j}| jsBt	d|j
 fdd|D || jd dS | S )Nr   zFound non-unique column indexc                    s    g | ]}|d kr | ndqS )r  Nr   )rP   Z_labelrV   r   r   rR     s     z4_flatten_single_level_multiindex.<locals>.<listcomp>r   )r/   rF   )r   r   r&   r  ZnlevelsrV   r  r/   r   r   r  rW   )rz   r   r  r/   r   r+  r   r    s    
r  c                 C   s  i }i }| j }|d }dd |D }t|}t|d | }t|d D ]\}}	|	d}
|
s|	d }
||krz|||  }
|
d krd}
||
}|dkrH|	d	 d
krH| | }t|jtjj	sqH|	d }|sqH|d}|rH||jj
krH| }tjd|d}tjj||d}t|| j|||< |||< qHt|dkrg }g }tt| j D ]L}||kr||||  |||  n|| |  || j |  qPtjj|t |dS | S d S )NrZ   c                 S   s   g | ]}t |tr|qS r   )r&   r2   )rP   Zidx_colr   r   r   rR     s    
z%_add_any_metadata.<locals>.<listcomp>r\   rG   rF   rD   r  rH   r    r@   r8   r   r   r   r   )r   )r   r;   r   r   r  r&   r0   r   r   r)   r*   r  r   Arrayr   r   rF   r   r_   ZTabler
  )r   r   Zmodified_columnsZmodified_fieldsr   rZ   Zn_index_levelsZ	n_columnsr{   r   r  idxrp   r@   Zmetadata_tzZ	convertedZtz_aware_typer   r\   r   r   r   r   r     s\    




r   c                 C   s$   t j|}| jdj|} | S )zB
    Make a datetime64 Series timezone-aware for the given tz
    r!  )r   r   r   r(  r%  r&  )Zseriesr*   r   r   r   r    s
    r  )N)r   NT)NN)NFN)N)Pr  collections.abcr   Z
concurrentr   Zconcurrent.futures.threadr  r   	itertoolsr   re   r"  r  ra   Znumpyr   rX   r   Zpyarrow.libr   r   r   r   r   r(   Zbool_r   r   r   r   r   r   r   r   r   r   Zunicode_r$  r.   r4   rA   rN   rr   rd   r`   r|   r   r   r   r   r   r   r~   r   r   r   r   r   r   r   r   Zsctypesr   r   r   r   r   r	  r  r   Zstr_r  r  r  r  r  r   r  r   r  r   r   r   r   <module>   s                 -V'@@	
"  
b%	
>	    

9(6BA