o
    �¨Êh‘,  ã                   @  sÌ   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	m
Z
 d dlmZmZ d dlm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mZ d dlmZ er\d dlmZ G dd„ deƒZdS )é    )Úannotations)ÚTYPE_CHECKINGN)Úusing_pyarrow_string_dtype)Úlib)Úimport_optional_dependency)ÚParserErrorÚParserWarning)Úfind_stack_level)Úpandas_dtype)Ú
is_integer)Ú	DataFrame)Ú_arrow_dtype_mappingÚarrow_string_types_mapper)Ú
ParserBase)Ú
ReadBufferc                      sT   e Zd ZdZd‡ fdd„Zddd	„Zdd
d„Zddd„Zddd„Zddd„Z	‡  Z
S )ÚArrowParserWrapperz7
    Wrapper for the pyarrow engine for read_csv()
    ÚsrcúReadBuffer[bytes]ÚreturnÚNonec                   s$   t ƒ  |¡ || _|| _|  ¡  d S ©N)ÚsuperÚ__init__Úkwdsr   Ú_parse_kwds)Úselfr   r   ©Ú	__class__© úX/var/www/html/env/lib/python3.10/site-packages/pandas/io/parsers/arrow_parser_wrapper.pyr   %   s   zArrowParserWrapper.__init__c                 C  sN   | j  d¡}|du rdn|| _| j d }t|tƒrtdƒ‚t| j d ƒ| _dS )z?
        Validates keywords before passing to pyarrow.
        ÚencodingNzutf-8Ú	na_valuesz?The pyarrow engine doesn't support passing a dict for na_values)r   Úgetr    Ú
isinstanceÚdictÚ
ValueErrorÚlistr!   )r   r    r!   r   r   r   r   ,   s   

ÿzArrowParserWrapper._parse_kwdsc                 C  s�  dddddddœ}|  ¡ D ]\}}|| jv r'| j |¡dur'| j |¡| j|< q| j}t|tƒr4|g}nd}|| jd	< d
d„ | j  ¡ D ƒ| _| j d¡}|dur„t|ƒrZ|| jd< n*|t	j
jkrfd| jd< n|t	j
jkrwddd„}|| jd< n|t	j
jkr„dd„ | jd< dd„ | j  ¡ D ƒ| _d| jd v | jd< | jdu r°d| jv r°dd„ | jd D ƒ| jd< | jdu | jdur¼| jn| jd | jdœ| _dS )z:
        Rename some arguments to pass to pyarrow
        Úinclude_columnsÚnull_valuesÚescape_charÚignore_empty_linesÚdecimal_pointÚ
quote_char)Úusecolsr!   Ú
escapecharÚskip_blank_linesÚdecimalÚ	quotecharNÚtimestamp_parsersc                 S  ó&   i | ]\}}|d ur|dv r||“qS )N)Ú	delimiterr,   r)   r*   r   ©Ú.0Úoption_nameÚoption_valuer   r   r   Ú
<dictcomp>Y   ó    ÿýz;ArrowParserWrapper._get_pyarrow_options.<locals>.<dictcomp>Úon_bad_linesÚinvalid_row_handlerr   Ústrc                 S  s.   t jd| j› d| j› d| j› �ttƒ d� dS )Nz	Expected z columns, but found z: )Ú
stacklevelÚskip)ÚwarningsÚwarnÚexpected_columnsÚactual_columnsÚtextr   r	   )Úinvalid_rowr   r   r   Úhandle_warningk   s   
ÿÿüz?ArrowParserWrapper._get_pyarrow_options.<locals>.handle_warningc                 S  s   dS )Nr?   r   )Ú_r   r   r   Ú<lambda>v   s    z9ArrowParserWrapper._get_pyarrow_options.<locals>.<lambda>c                 S  r3   )N)r'   r(   Útrue_valuesÚfalse_valuesr+   r2   r   r5   r   r   r   r9   x   r:   Ú Ústrings_can_be_nullc                 S  s   g | ]}d |› �‘qS )Úfr   )r6   Únr   r   r   Ú
<listcomp>‰   s    
ÿz;ArrowParserWrapper._get_pyarrow_options.<locals>.<listcomp>Úskiprows)Úautogenerate_column_namesÚ	skip_rowsr    )r   r=   )Úitemsr   r"   ÚpopÚdate_formatr#   r=   Úparse_optionsÚcallabler   ÚBadLineHandleMethodÚERRORÚWARNÚSKIPÚconvert_optionsÚheaderr    Úread_options)r   ÚmappingÚpandas_nameÚpyarrow_namerU   r;   rF   r   r   r   Ú_get_pyarrow_options:   s^   ú€

þþÿ
	þÿ
ÿûz'ArrowParserWrapper._get_pyarrow_optionsÚframer   c              
     sð  t ˆ jƒ}d}| jdu r7| jdu r| jdu rt|ƒ| _t | jƒ|kr3tt|t | jƒ ƒƒ| j | _d}| jˆ _|  ˆ jˆ ¡\}‰ | jdur½| j ¡ }t	| jƒD ]S\}}t
|ƒr_ˆ j| ||< n|ˆ jvrltd|› d�ƒ‚| jdur¢| j |¡dur�|| j |¡fnˆ j| | j ˆ j| ¡f\}}	|	dur¢ˆ |  |	¡ˆ |< | j|= qOˆ j|ddd� | jdu r½|s½dgt ˆ jjƒ ˆ j_| jduröt| jtƒrÖ‡ fdd„| j ¡ D ƒ| _nt| jƒ| _z	ˆ  | j¡‰ W ˆ S  tyõ }
 zt|
ƒ‚d}
~
ww ˆ S )	z÷
        Processes data read in based on kwargs.

        Parameters
        ----------
        frame: DataFrame
            The DataFrame to process.

        Returns
        -------
        DataFrame
            The processed DataFrame.
        TNFzIndex z invalid)ÚdropÚinplacec                   s$   i | ]\}}|ˆ j v r|t|ƒ“qS r   )Úcolumnsr
   )r6   ÚkÚv©rc   r   r   r9   Ð   s
    
þz>ArrowParserWrapper._finalize_pandas_output.<locals>.<dictcomp>)Úlenrf   r]   ÚnamesÚranger&   Ú_do_date_conversionsÚ	index_colÚcopyÚ	enumerater   r%   Údtyper"   ÚastypeÚ	set_indexÚindexr#   r$   rS   r
   Ú	TypeError)r   rc   Únum_colsÚmulti_index_namedrG   Úindex_to_setÚiÚitemÚkeyÚ	new_dtypeÚer   ri   r   Ú_finalize_pandas_output•   sX   








ÿý€


þý€þz*ArrowParserWrapper._finalize_pandas_outputc                 C  s8   t  |¡rtdd„ |D ƒƒstdƒ‚t|ƒrtdƒ‚d S )Nc                 s  ó   � | ]}t |tƒV  qd S r   ©r#   r=   ©r6   Úxr   r   r   Ú	<genexpr>ß   s   € z7ArrowParserWrapper._validate_usecols.<locals>.<genexpr>zwThe pyarrow engine does not allow 'usecols' to be integer column positions. Pass a list of string column names instead.z=The pyarrow engine does not allow 'usecols' to be a callable.)r   Úis_list_likeÚallr%   rW   )r   r-   r   r   r   Ú_validate_usecolsÞ   s   ÿÿÿz$ArrowParserWrapper._validate_usecolsc              
   C  sÂ  t dƒ}t dƒ}|  ¡  z|jdi | j¤Ž}W n2 tyI   | j dd¡}|dur.|  |¡ | j dtƒ ¡}t 	|¡rDt
dd„ |D ƒƒsHtdƒ‚‚ w z|j| j|jdi | j¤Ž|jdi | j¤Ž|d	�}W n |jyv } zt|ƒ|‚d}~ww | jd
 }|tju rª|j}	| ¡ }
t|jjƒD ]\}}|j |¡r¤|	 ||	 |¡ |
¡¡}	qŽ| |	¡}|dkr¶|jtjd�}n&|dkrÍt ƒ }t !¡ || "¡ < |j|jd�}nt#ƒ rØ|jt$ƒ d�}n| ¡ }|  %|¡S )zÿ
        Reads the contents of a CSV file into a DataFrame and
        processes it according to the kwargs passed in the
        constructor.

        Returns
        -------
        DataFrame
            The DataFrame created from the CSV file.
        Úpyarrowzpyarrow.csvr'   Nr(   c                 s  r   r   r€   r�   r   r   r   rƒ      s   € 

ÿz*ArrowParserWrapper.read.<locals>.<genexpr>z9The 'pyarrow' engine requires all na_values to be strings)r^   rV   r\   Údtype_backend)Útypes_mapperÚnumpy_nullabler   )&r   rb   ÚConvertOptionsr\   ru   r"   r†   Úsetr   r„   r…   Úread_csvr   ÚReadOptionsr^   ÚParseOptionsrV   ÚArrowInvalidr   r   Ú
no_defaultÚschemaÚfloat64rp   ÚtypesÚis_nullÚfieldÚ	with_typeÚcastÚ	to_pandasÚpdÚ
ArrowDtyper   Ú
Int64DtypeÚnullr   r   r~   )r   ÚpaÚpyarrow_csvr\   ÚincludeÚnullsÚtabler}   rˆ   Ú
new_schemaÚnew_typery   Ú
arrow_typerc   Údtype_mappingr   r   r   Úreadé   sd   
ÿÿó
ü
€ÿ

ÿ€

zArrowParserWrapper.read)r   r   r   r   )r   r   )rc   r   r   r   )r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   rb   r~   r†   r§   Ú__classcell__r   r   r   r   r       s    


[
Ir   )Ú
__future__r   Útypingr   r@   Úpandas._configr   Úpandas._libsr   Úpandas.compat._optionalr   Úpandas.errorsr   r   Úpandas.util._exceptionsr	   Úpandas.core.dtypes.commonr
   Úpandas.core.dtypes.inferencer   Úpandasrš   r   Úpandas.io._utilr   r   Úpandas.io.parsers.base_parserr   Úpandas._typingr   r   r   r   r   r   Ú<module>   s"    