
    .i_                       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
mZ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 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(m)Z) ddZ*	 	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZ+ G d d      Z, G d de,      Z- G d de,      Z.	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ/ ed      dddej`                  dddf	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d d       Z1y)!zparquet compat    )annotationsN)TYPE_CHECKINGAnyLiteral)catch_warningsfilterwarnings)lib)import_optional_dependency)AbstractMethodErrorPandas4Warning)
set_module)check_dtype_backend)	DataFrame
get_option)arrow_table_to_pandas)	IOHandles
get_handleis_fsspec_urlis_urlstringify_path)DtypeBackendFilePathParquetCompressionOptions
ReadBufferStorageOptionsWriteBufferBaseImplc                $   | dk(  rt        d      } | dk(  r,t        t        g}d}|D ]  }	  |       c S  t        d|       | dk(  r
t               S | dk(  r
t               S t        d	      # t        $ r}|dt	        |      z   z  }Y d}~dd}~ww xY w)
zreturn our implementationautozio.parquet.engine z
 - NzUnable 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ImportErrorstr
ValueError)engineengine_classes
error_msgsengine_classerrs        O/var/www/app/trading-bot/venv/lib/python3.12/site-packages/pandas/io/parquet.py
get_enginer.   4   s    /0%7
* 	1L1#~%	1 C l
 	
 }	=	   
E
FF%  1gC00
1s   A++	B4B

Bc                ,   t        |       }|t        dd      }t        dd      }|#t        ||j                        r|rOt	        d      |!t        ||j
                  j                        rn!t        dt        |      j                         t        |      rk|i|5t        d      }t        d      }	 |j                  j                  |       \  }}|Mt        d      } |j                  j                  |fi |xs i \  }}n|rt!        |      r|d	k7  rt        d
      d}	|sN|sLt        |t"              r<t$        j&                  j)                  |      st+        ||d|      }	d}|	j,                  }||	|fS # t        |j                  f$ r Y w xY w)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!   rbz8storage_options passed with buffer, or non-supported URLFis_textstorage_options)r   r
   
isinstance
FileSystemNotImplementedErrorspecAbstractFileSystemr'   type__name__r   from_uri	TypeErrorArrowInvalidcore	url_to_fsr   r&   ospathisdirr   handle)
rD   fsr6   modeis_dirpath_or_handlepa_fsr2   pahandless
             r-   _get_path_or_handlerN   V   s    $D)N	~*<I+HXFB0@0@!A)N  Jr6;;3Q3Q$Rb**+-  ^$"+I6B.|<E%*%5%5%>%>t%D"N :/9F!6!6!6"#2#8b"B 
&"8DDL STTG~s+n-
 D%
  7B&&7 r/ s   7E; ;FFc                  0    e Zd Zedd       ZddZdddZy)r   c                :    t        | t              st        d      y )Nz+to_parquet only supports IO with DataFrames)r7   r   r'   )dfs    r-   validate_dataframezBaseImpl.validate_dataframe   s    "i(JKK )    c                    t        |       Nr   )selfrQ   rD   compressionkwargss        r-   writezBaseImpl.write       !$''rS   Nc                    t        |       rU   rV   )rW   rD   columnsrY   s       r-   readzBaseImpl.read   r[   rS   )rQ   r   returnNonerU   )r_   r   )r=   
__module____qualname__staticmethodrR   rZ   r^    rS   r-   r   r      s     L L((rS   c                  z    e Zd ZddZ	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 ddZddej                  dddf	 	 	 	 	 	 	 ddZy)	r#   c                <    t        dd       dd l}dd l}|| _        y )Nr!   z(pyarrow is required for parquet support.extrar   )r
   pyarrow.parquet(pandas.core.arrays.arrow.extension_typesapi)rW   r!   pandass      r-   __init__zPyArrowImpl.__init__   s!    "G	
 	 	8rS   Nc                   | j                  |       d|j                  dd       i}	|||	d<    | j                  j                  j                  |fi |	}
|j
                  rNdt        j                  |j
                        i}|
j                  j                  }i ||}|
j                  |      }
t        |||d|d u      \  }}}t        |t        j                        rmt        |d      rat        |j                   t"        t$        f      rAt        |j                   t$              r|j                   j'                         }n|j                   }	 |- | j                  j(                  j*                  |
|f|||d| n+ | j                  j(                  j,                  |
|f||d| ||j/                          y y # ||j/                          w w xY w)	Nschemapreserve_indexPANDAS_ATTRSwb)r6   rH   rI   name)rX   partition_cols
filesystem)rX   ru   )rR   poprk   Tablefrom_pandasattrsjsondumpsro   metadatareplace_schema_metadatarN   r7   ioBufferedWriterhasattrrs   r&   bytesdecodeparquetwrite_to_datasetwrite_tableclose)rW   rQ   rD   rX   indexr6   rt   ru   rY   from_pandas_kwargstabledf_metadataexisting_metadatamerged_metadatarJ   rM   s                   r-   rZ   zPyArrowImpl.write   s    	#.6

8T8R-S38/0***2D1CD88)4::bhh+?@K % 5 5B!2BkBO11/BE.A+!-/
+ ~r'8'89/>..e=.--u5!/!4!4!;!;!=!/!4!4	 )1  11" !,#1)  -  ,," !,)	
  " #w" #s   AF: :Gc                "   d|d<   t        |||d      \  }	}
}	  | j                  j                  j                  |	f|||d|}t	               5  t        ddt               t        |||      }d d d        |j                  j                  rKd	|j                  j                  v r3|j                  j                  d	   }t        j                  |      _        |
|
j                          S S # 1 sw Y   xY w# |
|
j                          w w xY w)
NTuse_pandas_metadatar3   )r6   rH   )r]   ru   filtersr0   make_block is deprecated)dtype_backendto_pandas_kwargss   PANDAS_ATTRS)rN   rk   r   
read_tabler   r   r   r   ro   r|   rz   loadsry   r   )rW   rD   r]   r   r   r6   ru   r   rY   rJ   rM   pa_tableresultr   s                 r-   r^   zPyArrowImpl.read   s    )-$%.A+	/
+	 2txx''22%	
 H  ! 
."
 /"/%5
 ''"hoo&>&>>"*//":":?"KK#'::k#:FL" #%
 
$ " #s$   5C9  C-/A*C9 -C62C9 9Dr_   r`   snappyNNNN)rQ   r   rD   zFilePath | WriteBuffer[bytes]rX   r   r   bool | Noner6   StorageOptions | Nonert   list[str] | Noner_   r`   )r   DtypeBackend | lib.NoDefaultr6   r   r   zdict[str, Any] | Noner_   r   )r=   ra   rb   rm   rZ   r	   
no_defaultr^   rd   rS   r-   r#   r#      s    	 2:!15+/@ @  ,@  /	@ 
 @  /@  )@  
@ J 69nn1526. 
 4.  /.  0.  
. rS   r#   c                  T    e Zd ZddZ	 	 	 	 	 d	 	 	 	 	 	 	 ddZ	 	 	 	 	 d	 	 	 	 	 d	dZy)
r$   c                ,    t        dd      }|| _        y )Nr"   z,fastparquet is required for parquet support.rg   )r
   rk   )rW   r"   s     r-   rm   zFastParquetImpl.__init__"  s     1!O
 rS   Nc                  	 | j                  |       d|v r|t        d      d|v r|j                  d      }|d|d<   |t        d      t	        |      }t        |      rt        d      		fd|d<   nrt        d	      t        d
      5   | j                  j                  ||f|||d| d d d        y # 1 sw Y   y xY w)Npartition_onzYCannot use both partition_on and partition_cols. Use partition_cols for partitioning datahivefile_scheme9filesystem is not implemented for the fastparquet engine.r2   c                P     j                   | dfi xs i j                         S )Nrr   )open)rD   _r2   r6   s     r-   <lambda>z'FastParquetImpl.write.<locals>.<lambda>M  s.    +&++d3.4"3df rS   	open_withz?storage_options passed with file object or non-fsspec file pathT)record)rX   write_indexr   )
rR   r'   rv   r9   r   r   r
   r   rk   rZ   )
rW   rQ   rD   rX   r   rt   r6   ru   rY   r2   s
         `  @r-   rZ   zFastParquetImpl.write*  s    	#V#(BK  V##ZZ7N%$*F=!!%K 
 d#/9F#F; Q  4( 	DHHNN (!+ 	 	 	s   #B>>Cc                ,   i }|j                  dt        j                        }	d|d<   |	t        j                  urt        d      |t	        d      |t	        d      t        |      }d }
t        |      r1t        d      } |j                  |dfi |xs i j                  |d	<   nJt        |t              r:t        j                  j                  |      st        |dd|
      }
|
j                   }	  | j"                  j$                  |fi |}t'               5  t)        ddt*                |j,                  d||d|cd d d        |
|
j/                          S S # 1 sw Y   nxY w	 |
|
j/                          y y # |
|
j/                          w w xY w)Nr   Fpandas_nullszHThe 'dtype_backend' argument is not supported for the fastparquet enginer   z?to_pandas_kwargs is not implemented for the fastparquet engine.r2   r3   rG   r4   r0   r   )r]   r   rd   )rv   r	   r   r'   r9   r   r   r
   r   rG   r7   r&   rC   rD   rE   r   rF   rk   ParquetFiler   r   r   	to_pandasr   )rW   rD   r]   r   r6   ru   r   rY   parquet_kwargsr   rM   r2   parquet_files                r-   r^   zFastParquetImpl.read_  s    *,

?CNNC).~&.%  !%K  '%Q  d#/9F#.6;;tT#Uo>SQS#U#X#XN4 c"277==+> !dE?G >>D	 /488//GGL! ."
 .|-- #W8>  " #   " #w" #s$   3'E> &E 	E> E&"E> >Fr   r   )rQ   r   rX   z*Literal['snappy', 'gzip', 'brotli'] | Noner6   r   r_   r`   )NNNNN)r6   r   r   dict | Noner_   r   )r=   ra   rb   rm   rZ   r^   rd   rS   r-   r$   r$   !  s{     CK1533 @	3 /3 
3p 15(,7 
 /7  &7  
7 rS   r$   r   c           	         t        |t              r|g}t        |      }	|t        j                         n|}
 |	j
                  | |
f|||||d| |,t        |
t        j                        sJ |
j                         S y)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 : dict, optional
        Extra options that make sense for a particular storage connection, e.g.
        host, port, username, password, etc. For HTTP(S) URLs the key-value
        pairs are forwarded to ``urllib.request.Request`` as header options.
        For other URLs (e.g. starting with "s3://", and "gcs://") the
        key-value pairs are forwarded to ``fsspec.open``. Please see ``fsspec``
        and ``urllib`` for more details, and for more examples on storage
        options refer `here <https://pandas.pydata.org/docs/user_guide/io.html?
        highlight=storage_options#reading-writing-remote-files>`_.
    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:

        * For ``engine="pyarrow"``: passed to :func:`pyarrow.parquet.write_table`
          or :func:`pyarrow.parquet.write_to_dataset` (when using partition_cols)
        * For ``engine="fastparquet"``: passed to :func:`fastparquet.write`

    Returns
    -------
    bytes if no path argument is provided else None
    N)rX   r   rt   r6   ru   )r7   r&   r.   r~   BytesIOrZ   getvalue)rQ   rD   r(   rX   r   r6   rt   ru   rY   implpath_or_bufs              r-   
to_parquetr     s    V .#&()fDAESWKDJJ
	  %'	 	 |+rzz222##%%rS   rl   c           
     b    t        |      }	t        |        |	j                  | f||||||d|S )aI  
    Load a parquet object from the file path, returning a DataFrame.

    The function automatically handles reading the data from a parquet file
    and creates a DataFrame with the appropriate structure.

    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 : dict, optional
        Extra options that make sense for a particular storage connection, e.g.
        host, port, username, password, etc. For HTTP(S) URLs the key-value
        pairs are forwarded to ``urllib.request.Request`` as header options.
        For other URLs (e.g. starting with "s3://", and "gcs://") the
        key-value pairs are forwarded to ``fsspec.open``. Please see ``fsspec``
        and ``urllib`` for more details, and for more examples on storage
        options refer `here <https://pandas.pydata.org/docs/user_guide/io.html?
        highlight=storage_options#reading-writing-remote-files>`_.
    dtype_backend : {{'numpy_nullable', 'pyarrow'}}
        Back-end data type applied to the resultant :class:`DataFrame`
        (still experimental). If not specified, the default behavior
        is to not use nullable data types. If specified, the behavior
        is as follows:

        * ``"numpy_nullable"``: returns nullable-dtype-backed :class:`DataFrame`
        * ``"pyarrow"``: returns pyarrow-backed nullable
          :class:`ArrowDtype` :class:`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

    to_pandas_kwargs : dict | None, default None
        Keyword arguments to pass through to :func:`pyarrow.Table.to_pandas`
        when ``engine="pyarrow"``.

        .. versionadded:: 3.0.0

    **kwargs
        Additional keyword arguments passed to the engine:

        * For ``engine="pyarrow"``: passed to :func:`pyarrow.parquet.read_table`
        * For ``engine="fastparquet"``: passed to
          :meth:`fastparquet.ParquetFile.to_pandas`

    Returns
    -------
    DataFrame
        DataFrame based on parquet file.

    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
    )r]   r   r6   r   ru   r   )r.   r   r^   )
rD   r(   r]   r6   r   ru   r   r   rY   r   s
             r-   read_parquetr     sN    @ fD&499	'#)	 	 	rS   )r(   r&   r_   r   )Nr3   F)rD   z1FilePath | ReadBuffer[bytes] | WriteBuffer[bytes]rG   r   r6   r   rH   r&   rI   boolr_   zVtuple[FilePath | ReadBuffer[bytes] | WriteBuffer[bytes], IOHandles[bytes] | None, Any])Nr   r   NNNN)rQ   r   rD   z$FilePath | WriteBuffer[bytes] | Noner(   r&   rX   r   r   r   r6   r   rt   r   ru   r   r_   zbytes | None)rD   zFilePath | ReadBuffer[bytes]r(   r&   r]   r   r6   r   r   r   ru   r   r   z&list[tuple] | list[list[tuple]] | Noner   r   r_   r   )2__doc__
__future__r   r~   rz   rC   typingr   r   r   warningsr   r   pandas._libsr	   pandas.compat._optionalr
   pandas.errorsr   r   pandas.util._decoratorsr   pandas.util._validatorsr   rl   r   r   pandas.io._utilr   pandas.io.commonr   r   r   r   r   pandas._typingr   r   r   r   r   r   r.   rN   r   r#   r$   r   r   r   rd   rS   r-   <module>r      s    " 	  	 

  > / 7
 2   GJ .2<'
;<'<' +<' 	<'
 <'<'~
( 
(| ( | ~u h u t 26-5-1'+``
.` ` +	`
 ` +` %` ` `F H  $-125..6:$(k
&kk k +	k
 0k k 4k "k k krS   