a
    é´«jH+  ã                   @  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
mZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ er d dlmZ d dlmZ G dd„ deƒZdS )é    )Úannotations)ÚTYPE_CHECKINGN)Úlib)Úimport_optional_dependency)ÚParserErrorÚParserWarning)Úfind_stack_level)Úpandas_dtype)Ú
is_integer)Úarrow_table_to_pandas)Ú
ParserBase)Ú
ReadBuffer)Ú	DataFramec                      sp   e Zd ZdZdddœ‡ fdd„Zddœdd	„Zddœd
d„Zdddœdd„Zddœdd„Zddœdd„Z	‡  Z
S )ÚArrowParserWrapperz7
    Wrapper for the pyarrow engine for read_csv()
    zReadBuffer[bytes]ÚNone)ÚsrcÚreturnc                   s$   t ƒ  |¡ || _|| _|  ¡  d S ©N)ÚsuperÚ__init__Úkwdsr   Ú_parse_kwds)Úselfr   r   ©Ú	__class__© úe/var/www/html/laksyashrimp/venv/lib/python3.9/site-packages/pandas/io/parsers/arrow_parser_wrapper.pyr      s    zArrowParserWrapper.__init__©r   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 ]4\}}|| jv r| j |¡dur| j |¡| j|< q| j}t|tƒrh|g}nd}|| jd	< d
d„ | j  ¡ D ƒ| _| j d¡}|du�rt|ƒr¶|| jd< nZ|t	j
jkrÎd| jd< nB|t	j
jkrôddœ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 �rld| jv �rld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   Ú
escapecharZskip_blank_linesÚdecimalÚ	quotecharNÚtimestamp_parsersc                 S  s&   i | ]\}}|d ur|dv r||“qS )N)Ú	delimiterr*   r'   r(   r   ©Ú.0Zoption_nameZoption_valuer   r   r   Ú
<dictcomp>S   s   ÿýz;ArrowParserWrapper._get_pyarrow_options.<locals>.<dictcomp>Úon_bad_linesZinvalid_row_handlerÚstrr   c                 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ÚwarnZexpected_columnsZactual_columnsÚtextr   r   )Zinvalid_rowr   r   r   Úhandle_warninge   s    
ÿÿüz?ArrowParserWrapper._get_pyarrow_options.<locals>.handle_warningc                 S  s   dS )Nr7   r   )Ú_r   r   r   Ú<lambda>p   ó    z9ArrowParserWrapper._get_pyarrow_options.<locals>.<lambda>c                 S  s&   i | ]\}}|d ur|dv r||“qS )N)r%   r&   Ztrue_valuesZfalse_valuesr)   r/   r   r1   r   r   r   r3   r   s   ÿýÚ Zstrings_can_be_nullc                 S  s   g | ]}d |› �‘qS )Úfr   )r2   Únr   r   r   Ú
<listcomp>ƒ   s   z;ArrowParserWrapper._get_pyarrow_options.<locals>.<listcomp>Zskiprows)Zautogenerate_column_namesZ	skip_rowsr   )Úitemsr   r    ÚpopÚdate_formatr!   r5   Úparse_optionsÚcallabler   ZBadLineHandleMethodÚERRORÚWARNZSKIPÚconvert_optionsÚheaderr   Úread_options)r   ÚmappingZpandas_nameZpyarrow_namerE   r4   r;   r   r   r   Ú_get_pyarrow_options4   s\    ú

þ
þÿ	þÿÿ
ûz'ArrowParserWrapper._get_pyarrow_optionsr   )Úframer   c              
     s  t ˆ jƒ}d}| jdu rx| jdu r6| jdu r6t|ƒ| _t | jƒ|krpdd„ t|t | jƒ ƒD ƒ}|| j | _d}| jˆ _|  ˆ jˆ ¡\}‰ | jdu�rŒ| j ¡ }t| jƒD ]¨\}}t	|ƒrÊˆ j| ||< n|ˆ jvrät
d|› d�ƒ‚| jdurª| j |¡du�r|| j |¡fnˆ j| | j ˆ j| ¡f\}	}
|
durªˆ |	  |
¡ˆ |	< | j|	= qªˆ 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 n. t�y } zt
|ƒ‚W Y d}~n
d}~0 0 ˆ S )z÷
        Processes data read in based on kwargs.

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

        Returns
        -------
        DataFrame
            The processed DataFrame.
        TNc                 S  s   g | ]}t |ƒ‘qS r   )r5   ©r2   Úxr   r   r   rB   ¨   r>   z>ArrowParserWrapper._finalize_pandas_output.<locals>.<listcomp>FzIndex z invalid)ZdropZinplacec                   s$   i | ]\}}|ˆ j v r|t|ƒ“qS r   )Úcolumnsr	   )r2   ÚkÚv©rO   r   r   r3   Ë   s   
þz>ArrowParserWrapper._finalize_pandas_output.<locals>.<dictcomp>)ÚlenrR   rK   ÚnamesÚrangeZ_do_date_conversionsZ	index_colÚcopyÚ	enumerater
   r#   Zdtyper    ZastypeZ	set_indexÚindexr!   r"   rC   r	   Ú	TypeError)r   rO   Znum_colsZmulti_index_namedZcolumns_prefixr<   Zindex_to_setÚiÚitemÚkeyZ	new_dtypeÚer   rU   r   Ú_finalize_pandas_output�   sR    







ÿý

þ
z*ArrowParserWrapper._finalize_pandas_outputc                 C  s:   t  |¡r&tdd„ |D ƒƒs&tdƒ‚nt|ƒr6tdƒ‚d S )Nc                 s  s   | ]}t |tƒV  qd S r   ©r!   r5   rP   r   r   r   Ú	<genexpr>Ú   r>   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#   rG   )r   r+   r   r   r   Ú_validate_usecolsÙ   s    ÿÿz$ArrowParserWrapper._validate_usecolsc              
   C  sº  t dƒ}t dƒ}|  ¡  z|jf i | j¤Ž}W nh ty–   | j dd¡}|dur\|  |¡ | j dtƒ ¡}t 	|¡rˆt
dd„ |D ƒƒs�tdƒ‚‚ Y n0 z4|j| j|jf i | j¤Ž|jf i | j¤Ž|d	�}W n0 |jyü } zt|ƒ|‚W Y d}~n
d}~0 0 | jd
 }|tju �rj|j}	| ¡ }
t|jjƒD ]0\}}|j |¡�r.|	 ||	 |¡ |
¡¡}	�q.| |	¡}t ¡ �, t ddt ¡ t!||dd�}W d  ƒ n1 �s¦0    Y  |  "|¡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.
        Zpyarrowzpyarrow.csvr%   Nr&   c                 s  s   | ]}t |tƒV  qd S r   rb   rP   r   r   r   rc   û   s   z*ArrowParserWrapper.read.<locals>.<genexpr>z9The 'pyarrow' engine requires all na_values to be strings)rL   rF   rJ   Údtype_backendÚignorezmake_block is deprecatedT)rg   Znull_to_int64)#r   rN   ZConvertOptionsrJ   r\   r    rf   Úsetr   rd   re   Zread_csvr   ZReadOptionsrL   ZParseOptionsrF   ZArrowInvalidr   r   Z
no_defaultZschemaZfloat64rZ   ÚtypesZis_nullÚfieldZ	with_typeÚcastr8   Úcatch_warningsÚfilterwarningsÚDeprecationWarningr   ra   )r   ÚpaZpyarrow_csvrJ   ÚincludeZnullsÚtabler`   rg   Z
new_schemaÚnew_typer]   Z
arrow_typerO   r   r   r   Úreadä   s\    
ÿÿü
 
ÿ

ýÿ&zArrowParserWrapper.read)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   rN   ra   rf   rt   Ú__classcell__r   r   r   r   r      s   [Jr   )Ú
__future__r   Útypingr   r8   Zpandas._libsr   Zpandas.compat._optionalr   Zpandas.errorsr   r   Zpandas.util._exceptionsr   Zpandas.core.dtypes.commonr	   Zpandas.core.dtypes.inferencer
   Zpandas.io._utilr   Zpandas.io.parsers.base_parserr   Zpandas._typingr   Zpandasr   r   r   r   r   r   Ú<module>   s   