a
    é´«jY\  ã                   @  sØ  d Z ddlmZ ddlZddlZddlZddlmZmZm	Z	 ddl
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 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#m$Z$m%Z%m&Z&m'Z' e�rddl(m)Z)m*Z*m+Z+m,Z,m-Z- dddœdd„Z.d:dddddddœdd „Z/G d!d„ dƒZ0G d"d#„ d#e0ƒZ1G d$d%„ d%e0ƒZ2eed& d'�d;d*d+dd,d-dd.dd/d0œ	d1d2„ƒZ3eed& d'�d(ddej4ej4ddfd3dd.dd4d5dd6d*d7œ	d8d9„ƒZ5dS )<z parquet compat é    )ÚannotationsN)ÚTYPE_CHECKINGÚAnyÚLiteral)Úcatch_warningsÚfilterwarnings)Ú_get_option)Úlib)Úimport_optional_dependency©ÚAbstractMethodError)Údoc)Úfind_stack_level)Úcheck_dtype_backend)Ú	DataFrameÚ
get_option)Ú_shared_docs)Úarrow_table_to_pandas)Ú	IOHandlesÚ
get_handleÚis_fsspec_urlÚis_urlÚstringify_path)ÚDtypeBackendÚFilePathÚ
ReadBufferÚStorageOptionsÚWriteBufferÚstrÚBaseImpl)ÚengineÚreturnc                 C  s¦   | dkrt dƒ} | dkr~ttg}d}|D ]F}z|ƒ W   S  tyl } z|dt|ƒ 7 }W Y d}~q(d}~0 0 q(td|› �ƒ‚| dkrŒtƒ S | dkrštƒ S td	ƒ‚dS )
zreturn our implementationÚautozio.parquet.engineÚ z
 - NzÉUnable to find a usable engine; tried using: 'pyarrow', 'fastparquet'.
A suitable version of pyarrow or fastparquet is required for parquet support.
Trying to import the above resulted in these errors:ÚpyarrowÚfastparquetz.engine must be one of 'pyarrow', 'fastparquet')r   ÚPyArrowImplÚFastParquetImplÚImportErrorr   Ú
ValueError)r    Zengine_classesZ
error_msgsZengine_classÚerr© r+   úP/var/www/html/laksyashrimp/venv/lib/python3.9/site-packages/pandas/io/parquet.pyÚ
get_engine4   s(    (úÿ
r-   ÚrbFz1FilePath | ReadBuffer[bytes] | WriteBuffer[bytes]r   úStorageOptions | NoneÚboolzVtuple[FilePath | ReadBuffer[bytes] | WriteBuffer[bytes], IOHandles[bytes] | None, Any])ÚpathÚfsÚstorage_optionsÚmodeÚis_dirr!   c           
   	   C  sj  t | ƒ}|durvtddd�}tddd�}|durJt||jƒrJ|rvtdƒ‚n,|durbt||jjƒrbntdt|ƒj	› �ƒ‚t
|ƒrú|du rú|du rÌtdƒ}tdƒ}z|j | ¡\}}W n t|jfyÊ   Y n0 |du røtdƒ}|jj|fi |pîi ¤Ž\}}n"|�rt|ƒ�r|d	k�rtd
ƒ‚d}	|�s`|�s`t|tƒ�r`tj |¡�s`t||d|d�}	d}|	j}||	|fS )zFile handling for PyArrow.Nz
pyarrow.fsÚignore)ÚerrorsÚfsspecz8storage_options not supported with a pyarrow FileSystem.z9filesystem must be a pyarrow or fsspec FileSystem, not a r$   r.   z8storage_options passed with buffer, or non-supported URLF©Zis_textr3   )r   r
   Ú
isinstanceZ
FileSystemÚNotImplementedErrorÚspecZAbstractFileSystemr)   ÚtypeÚ__name__r   Zfrom_uriÚ	TypeErrorZArrowInvalidÚcoreZ	url_to_fsr   r   Úosr1   Úisdirr   Úhandle)
r1   r2   r3   r4   r5   Úpath_or_handleZpa_fsr8   ÚpaÚhandlesr+   r+   r,   Ú_get_path_or_handleV   s`    
ÿÿÿÿÿÿþý
ü	ÿrG   c                   @  s>   e Zd Zedddœdd„ƒZddœdd„Zddd
œdd„Zd	S )r   r   ÚNone)Údfr!   c                 C  s   t | tƒstdƒ‚d S )Nz+to_parquet only supports IO with DataFrames)r:   r   r)   ©rI   r+   r+   r,   Úvalidate_dataframe–   s    
zBaseImpl.validate_dataframerJ   c                 K  s   t | ƒ‚d S ©Nr   )ÚselfrI   r1   ÚcompressionÚkwargsr+   r+   r,   Úwrite›   s    zBaseImpl.writeN©r!   c                 K  s   t | ƒ‚d S rL   r   )rM   r1   ÚcolumnsrO   r+   r+   r,   Úreadž   s    zBaseImpl.read)N)r>   Ú
__module__Ú__qualname__ÚstaticmethodrK   rP   rS   r+   r+   r+   r,   r   •   s   c                	   @  sZ   e Zd Zddœdd„Zdddd	d
ddddœdd„Zdddejddfdddddœdd„ZdS )r&   rH   rQ   c                 C  s&   t ddd� dd l}dd l}|| _d S )Nr$   z(pyarrow is required for parquet support.©Úextrar   )r
   Zpyarrow.parquetZ(pandas.core.arrays.arrow.extension_typesÚapi)rM   r$   Úpandasr+   r+   r,   Ú__init__£   s    ÿzPyArrowImpl.__init__ÚsnappyNr   zFilePath | WriteBuffer[bytes]ú
str | Noneúbool | Noner/   úlist[str] | None)rI   r1   rN   Úindexr3   Úpartition_colsr!   c                 K  sN  |   |¡ d| dd ¡i}	|d ur*||	d< | jjj|fi |	¤Ž}
|jrtdt |j¡i}|
jj	}i |¥|¥}|
 
|¡}
t|||d|d ud�\}}}t|tjƒrÔt|dƒrÔt|jttfƒrÔt|jtƒrÎ|j ¡ }n|j}z`|d u�r| jjj|
|f|||dœ|¤Ž n| jjj|
|f||dœ|¤Ž W |d u�rJ| ¡  n|d u�rH| ¡  0 d S )	NÚschemaZpreserve_indexZPANDAS_ATTRSÚwb)r3   r4   r5   Úname)rN   ra   Ú
filesystem)rN   re   )rK   ÚpoprY   ÚTableZfrom_pandasÚattrsÚjsonÚdumpsrb   ÚmetadataZreplace_schema_metadatarG   r:   ÚioÚBufferedWriterÚhasattrrd   r   ÚbytesÚdecodeÚparquetZwrite_to_datasetZwrite_tableÚclose)rM   rI   r1   rN   r`   r3   ra   re   rO   Zfrom_pandas_kwargsÚtableÚdf_metadataZexisting_metadataZmerged_metadatarD   rF   r+   r+   r,   rP   ®   sf    

û
ÿþý
þûú
þüû

ÿ
zPyArrowImpl.writeFr0   úDtypeBackend | lib.NoDefault)Úuse_nullable_dtypesÚdtype_backendr3   r!   c                 K  s  d|d< i }	t ddd�}
|
dkr(d|	d< t|||dd�\}}}z¸| jjj|f|||d	œ|¤Ž}tƒ �* td
dtƒ t|||	d�}W d   ƒ n1 s”0    Y  |
dkr´|j	ddd�}|j
jràd|j
jv rà|j
jd }t |¡|_|W |d urô| ¡  S n|d u�r
| ¡  0 d S )NTZuse_pandas_metadatazmode.data_manager)ZsilentÚarrayZsplit_blocksr.   )r3   r4   )rR   re   Úfiltersr6   zmake_block is deprecated)rw   Úto_pandas_kwargsF)Úcopys   PANDAS_ATTRS)r   rG   rY   rq   Z
read_tabler   r   ÚDeprecationWarningr   Z_as_managerrb   rk   ri   Úloadsrh   rr   )rM   r1   rR   ry   rv   rw   r3   re   rO   rz   ÚmanagerrD   rF   Zpa_tableÚresultrt   r+   r+   r,   rS   ð   s\    üÿüûýý$ý ÿ
zPyArrowImpl.read)r\   NNNN)r>   rT   rU   r[   rP   r	   Ú
no_defaultrS   r+   r+   r+   r,   r&   ¢   s        øEør&   c                   @  sB   e Zd Zddœdd„Zdddd	dd
œdd„Zdd	ddœdd„ZdS )r'   rH   rQ   c                 C  s   t ddd�}|| _d S )Nr%   z,fastparquet is required for parquet support.rW   )r
   rY   )rM   r%   r+   r+   r,   r[   +  s    ÿzFastParquetImpl.__init__r\   Nr   z*Literal['snappy', 'gzip', 'brotli'] | Noner/   )rI   rN   r3   r!   c           	        sØ   |   |¡ d|v r"|d ur"tdƒ‚d|v r4| d¡}|d urDd|d< |d urTtdƒ‚t|ƒ}t|ƒr€tdƒ‰ ‡ ‡fdd„|d	< nˆrŒtd
ƒ‚tdd��. | jj	||f|||dœ|¤Ž W d   ƒ n1 sÊ0    Y  d S )NÚpartition_onzYCannot use both partition_on and partition_cols. Use partition_cols for partitioning dataZhiveZfile_schemeú9filesystem is not implemented for the fastparquet engine.r8   c                   s   ˆ j | dfi ˆpi ¤Ž  ¡ S )Nrc   )Úopen)r1   Ú_©r8   r3   r+   r,   Ú<lambda>V  s   ÿÿz'FastParquetImpl.write.<locals>.<lambda>Z	open_withz?storage_options passed with file object or non-fsspec file pathT)Úrecord)rN   Zwrite_indexr�   )
rK   r)   rf   r;   r   r   r
   r   rY   rP   )	rM   rI   r1   rN   r`   ra   r3   re   rO   r+   r…   r,   rP   3  s@    
ÿ
ÿÿþûúzFastParquetImpl.write)r3   r!   c                 K  s  i }|  dd¡}|  dtj¡}	d|d< |r2tdƒ‚|	tjurDtdƒ‚|d urTtdƒ‚t|ƒ}d }
t|ƒr�tdƒ}|j|d	fi |p‚i ¤Žj	|d
< n,t
|tƒr¼tj |¡s¼t|d	d|d�}
|
j}z>| jj|fi |¤Ž}|jf ||dœ|¤ŽW |
d urø|
 ¡  S n|
d u�r|
 ¡  0 d S )Nrv   Frw   Zpandas_nullszNThe 'use_nullable_dtypes' argument is not supported for the fastparquet enginezHThe 'dtype_backend' argument is not supported for the fastparquet enginer‚   r8   r.   r2   r9   )rR   ry   )rf   r	   r€   r)   r;   r   r   r
   rƒ   r2   r:   r   rA   r1   rB   r   rC   rY   ZParquetFileZ	to_pandasrr   )rM   r1   rR   ry   r3   re   rO   Zparquet_kwargsrv   rw   rF   r8   Zparquet_filer+   r+   r,   rS   h  sH    	ÿ
ÿÿ ÿý ÿ
zFastParquetImpl.read)r\   NNNN)NNNN)r>   rT   rU   r[   rP   rS   r+   r+   r+   r,   r'   *  s        ø8    úr'   r3   )r3   r"   r\   r   z$FilePath | WriteBuffer[bytes] | Noner]   r^   r_   zbytes | None)	rI   r1   r    rN   r`   r3   ra   re   r!   c                 K  st   t |tƒr|g}t|ƒ}	|du r(t ¡ n|}
|	j| |
f|||||dœ|¤Ž |du rlt |
tjƒsdJ ‚|
 ¡ S dS dS )a†	  
    Write a DataFrame to the parquet format.

    Parameters
    ----------
    df : DataFrame
    path : str, path object, file-like object, or None, default None
        String, path object (implementing ``os.PathLike[str]``), or file-like
        object implementing a binary ``write()`` function. If None, the result is
        returned as bytes. If a string, it will be used as Root Directory path
        when writing a partitioned dataset. The engine fastparquet does not
        accept file-like objects.
    engine : {{'auto', 'pyarrow', 'fastparquet'}}, default 'auto'
        Parquet library to use. If 'auto', then the option
        ``io.parquet.engine`` is used. The default ``io.parquet.engine``
        behavior is to try 'pyarrow', falling back to 'fastparquet' if
        'pyarrow' is unavailable.

        When using the ``'pyarrow'`` engine and no storage options are provided
        and a filesystem is implemented by both ``pyarrow.fs`` and ``fsspec``
        (e.g. "s3://"), then the ``pyarrow.fs`` filesystem is attempted first.
        Use the filesystem keyword with an instantiated fsspec filesystem
        if you wish to use its implementation.
    compression : {{'snappy', 'gzip', 'brotli', 'lz4', 'zstd', None}},
        default 'snappy'. Name of the compression to use. Use ``None``
        for no compression.
    index : bool, default None
        If ``True``, include the dataframe's index(es) in the file output. If
        ``False``, they will not be written to the file.
        If ``None``, similar to ``True`` the dataframe's index(es)
        will be saved. However, instead of being saved as values,
        the RangeIndex will be stored as a range in the metadata so it
        doesn't require much space and is faster. Other indexes will
        be included as columns in the file output.
    partition_cols : str or list, optional, default None
        Column names by which to partition the dataset.
        Columns are partitioned in the order they are given.
        Must be None if path is not a string.
    {storage_options}

    filesystem : fsspec or pyarrow filesystem, default None
        Filesystem object to use when reading the parquet file. Only implemented
        for ``engine="pyarrow"``.

        .. versionadded:: 2.1.0

    kwargs
        Additional keyword arguments passed to the engine

    Returns
    -------
    bytes if no path argument is provided else None
    N)rN   r`   ra   r3   re   )r:   r   r-   rl   ÚBytesIOrP   Úgetvalue)rI   r1   r    rN   r`   r3   ra   re   rO   ÚimplZpath_or_bufr+   r+   r,   Ú
to_parquet›  s(    A
þùør‹   zFilePath | ReadBuffer[bytes]zbool | lib.NoDefaultru   z&list[tuple] | list[list[tuple]] | None)	r1   r    rR   r3   rv   rw   re   ry   r!   c              	   K  sf   t |ƒ}	|tjur:d}
|du r&|
d7 }
tj|
ttƒ d� nd}t|ƒ |	j| f||||||dœ|¤ŽS )a¢  
    Load a parquet object from the file path, returning a DataFrame.

    Parameters
    ----------
    path : str, path object or file-like object
        String, path object (implementing ``os.PathLike[str]``), or file-like
        object implementing a binary ``read()`` function.
        The string could be a URL. Valid URL schemes include http, ftp, s3,
        gs, and file. For file URLs, a host is expected. A local file could be:
        ``file://localhost/path/to/table.parquet``.
        A file URL can also be a path to a directory that contains multiple
        partitioned parquet files. Both pyarrow and fastparquet support
        paths to directories as well as file URLs. A directory path could be:
        ``file://localhost/path/to/tables`` or ``s3://bucket/partition_dir``.
    engine : {{'auto', 'pyarrow', 'fastparquet'}}, default 'auto'
        Parquet library to use. If 'auto', then the option
        ``io.parquet.engine`` is used. The default ``io.parquet.engine``
        behavior is to try 'pyarrow', falling back to 'fastparquet' if
        'pyarrow' is unavailable.

        When using the ``'pyarrow'`` engine and no storage options are provided
        and a filesystem is implemented by both ``pyarrow.fs`` and ``fsspec``
        (e.g. "s3://"), then the ``pyarrow.fs`` filesystem is attempted first.
        Use the filesystem keyword with an instantiated fsspec filesystem
        if you wish to use its implementation.
    columns : list, default=None
        If not None, only these columns will be read from the file.
    {storage_options}

        .. versionadded:: 1.3.0

    use_nullable_dtypes : bool, default False
        If True, use dtypes that use ``pd.NA`` as missing value indicator
        for the resulting DataFrame. (only applicable for the ``pyarrow``
        engine)
        As new dtypes are added that support ``pd.NA`` in the future, the
        output with this option will change to use those dtypes.
        Note: this is an experimental option, and behaviour (e.g. additional
        support dtypes) may change without notice.

        .. deprecated:: 2.0

    dtype_backend : {{'numpy_nullable', 'pyarrow'}}, default 'numpy_nullable'
        Back-end data type applied to the resultant :class:`DataFrame`
        (still experimental). Behaviour is as follows:

        * ``"numpy_nullable"``: returns nullable-dtype-backed :class:`DataFrame`
          (default).
        * ``"pyarrow"``: returns pyarrow-backed nullable :class:`ArrowDtype`
          DataFrame.

        .. versionadded:: 2.0

    filesystem : fsspec or pyarrow filesystem, default None
        Filesystem object to use when reading the parquet file. Only implemented
        for ``engine="pyarrow"``.

        .. versionadded:: 2.1.0

    filters : List[Tuple] or List[List[Tuple]], default None
        To filter out data.
        Filter syntax: [[(column, op, val), ...],...]
        where op is [==, =, >, >=, <, <=, !=, in, not in]
        The innermost tuples are transposed into a set of filters applied
        through an `AND` operation.
        The outer list combines these sets of filters through an `OR`
        operation.
        A single list of tuples can also be used, meaning that no `OR`
        operation between set of filters is to be conducted.

        Using this argument will NOT result in row-wise filtering of the final
        partitions unless ``engine="pyarrow"`` is also specified.  For
        other engines, filtering is only performed at the partition level, that is,
        to prevent the loading of some row-groups and/or files.

        .. versionadded:: 2.1.0

    **kwargs
        Any additional kwargs are passed to the engine.

    Returns
    -------
    DataFrame

    See Also
    --------
    DataFrame.to_parquet : Create a parquet object that serializes a DataFrame.

    Examples
    --------
    >>> original_df = pd.DataFrame(
    ...     {{"foo": range(5), "bar": range(5, 10)}}
    ...    )
    >>> original_df
       foo  bar
    0    0    5
    1    1    6
    2    2    7
    3    3    8
    4    4    9
    >>> df_parquet_bytes = original_df.to_parquet()
    >>> from io import BytesIO
    >>> restored_df = pd.read_parquet(BytesIO(df_parquet_bytes))
    >>> restored_df
       foo  bar
    0    0    5
    1    1    6
    2    2    7
    3    3    8
    4    4    9
    >>> restored_df.equals(original_df)
    True
    >>> restored_bar = pd.read_parquet(BytesIO(df_parquet_bytes), columns=["bar"])
    >>> restored_bar
        bar
    0    5
    1    6
    2    7
    3    8
    4    9
    >>> restored_bar.equals(original_df[['bar']])
    True

    The function uses `kwargs` that are passed directly to the engine.
    In the following example, we use the `filters` argument of the pyarrow
    engine to filter the rows of the DataFrame.

    Since `pyarrow` is the default engine, we can omit the `engine` argument.
    Note that the `filters` argument is implemented by the `pyarrow` engine,
    which can benefit from multithreading and also potentially be more
    economical in terms of memory.

    >>> sel = [("foo", ">", 2)]
    >>> restored_part = pd.read_parquet(BytesIO(df_parquet_bytes), filters=sel)
    >>> restored_part
        foo  bar
    0    3    8
    1    4    9
    zYThe argument 'use_nullable_dtypes' is deprecated and will be removed in a future version.TzFUse dtype_backend='numpy_nullable' instead of use_nullable_dtype=True.)Ú
stacklevelF)rR   ry   r3   rv   rw   re   )	r-   r	   r€   ÚwarningsÚwarnÚFutureWarningr   r   rS   )r1   r    rR   r3   rv   rw   re   ry   rO   rŠ   Úmsgr+   r+   r,   Úread_parquetô  s0     
ÿÿÿùør‘   )Nr.   F)Nr"   r\   NNNN)6Ú__doc__Ú
__future__r   rl   ri   rA   Útypingr   r   r   r�   r   r   Zpandas._config.configr   Zpandas._libsr	   Zpandas.compat._optionalr
   Zpandas.errorsr   Zpandas.util._decoratorsr   Zpandas.util._exceptionsr   Zpandas.util._validatorsr   rZ   r   r   Zpandas.core.shared_docsr   Zpandas.io._utilr   Zpandas.io.commonr   r   r   r   r   Zpandas._typingr   r   r   r   r   r-   rG   r   r&   r'   r‹   r€   r‘   r+   r+   r+   r,   Ú<module>   s^   	%   û? 	q       ø"Xø