o
    GÊÆhŽ° ã                	   @  s®  U d Z ddlmZ ddlmZ ddlZddlmZmZ ddl	Z	ddl
Z
ddlZddlmZ ddlmZmZmZmZmZmZm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& ddl'm(Z( ddl)m*Z*m+Z+m,Z,m-Z-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 ddl:m;Z;m<Z<m=Z=m>Z> ddl?m@Z@ ddlAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZK ddlLmMZMmNZNmOZO ddlPmQ  mRZS ddlTmUZUmVZV ddlWmXZX ddlYmZZZ ddl[m\Z\m]Z] ddl^m_Z_ ddl`maZambZb e�r9ddlcmdZdmeZemfZf ddlgmhZh ddlimjZjmkZkmlZl ddlmmnZnmoZompZpmqZqmrZrmsZsmtZtmuZu dd l[mvZv d!Zwd"Zxd#d$„ ZydÓd)d*„Zzd+d,„ Z{eUZ|dÔd/d0„Z}d1Z~d2ed3< d4Z€d2ed5< d6Z�d2ed7< d8d8d9d9d:œZ‚eBdgiZƒd;Z„d2ed<< d=Z…d2ed>< e †d?¡�  ej‡d@dAe„ejˆdB� ej‡dCde…e ‰g dD¢¡dB� W d  ƒ n	1 �s¤w   Y  daŠdAa‹dEdF„ ZŒ	G			A		H					I	"dÕdÖd_d`„Z�		a	I					A	d×dØdjdk„ZŽdÙdodp„Z�G dqdr„ drƒZ�G dsdt„ dtƒZ‘G dudv„ dvƒZ’G dwdx„ dxe’ƒZ“G dydz„ dze’ƒZ”G d{d|„ d|e”ƒZ•G d}d~„ d~e•ƒZ–G dd€„ d€ƒZ—G d�d‚„ d‚e—ƒZ˜G dƒd„„ d„e˜ƒZ™G d…d†„ d†e˜ƒZšG d‡dˆ„ dˆešƒZ›G d‰dŠ„ dŠe—ƒZœG d‹dŒ„ dŒeœƒZ�G d�dŽ„ dŽeœƒZžG d�d�„ d�ežƒZŸG d‘d’„ d’eŸƒZ G d“d”„ d”e ƒZ¡G d•d–„ d–eŸƒZ¢G d—d˜„ d˜eŸƒZ£	dÚdÛdŸd „Z¤dÜd¤d¥„Z¥e	AdÝdÞdªd«„ƒZ¦edÝdßd­d«„ƒZ¦	AdÝdàd°d«„Z¦dád²d³„Z§dâdµd¶„Z¨dãdºd»„Z©däd½d¾„Zªdäd¿dÀ„Z«dådÂdÃ„Z¬dædÄdÅ„Z­dçdÆdÇ„Z®dèdÊdË„Z¯dédÍdÎ„Z°dêdÏdÐ„Z±G dÑdÒ„ dÒƒZ²dS )ëzY
High level interface to PyTables for reading and writing pandas data structures
to disk
é    )Úannotations)ÚsuppressN)ÚdateÚtzinfo)Údedent)ÚTYPE_CHECKINGÚAnyÚCallableÚFinalÚLiteralÚcastÚoverload)ÚconfigÚ
get_optionÚusing_pyarrow_string_dtype)ÚlibÚwriters)Úis_string_array)Ú	timezones)Úimport_optional_dependency)Úpatch_pickle)ÚAttributeConflictWarningÚClosedFileErrorÚIncompatibilityWarningÚPerformanceWarningÚPossibleDataLossError)Úcache_readonly)Úfind_stack_level)Úensure_objectÚis_bool_dtypeÚis_complex_dtypeÚis_list_likeÚis_string_dtypeÚneeds_i8_conversion)ÚCategoricalDtypeÚDatetimeTZDtypeÚExtensionDtypeÚPeriodDtype)Úarray_equivalent)
Ú	DataFrameÚDatetimeIndexÚIndexÚ
MultiIndexÚPeriodIndexÚ
RangeIndexÚSeriesÚTimedeltaIndexÚconcatÚisna)ÚCategoricalÚDatetimeArrayÚPeriodArray)ÚPyTablesExprÚmaybe_expression)Úextract_array)Úensure_index)ÚArrayManagerÚBlockManager)Ústringify_path)ÚadjoinÚpprint_thing)ÚHashableÚIteratorÚSequence)ÚTracebackType)ÚColÚFileÚNode)ÚAnyArrayLikeÚ	ArrayLikeÚAxisIntÚDtypeArgÚFilePathÚSelfÚShapeÚnpt)ÚBlockz0.15.2úUTF-8c                 C  s   t | tjƒr|  d¡} | S )z(if we have bytes, decode them to unicoderO   )Ú
isinstanceÚnpÚbytes_Údecode)Ús© rU   ú_/var/www/html/HyperOracle/crypto_trader/venv/lib/python3.10/site-packages/pandas/io/pytables.pyÚ_ensure_decoded‹   s   
rW   Úencodingú
str | NoneÚreturnÚstrc                 C  s   | d u rt } | S ©N)Ú_default_encoding©rX   rU   rU   rV   Ú_ensure_encoding’   s   r_   c                 C  s   t | tƒr	t| ƒ} | S )zÓ
    Ensure that an index / column name is a str (python 3); otherwise they
    may be np.string dtype. Non-string dtypes are passed through unchanged.

    https://github.com/pandas-dev/pandas/issues/13492
    )rP   r[   ©ÚnamerU   rU   rV   Ú_ensure_strš   s   
rb   Úscope_levelÚintc                   sV   |d ‰ t | ttfƒr‡ fdd„| D ƒ} n
t| ƒrt| ˆ d�} | du s't| ƒr)| S dS )zÔ
    Ensure that the where is a Term or a list of Term.

    This makes sure that we are capturing the scope of variables that are
    passed create the terms here with a frame_level=2 (we are 2 levels down)
    é   c                   s0   g | ]}|d urt |ƒrt|ˆ d d�n|‘qS )Nre   ©rc   )r7   ÚTerm)Ú.0Úterm©ÚlevelrU   rV   Ú
<listcomp>´   s
    þz _ensure_term.<locals>.<listcomp>rf   N)rP   ÚlistÚtupler7   rg   Úlen)Úwhererc   rU   rj   rV   Ú_ensure_term©   s   	
þrq   z¨
where criteria is being ignored as this version [%s] is too old (or
not-defined), read the file in and write it out to a new file to upgrade (with
the copy_to method)
r
   Úincompatibility_doczu
the [%s] attribute of the existing index is [%s] which conflicts with the new
[%s], resetting the attribute to None
Úattribute_conflict_docz‘
your performance may suffer as PyTables will pickle object types that it cannot
map directly to c-types [inferred_type->%s,key->%s] [items->%s]
Úperformance_docÚfixedÚtable)Úfru   Útrv   z;
: boolean
    drop ALL nan rows when appending to a table
Ú
dropna_docz~
: format
    default format writing format, if None, then
    put will default to 'fixed' and append will default to 'table'
Ú
format_doczio.hdfÚdropna_tableF)Ú	validatorÚdefault_format)ru   rv   Nc                  C  sN   t d u r%dd l} | a ttƒ� | jjdkaW d   ƒ t S 1 s w   Y  t S )Nr   Ústrict)Ú
_table_modÚtablesr   ÚAttributeErrorÚfileÚ_FILE_OPEN_POLICYÚ!_table_file_open_policy_is_strict)r€   rU   rU   rV   Ú_tablesí   s   

ÿ
ÿûr…   ÚaTr~   Úpath_or_bufúFilePath | HDFStoreÚkeyÚvalueúDataFrame | SeriesÚmodeÚ	complevelú
int | NoneÚcomplibÚappendÚboolÚformatÚindexÚmin_itemsizeúint | dict[str, int] | NoneÚdropnaúbool | NoneÚdata_columnsú Literal[True] | list[str] | NoneÚerrorsÚNonec              
     sž   |r‡ ‡‡‡‡‡‡‡‡‡	f
dd„}n‡ ‡‡‡‡‡‡‡‡‡	f
dd„}t | ƒ} t| tƒrIt| |||d��}||ƒ W d  ƒ dS 1 sBw   Y  dS || ƒ dS )z+store this object, close it if we opened itc                   s   | j ˆˆ	ˆˆˆˆˆˆ ˆˆd�
S )N)r’   r“   r”   Únan_repr–   r˜   rš   rX   )r�   ©Ústore©
r˜   r–   rX   rš   r’   r“   r‰   r”   rœ   rŠ   rU   rV   Ú<lambda>  ó    özto_hdf.<locals>.<lambda>c                   s   | j ˆˆ	ˆˆˆˆˆ ˆˆˆd�
S )N)r’   r“   r”   rœ   r˜   rš   rX   r–   ©Úputr�   rŸ   rU   rV   r    $  r¡   )rŒ   r�   r�   N)r<   rP   r[   ÚHDFStore)r‡   r‰   rŠ   rŒ   r�   r�   r�   r’   r“   r”   rœ   r–   r˜   rš   rX   rw   rž   rU   rŸ   rV   Úto_hdf  s    
ÿ
"ýr¥   Úrrp   ústr | list | NoneÚstartÚstopÚcolumnsúlist[str] | NoneÚiteratorÚ	chunksizec
                 K  s†  |dvrt d|› d�ƒ‚|durt|dd�}t| tƒr'| js"tdƒ‚| }d}n:t| ƒ} t| tƒs4td	ƒ‚zt	j
 | ¡}W n tt fyI   d}Y nw |sTtd
| › d�ƒ‚t| f||dœ|
¤Ž}d}z9|du r�| ¡ }t|ƒdkrtt dƒ‚|d }|dd… D ]}t||ƒs‰t dƒ‚q~|j}|j|||||||	|d�W S  t ttfyÂ   t| tƒsÁttƒ� | ¡  W d  ƒ ‚ 1 s¼w   Y  ‚ w )a"	  
    Read from the store, close it if we opened it.

    Retrieve pandas object stored in file, optionally based on where
    criteria.

    .. warning::

       Pandas uses PyTables for reading and writing HDF5 files, which allows
       serializing object-dtype data with pickle when using the "fixed" format.
       Loading pickled data received from untrusted sources can be unsafe.

       See: https://docs.python.org/3/library/pickle.html for more.

    Parameters
    ----------
    path_or_buf : str, path object, pandas.HDFStore
        Any valid string path is acceptable. Only supports the local file system,
        remote URLs and file-like objects are not supported.

        If you want to pass in a path object, pandas accepts any
        ``os.PathLike``.

        Alternatively, pandas accepts an open :class:`pandas.HDFStore` object.

    key : object, optional
        The group identifier in the store. Can be omitted if the HDF file
        contains a single pandas object.
    mode : {'r', 'r+', 'a'}, default 'r'
        Mode to use when opening the file. Ignored if path_or_buf is a
        :class:`pandas.HDFStore`. Default is 'r'.
    errors : str, default 'strict'
        Specifies how encoding and decoding errors are to be handled.
        See the errors argument for :func:`open` for a full list
        of options.
    where : list, optional
        A list of Term (or convertible) objects.
    start : int, optional
        Row number to start selection.
    stop  : int, optional
        Row number to stop selection.
    columns : list, optional
        A list of columns names to return.
    iterator : bool, optional
        Return an iterator object.
    chunksize : int, optional
        Number of rows to include in an iteration when using an iterator.
    **kwargs
        Additional keyword arguments passed to HDFStore.

    Returns
    -------
    object
        The selected object. Return type depends on the object stored.

    See Also
    --------
    DataFrame.to_hdf : Write a HDF file from a DataFrame.
    HDFStore : Low-level access to HDF files.

    Examples
    --------
    >>> df = pd.DataFrame([[1, 1.0, 'a']], columns=['x', 'y', 'z'])  # doctest: +SKIP
    >>> df.to_hdf('./store.h5', 'data')  # doctest: +SKIP
    >>> reread = pd.read_hdf('./store.h5')  # doctest: +SKIP
    )r¦   úr+r†   zmode zG is not allowed while performing a read. Allowed modes are r, r+ and a.Nre   rf   z&The HDFStore must be open for reading.Fz5Support for generic buffers has not been implemented.zFile z does not exist)rŒ   rš   Tr   z]Dataset(s) incompatible with Pandas data types, not table, or no datasets found in HDF5 file.z?key must be provided when HDF5 file contains multiple datasets.)rp   r¨   r©   rª   r¬   r­   Ú
auto_close)Ú
ValueErrorrq   rP   r¤   Úis_openÚOSErrorr<   r[   ÚNotImplementedErrorÚosÚpathÚexistsÚ	TypeErrorÚFileNotFoundErrorÚgroupsro   Ú_is_metadata_ofÚ_v_pathnameÚselectÚLookupErrorr   r�   Úclose)r‡   r‰   rŒ   rš   rp   r¨   r©   rª   r¬   r­   Úkwargsrž   r¯   r¶   r¹   Úcandidate_only_groupÚgroup_to_checkrU   rU   rV   Úread_hdf;  sv   O
ÿ

ÿÿÿ
ÿÿø




ÿýúrÂ   ÚgrouprE   Úparent_groupc                 C  sN   | j |j krdS | }|j dkr%|j}||kr|jdkrdS |j}|j dksdS )zDCheck if a given group is a metadata group for a given parent_group.Fre   ÚmetaT)Ú_v_depthÚ	_v_parentÚ_v_name)rÃ   rÄ   ÚcurrentÚparentrU   rU   rV   rº   Ö  s   

ürº   c                   @  s   e Zd ZU dZded< ded< 				dŸd dd„Zd¡dd„Zedd„ ƒZed¡dd„ƒZ	d¢dd„Z
d£dd„Zd£dd„Zd¤d d!„Zd¥d"d#„Zd¦d%d&„Zd¡d'd(„Zd§d*d+„Zd¨d2d3„Zd©dªd7d8„Zd«d:d;„Zd¬d=d>„Zd­d®d?d@„Zd¯dAdB„Zed°dCdD„ƒZd±d²dFdG„Zd¢dHdI„Z							d³d´dMdN„Z			dµd¶dQdR„Z		d·d¸dTdU„Z								d¹dºdVdW„Z		X								Y	X	d»d¼dedf„Zdµd£dgdh„Z 			X	X											Yd½d¾dkdl„Z!			d¿dÀdodp„Z"			dµdÁdtdu„Z#dÂdwdx„Z$dÃdÄd|d}„Z%dÅdd€„Z&dÆd‚dƒ„Z'	„	X					XdÇdÈd‡dˆ„Z(d¡d‰dŠ„Z)d‹dŒ„ Z*dÉdŽd�„Z+			�	YdÊdËd“d”„Z,		X												Y	XdÌdÍd•d–„Z-dÎd™dš„Z.dÏd›dœ„Z/dÐd�dž„Z0dS )Ñr¤   aS	  
    Dict-like IO interface for storing pandas objects in PyTables.

    Either Fixed or Table format.

    .. warning::

       Pandas uses PyTables for reading and writing HDF5 files, which allows
       serializing object-dtype data with pickle when using the "fixed" format.
       Loading pickled data received from untrusted sources can be unsafe.

       See: https://docs.python.org/3/library/pickle.html for more.

    Parameters
    ----------
    path : str
        File path to HDF5 file.
    mode : {'a', 'w', 'r', 'r+'}, default 'a'

        ``'r'``
            Read-only; no data can be modified.
        ``'w'``
            Write; a new file is created (an existing file with the same
            name would be deleted).
        ``'a'``
            Append; an existing file is opened for reading and writing,
            and if the file does not exist it is created.
        ``'r+'``
            It is similar to ``'a'``, but the file must already exist.
    complevel : int, 0-9, default None
        Specifies a compression level for data.
        A value of 0 or None disables compression.
    complib : {'zlib', 'lzo', 'bzip2', 'blosc'}, default 'zlib'
        Specifies the compression library to be used.
        These additional compressors for Blosc are supported
        (default if no compressor specified: 'blosc:blosclz'):
        {'blosc:blosclz', 'blosc:lz4', 'blosc:lz4hc', 'blosc:snappy',
         'blosc:zlib', 'blosc:zstd'}.
        Specifying a compression library which is not available issues
        a ValueError.
    fletcher32 : bool, default False
        If applying compression use the fletcher32 checksum.
    **kwargs
        These parameters will be passed to the PyTables open_file method.

    Examples
    --------
    >>> bar = pd.DataFrame(np.random.randn(10, 4))
    >>> store = pd.HDFStore('test.h5')
    >>> store['foo'] = bar   # write to HDF5
    >>> bar = store['foo']   # retrieve
    >>> store.close()

    **Create or load HDF5 file in-memory**

    When passing the `driver` option to the PyTables open_file method through
    **kwargs, the HDF5 file is loaded or created in-memory and will only be
    written when closed:

    >>> bar = pd.DataFrame(np.random.randn(10, 4))
    >>> store = pd.HDFStore('test.h5', driver='H5FD_CORE')
    >>> store['foo'] = bar
    >>> store.close()   # only now, data is written to disk
    zFile | NoneÚ_handler[   Ú_moder†   NFrŒ   r�   rŽ   Ú
fletcher32r‘   rZ   r›   c                 K  s²   d|v rt dƒ‚tdƒ}|d ur ||jjvr t d|jj› d�ƒ‚|d u r,|d ur,|jj}t|ƒ| _|d u r7d}|| _d | _|rA|nd| _	|| _
|| _d | _| jd	d|i|¤Ž d S )
Nr’   z-format is not a defined argument for HDFStorer€   zcomplib only supports z compression.r†   r   rŒ   rU   )r°   r   ÚfiltersÚall_complibsÚdefault_complibr<   Ú_pathrÌ   rË   Ú
_complevelÚ_complibÚ_fletcher32Ú_filtersÚopen)Úselfrµ   rŒ   r�   r�   rÍ   r¿   r€   rU   rU   rV   Ú__init__)  s&   	ÿ
zHDFStore.__init__c                 C  ó   | j S r\   ©rÑ   ©r×   rU   rU   rV   Ú
__fspath__J  s   zHDFStore.__fspath__c                 C  s   |   ¡  | jdusJ ‚| jjS )zreturn the root nodeN)Ú_check_if_openrË   ÚrootrÛ   rU   rU   rV   rÞ   M  s   zHDFStore.rootc                 C  rÙ   r\   rÚ   rÛ   rU   rU   rV   ÚfilenameT  ó   zHDFStore.filenamer‰   c                 C  ó
   |   |¡S r\   )Úget©r×   r‰   rU   rU   rV   Ú__getitem__X  ó   
zHDFStore.__getitem__c                 C  s   |   ||¡ d S r\   r¢   )r×   r‰   rŠ   rU   rU   rV   Ú__setitem__[  s   zHDFStore.__setitem__c                 C  rá   r\   )Úremoverã   rU   rU   rV   Ú__delitem__^  rå   zHDFStore.__delitem__ra   c              	   C  s@   z|   |¡W S  ttfy   Y nw tdt| ƒj› d|› d�ƒ‚)z$allow attribute access to get storesú'z' object has no attribute ')râ   ÚKeyErrorr   r�   ÚtypeÚ__name__)r×   ra   rU   rU   rV   Ú__getattr__a  s   ÿÿzHDFStore.__getattr__c                 C  s4   |   |¡}|dur|j}|||dd… fv rdS dS )zx
        check for existence of this key
        can match the exact pathname or the pathnm w/o the leading '/'
        Nre   TF)Úget_noder»   )r×   r‰   Únodera   rU   rU   rV   Ú__contains__k  s   
zHDFStore.__contains__rd   c                 C  ó   t |  ¡ ƒS r\   )ro   r¹   rÛ   rU   rU   rV   Ú__len__w  ó   zHDFStore.__len__c                 C  s   t | jƒ}t| ƒ› d|› d�S )Nú
File path: Ú
)r>   rÑ   rë   )r×   ÚpstrrU   rU   rV   Ú__repr__z  s   
zHDFStore.__repr__rK   c                 C  s   | S r\   rU   rÛ   rU   rU   rV   Ú	__enter__~  ó   zHDFStore.__enter__Úexc_typeútype[BaseException] | NoneÚ	exc_valueúBaseException | NoneÚ	tracebackúTracebackType | Nonec                 C  ó   |   ¡  d S r\   )r¾   )r×   rú   rü   rþ   rU   rU   rV   Ú__exit__�  s   zHDFStore.__exit__ÚpandasÚincludeú	list[str]c                 C  sZ   |dkrdd„ |   ¡ D ƒS |dkr%| jdusJ ‚dd„ | jjddd	�D ƒS td
|› d�ƒ‚)aƒ  
        Return a list of keys corresponding to objects stored in HDFStore.

        Parameters
        ----------

        include : str, default 'pandas'
                When kind equals 'pandas' return pandas objects.
                When kind equals 'native' return native HDF5 Table objects.

        Returns
        -------
        list
            List of ABSOLUTE path-names (e.g. have the leading '/').

        Raises
        ------
        raises ValueError if kind has an illegal value

        Examples
        --------
        >>> df = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 'B'])
        >>> store = pd.HDFStore("store.h5", 'w')  # doctest: +SKIP
        >>> store.put('data', df)  # doctest: +SKIP
        >>> store.get('data')  # doctest: +SKIP
        >>> print(store.keys())  # doctest: +SKIP
        ['/data1', '/data2']
        >>> store.close()  # doctest: +SKIP
        r  c                 S  ó   g | ]}|j ‘qS rU   ©r»   ©rh   ÚnrU   rU   rV   rl   ¨  ó    z!HDFStore.keys.<locals>.<listcomp>ÚnativeNc                 S  r  rU   r  r  rU   rU   rV   rl   ¬  s    ÿú/ÚTable)Ú	classnamez8`include` should be either 'pandas' or 'native' but is 'ré   )r¹   rË   Ú
walk_nodesr°   )r×   r  rU   rU   rV   Úkeys‰  s   ÿ
ÿzHDFStore.keysúIterator[str]c                 C  rñ   r\   )Úiterr  rÛ   rU   rU   rV   Ú__iter__³  ró   zHDFStore.__iter__úIterator[tuple[str, list]]c                 c  s    � |   ¡ D ]}|j|fV  qdS )z'
        iterate on key->group
        N)r¹   r»   )r×   ÚgrU   rU   rV   Úitems¶  s   €ÿzHDFStore.itemsc                 K  s¾   t ƒ }| j|kr)| jdv r|dv rn|dv r&| jr&td| j› d| j› d�ƒ‚|| _| jr0|  ¡  | jrE| jdkrEt ƒ j| j| j| j	d�| _
trP| jrPd	}t|ƒ‚|j| j| jfi |¤Ž| _d
S )a9  
        Open the file in the specified mode

        Parameters
        ----------
        mode : {'a', 'w', 'r', 'r+'}, default 'a'
            See HDFStore docstring or tables.open_file for info about modes
        **kwargs
            These parameters will be passed to the PyTables open_file method.
        )r†   Úw)r¦   r®   )r  zRe-opening the file [z] with mode [z] will delete the current file!r   )rÍ   zGCannot open HDF5 file, which is already opened, even in read-only mode.N)r…   rÌ   r±   r   rÑ   r¾   rÒ   ÚFiltersrÓ   rÔ   rÕ   r„   r°   Ú	open_filerË   )r×   rŒ   r¿   r€   ÚmsgrU   rU   rV   rÖ   ½  s*   
ÿÿ
ÿzHDFStore.openc                 C  s   | j dur
| j  ¡  d| _ dS )z0
        Close the PyTables file handle
        N)rË   r¾   rÛ   rU   rU   rV   r¾   ê  s   


zHDFStore.closec                 C  s   | j du rdS t| j jƒS )zF
        return a boolean indicating whether the file is open
        NF)rË   r‘   ÚisopenrÛ   rU   rU   rV   r±   ò  s   
zHDFStore.is_openÚfsyncc                 C  s^   | j dur+| j  ¡  |r-ttƒ� t | j  ¡ ¡ W d  ƒ dS 1 s$w   Y  dS dS dS )aó  
        Force all buffered modifications to be written to disk.

        Parameters
        ----------
        fsync : bool (default False)
          call ``os.fsync()`` on the file handle to force writing to disk.

        Notes
        -----
        Without ``fsync=True``, flushing may not guarantee that the OS writes
        to disk. With fsync, the operation will block until the OS claims the
        file has been written; however, other caching layers may still
        interfere.
        N)rË   Úflushr   r²   r´   r  Úfileno)r×   r  rU   rU   rV   r  û  s   


"ÿýzHDFStore.flushc                 C  sV   t ƒ � |  |¡}|du rtd|› d�ƒ‚|  |¡W  d  ƒ S 1 s$w   Y  dS )a  
        Retrieve pandas object stored in file.

        Parameters
        ----------
        key : str

        Returns
        -------
        object
            Same type as object stored in file.

        Examples
        --------
        >>> df = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 'B'])
        >>> store = pd.HDFStore("store.h5", 'w')  # doctest: +SKIP
        >>> store.put('data', df)  # doctest: +SKIP
        >>> store.get('data')  # doctest: +SKIP
        >>> store.close()  # doctest: +SKIP
        NúNo object named ú in the file)r   rî   rê   Ú_read_group©r×   r‰   rÃ   rU   rU   rV   râ     s   
$úzHDFStore.getr¬   r­   r¯   c	                   st   |   |¡}	|	du rtd|› d�ƒ‚t|dd�}|  |	¡‰ˆ ¡  ‡ ‡fdd„}
t| ˆ|
|ˆj|||||d�
}| ¡ S )	a6  
        Retrieve pandas object stored in file, optionally based on where criteria.

        .. warning::

           Pandas uses PyTables for reading and writing HDF5 files, which allows
           serializing object-dtype data with pickle when using the "fixed" format.
           Loading pickled data received from untrusted sources can be unsafe.

           See: https://docs.python.org/3/library/pickle.html for more.

        Parameters
        ----------
        key : str
            Object being retrieved from file.
        where : list or None
            List of Term (or convertible) objects, optional.
        start : int or None
            Row number to start selection.
        stop : int, default None
            Row number to stop selection.
        columns : list or None
            A list of columns that if not None, will limit the return columns.
        iterator : bool or False
            Returns an iterator.
        chunksize : int or None
            Number or rows to include in iteration, return an iterator.
        auto_close : bool or False
            Should automatically close the store when finished.

        Returns
        -------
        object
            Retrieved object from file.

        Examples
        --------
        >>> df = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 'B'])
        >>> store = pd.HDFStore("store.h5", 'w')  # doctest: +SKIP
        >>> store.put('data', df)  # doctest: +SKIP
        >>> store.get('data')  # doctest: +SKIP
        >>> print(store.keys())  # doctest: +SKIP
        ['/data1', '/data2']
        >>> store.select('/data1')  # doctest: +SKIP
           A  B
        0  1  2
        1  3  4
        >>> store.select('/data1', where='columns == A')  # doctest: +SKIP
           A
        0  1
        1  3
        >>> store.close()  # doctest: +SKIP
        Nr  r  re   rf   c                   s   ˆj | ||ˆ d�S )N)r¨   r©   rp   rª   ©Úread©Ú_startÚ_stopÚ_where©rª   rT   rU   rV   Úfuncx  s   zHDFStore.select.<locals>.func©rp   Únrowsr¨   r©   r¬   r­   r¯   )rî   rê   rq   Ú_create_storerÚ
infer_axesÚTableIteratorr+  Ú
get_result)r×   r‰   rp   r¨   r©   rª   r¬   r­   r¯   rÃ   r)  ÚitrU   r(  rV   r¼   .  s(   
@
özHDFStore.selectr¨   r©   c                 C  s8   t |dd�}|  |¡}t|tƒstdƒ‚|j|||d�S )a“  
        return the selection as an Index

        .. warning::

           Pandas uses PyTables for reading and writing HDF5 files, which allows
           serializing object-dtype data with pickle when using the "fixed" format.
           Loading pickled data received from untrusted sources can be unsafe.

           See: https://docs.python.org/3/library/pickle.html for more.


        Parameters
        ----------
        key : str
        where : list of Term (or convertible) objects, optional
        start : integer (defaults to None), row number to start selection
        stop  : integer (defaults to None), row number to stop selection
        re   rf   z&can only read_coordinates with a table©rp   r¨   r©   )rq   Ú
get_storerrP   r  r·   Úread_coordinates)r×   r‰   rp   r¨   r©   ÚtblrU   rU   rV   Úselect_as_coordinates‹  s
   

zHDFStore.select_as_coordinatesÚcolumnc                 C  s,   |   |¡}t|tƒstdƒ‚|j|||d�S )a~  
        return a single column from the table. This is generally only useful to
        select an indexable

        .. warning::

           Pandas uses PyTables for reading and writing HDF5 files, which allows
           serializing object-dtype data with pickle when using the "fixed" format.
           Loading pickled data received from untrusted sources can be unsafe.

           See: https://docs.python.org/3/library/pickle.html for more.

        Parameters
        ----------
        key : str
        column : str
            The column of interest.
        start : int or None, default None
        stop : int or None, default None

        Raises
        ------
        raises KeyError if the column is not found (or key is not a valid
            store)
        raises ValueError if the column can not be extracted individually (it
            is part of a data block)

        z!can only read_column with a table)r6  r¨   r©   )r2  rP   r  r·   Úread_column)r×   r‰   r6  r¨   r©   r4  rU   rU   rV   Úselect_column«  s   
#
zHDFStore.select_columnc
                   st  t |dd�}t|ttfƒrt|ƒdkr|d }t|tƒr)ˆj||ˆ|||||	d�S t|ttfƒs4tdƒ‚t|ƒs<tdƒ‚|du rD|d }‡fdd	„|D ƒ‰ˆ 	|¡}
d}t
 |
|fgtˆ|ƒ¡D ]-\}}|du rptd
|› d�ƒ‚|js|td|j› d�ƒ‚|du r„|j}q`|j|kr�tdƒ‚q`dd	„ ˆD ƒ}dd„ |D ƒ ¡ ‰ ‡ ‡‡fdd„}tˆ|
||||||||	d�
}|jdd�S )aÙ  
        Retrieve pandas objects from multiple tables.

        .. warning::

           Pandas uses PyTables for reading and writing HDF5 files, which allows
           serializing object-dtype data with pickle when using the "fixed" format.
           Loading pickled data received from untrusted sources can be unsafe.

           See: https://docs.python.org/3/library/pickle.html for more.

        Parameters
        ----------
        keys : a list of the tables
        selector : the table to apply the where criteria (defaults to keys[0]
            if not supplied)
        columns : the columns I want back
        start : integer (defaults to None), row number to start selection
        stop  : integer (defaults to None), row number to stop selection
        iterator : bool, return an iterator, default False
        chunksize : nrows to include in iteration, return an iterator
        auto_close : bool, default False
            Should automatically close the store when finished.

        Raises
        ------
        raises KeyError if keys or selector is not found or keys is empty
        raises TypeError if keys is not a list or tuple
        raises ValueError if the tables are not ALL THE SAME DIMENSIONS
        re   rf   r   )r‰   rp   rª   r¨   r©   r¬   r­   r¯   zkeys must be a list/tuplez keys must have a non-zero lengthNc                   ó   g | ]}ˆ   |¡‘qS rU   )r2  ©rh   ÚkrÛ   rU   rV   rl     ó    z/HDFStore.select_as_multiple.<locals>.<listcomp>zInvalid table [ú]zobject [z>] is not a table, and cannot be used in all select as multiplez,all tables must have exactly the same nrows!c                 S  s   g | ]	}t |tƒr|‘qS rU   )rP   r  ©rh   ÚxrU   rU   rV   rl   ,  ó    c                 S  s   h | ]	}|j d  d  ’qS ©r   )Únon_index_axes©rh   rx   rU   rU   rV   Ú	<setcomp>/  r@  z.HDFStore.select_as_multiple.<locals>.<setcomp>c                   s*   ‡ ‡‡‡fdd„ˆD ƒ}t |ˆdd� ¡ S )Nc                   s   g | ]}|j ˆˆˆ ˆd �‘qS )©rp   rª   r¨   r©   r"  rC  )r%  r&  r'  rª   rU   rV   rl   4  s    ÿÿz=HDFStore.select_as_multiple.<locals>.func.<locals>.<listcomp>F)ÚaxisÚverify_integrity)r1   Ú_consolidate)r%  r&  r'  Úobjs)rF  rª   Útblsr$  rV   r)  1  s   þz)HDFStore.select_as_multiple.<locals>.funcr*  T)Úcoordinates)rq   rP   rm   rn   ro   r[   r¼   r·   r°   r2  Ú	itertoolsÚchainÚziprê   Úis_tableÚpathnamer+  Úpopr.  r/  )r×   r  rp   Úselectorrª   r¨   r©   r¬   r­   r¯   rT   r+  rx   r;  Ú_tblsr)  r0  rU   )rF  rª   r×   rJ  rV   Úselect_as_multipleÓ  sf   +
ø
 ÿ
ÿözHDFStore.select_as_multipleTr~   rŠ   r‹   r“   r�   r”   r•   r˜   r™   rš   Útrack_timesr–   c                 C  sH   |du r
t dƒp	d}|  |¡}| j|||||||||	|
||||d� dS )a¬  
        Store object in HDFStore.

        Parameters
        ----------
        key : str
        value : {Series, DataFrame}
        format : 'fixed(f)|table(t)', default is 'fixed'
            Format to use when storing object in HDFStore. Value can be one of:

            ``'fixed'``
                Fixed format.  Fast writing/reading. Not-appendable, nor searchable.
            ``'table'``
                Table format.  Write as a PyTables Table structure which may perform
                worse but allow more flexible operations like searching / selecting
                subsets of the data.
        index : bool, default True
            Write DataFrame index as a column.
        append : bool, default False
            This will force Table format, append the input data to the existing.
        data_columns : list of columns or True, default None
            List of columns to create as data columns, or True to use all columns.
            See `here
            <https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#query-via-data-columns>`__.
        encoding : str, default None
            Provide an encoding for strings.
        track_times : bool, default True
            Parameter is propagated to 'create_table' method of 'PyTables'.
            If set to False it enables to have the same h5 files (same hashes)
            independent on creation time.
        dropna : bool, default False, optional
            Remove missing values.

        Examples
        --------
        >>> df = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 'B'])
        >>> store = pd.HDFStore("store.h5", 'w')  # doctest: +SKIP
        >>> store.put('data', df)  # doctest: +SKIP
        Núio.hdf.default_formatru   )r’   r“   r�   r�   r�   r”   rœ   r˜   rX   rš   rU  r–   )r   Ú_validate_formatÚ_write_to_group)r×   r‰   rŠ   r’   r“   r�   r�   r�   r”   rœ   r˜   rX   rš   rU  r–   rU   rU   rV   r£   L  s&   8

òzHDFStore.putc              
   C  sØ   t |dd�}z|  |¡}W n? ty   ‚  ty   ‚  tyL } z%|dur,tdƒ|‚|  |¡}|durB|jdd� W Y d}~dS W Y d}~nd}~ww t 	|||¡r]|j
jdd� dS |jsdtdƒ‚|j|||d�S )	a:  
        Remove pandas object partially by specifying the where condition

        Parameters
        ----------
        key : str
            Node to remove or delete rows from
        where : list of Term (or convertible) objects, optional
        start : integer (defaults to None), row number to start selection
        stop  : integer (defaults to None), row number to stop selection

        Returns
        -------
        number of rows removed (or None if not a Table)

        Raises
        ------
        raises KeyError if key is not a valid store

        re   rf   Nz5trying to remove a node with a non-None where clause!T©Ú	recursivez7can only remove with where on objects written as tablesr1  )rq   r2  rê   ÚAssertionErrorÚ	Exceptionr°   rî   Ú	_f_removeÚcomÚall_nonerÃ   rO  Údelete)r×   r‰   rp   r¨   r©   rT   Úerrrï   rU   rU   rV   rç   ˜  s8   ÿþ
þ€õÿzHDFStore.removeúbool | list[str]r—   c                 C  sl   |	durt dƒ‚|du rtdƒ}|du rtdƒpd}|  |¡}| j|||||||||
|||||||d� dS )a|  
        Append to Table in file.

        Node must already exist and be Table format.

        Parameters
        ----------
        key : str
        value : {Series, DataFrame}
        format : 'table' is the default
            Format to use when storing object in HDFStore.  Value can be one of:

            ``'table'``
                Table format. Write as a PyTables Table structure which may perform
                worse but allow more flexible operations like searching / selecting
                subsets of the data.
        index : bool, default True
            Write DataFrame index as a column.
        append       : bool, default True
            Append the input data to the existing.
        data_columns : list of columns, or True, default None
            List of columns to create as indexed data columns for on-disk
            queries, or True to use all columns. By default only the axes
            of the object are indexed. See `here
            <https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#query-via-data-columns>`__.
        min_itemsize : dict of columns that specify minimum str sizes
        nan_rep      : str to use as str nan representation
        chunksize    : size to chunk the writing
        expectedrows : expected TOTAL row size of this table
        encoding     : default None, provide an encoding for str
        dropna : bool, default False, optional
            Do not write an ALL nan row to the store settable
            by the option 'io.hdf.dropna_table'.

        Notes
        -----
        Does *not* check if data being appended overlaps with existing
        data in the table, so be careful

        Examples
        --------
        >>> df1 = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 'B'])
        >>> store = pd.HDFStore("store.h5", 'w')  # doctest: +SKIP
        >>> store.put('data', df1, format='table')  # doctest: +SKIP
        >>> df2 = pd.DataFrame([[5, 6], [7, 8]], columns=['A', 'B'])
        >>> store.append('data', df2)  # doctest: +SKIP
        >>> store.close()  # doctest: +SKIP
           A  B
        0  1  2
        1  3  4
        0  5  6
        1  7  8
        Nz>columns is not a supported keyword in append, try data_columnszio.hdf.dropna_tablerV  rv   )r’   Úaxesr“   r�   r�   r�   r”   rœ   r­   Úexpectedrowsr–   r˜   rX   rš   )r·   r   rW  rX  )r×   r‰   rŠ   r’   rc  r“   r�   r�   r�   rª   r”   rœ   r­   rd  r–   r˜   rX   rš   rU   rU   rV   r�   Ñ  s6   Iÿ

ðzHDFStore.appendÚdÚdictc                   s¢  |durt dƒ‚t|tƒstdƒ‚||vrtdƒ‚ttttˆjƒƒtt	t
ˆƒ ƒ ƒƒ}d}	g }
| ¡ D ]\}‰ ˆ du rG|	durDtdƒ‚|}	q4|
 ˆ ¡ q4|	durkˆj| }| t|
ƒ¡}t| |¡ƒ}| |¡||	< |du rs|| }|r“‡fdd„| ¡ D ƒ}t|ƒ}|D ]}| |¡}q†ˆj| ‰| dd¡}| ¡ D ]1\}‰ ||kr§|nd}ˆjˆ |d	�}|dur¿‡ fd
d„| ¡ D ƒnd}| j||f||dœ|¤Ž q�dS )a  
        Append to multiple tables

        Parameters
        ----------
        d : a dict of table_name to table_columns, None is acceptable as the
            values of one node (this will get all the remaining columns)
        value : a pandas object
        selector : a string that designates the indexable table; all of its
            columns will be designed as data_columns, unless data_columns is
            passed, in which case these are used
        data_columns : list of columns to create as data columns, or True to
            use all columns
        dropna : if evaluates to True, drop rows from all tables if any single
                 row in each table has all NaN. Default False.

        Notes
        -----
        axes parameter is currently not accepted

        Nztaxes is currently not accepted as a parameter to append_to_multiple; you can create the tables independently insteadzQappend_to_multiple must have a dictionary specified as the way to split the valuez=append_to_multiple requires a selector that is in passed dictz<append_to_multiple can only have one value in d that is Nonec                 3  s"   � | ]}ˆ | j d d�jV  qdS )Úall)ÚhowN)r–   r“   )rh   Úcols)rŠ   rU   rV   Ú	<genexpr>‚  s   €  z.HDFStore.append_to_multiple.<locals>.<genexpr>r”   ©rF  c                   s   i | ]\}}|ˆ v r||“qS rU   rU   ©rh   r‰   rŠ   )ÚvrU   rV   Ú
<dictcomp>’  s    z/HDFStore.append_to_multiple.<locals>.<dictcomp>)r˜   r”   )r·   rP   rf  r°   Únextr  ÚsetÚrangeÚndimÚ	_AXES_MAPrë   r  Úextendrc  Ú
differencer+   ÚsortedÚget_indexerÚtakeÚvaluesÚintersectionÚlocrQ  Úreindexr�   )r×   re  rŠ   rR  r˜   rc  r–   r¿   rF  Ú
remain_keyÚremain_valuesr;  ÚorderedÚorddÚidxsÚvalid_indexr“   r”   ÚdcÚvalÚfilteredrU   )rm  rŠ   rV   Úappend_to_multiple7  s\   ÿ
ÿÿ&ÿ

ÿýõzHDFStore.append_to_multipleÚoptlevelÚkindrY   c                 C  sB   t ƒ  |  |¡}|du rdS t|tƒstdƒ‚|j|||d� dS )aà  
        Create a pytables index on the table.

        Parameters
        ----------
        key : str
        columns : None, bool, or listlike[str]
            Indicate which columns to create an index on.

            * False : Do not create any indexes.
            * True : Create indexes on all columns.
            * None : Create indexes on all columns.
            * listlike : Create indexes on the given columns.

        optlevel : int or None, default None
            Optimization level, if None, pytables defaults to 6.
        kind : str or None, default None
            Kind of index, if None, pytables defaults to "medium".

        Raises
        ------
        TypeError: raises if the node is not a table
        Nz1cannot create table index on a Fixed format store)rª   r‡  rˆ  )r…   r2  rP   r  r·   Úcreate_index)r×   r‰   rª   r‡  rˆ  rT   rU   rU   rV   Úcreate_table_index˜  s   

zHDFStore.create_table_indexrm   c                 C  s<   t ƒ  |  ¡  | jdusJ ‚tdusJ ‚dd„ | j ¡ D ƒS )a�  
        Return a list of all the top-level nodes.

        Each node returned is not a pandas storage object.

        Returns
        -------
        list
            List of objects.

        Examples
        --------
        >>> df = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 'B'])
        >>> store = pd.HDFStore("store.h5", 'w')  # doctest: +SKIP
        >>> store.put('data', df)  # doctest: +SKIP
        >>> print(store.groups())  # doctest: +SKIP
        >>> store.close()  # doctest: +SKIP
        [/data (Group) ''
          children := ['axis0' (Array), 'axis1' (Array), 'block0_values' (Array),
          'block0_items' (Array)]]
        Nc                 S  sP   g | ]$}t |tjjƒs&t|jd dƒs$t|ddƒs$t |tjjƒr&|jdkr|‘qS )Úpandas_typeNrv   )	rP   r   ÚlinkÚLinkÚgetattrÚ_v_attrsrv   r  rÈ   )rh   r  rU   rU   rV   rl   Ú  s    üú
ùø
ùz#HDFStore.groups.<locals>.<listcomp>)r…   rÝ   rË   r   Úwalk_groupsrÛ   rU   rU   rV   r¹   À  s   þzHDFStore.groupsr  rp   ú*Iterator[tuple[str, list[str], list[str]]]c                 c  s¾   � t ƒ  |  ¡  | jdusJ ‚tdusJ ‚| j |¡D ]A}t|jddƒdur'qg }g }|j ¡ D ]!}t|jddƒ}|du rKt	|tj
jƒrJ| |j¡ q0| |j¡ q0|j d¡||fV  qdS )a€  
        Walk the pytables group hierarchy for pandas objects.

        This generator will yield the group path, subgroups and pandas object
        names for each group.

        Any non-pandas PyTables objects that are not a group will be ignored.

        The `where` group itself is listed first (preorder), then each of its
        child groups (following an alphanumerical order) is also traversed,
        following the same procedure.

        Parameters
        ----------
        where : str, default "/"
            Group where to start walking.

        Yields
        ------
        path : str
            Full path to a group (without trailing '/').
        groups : list
            Names (strings) of the groups contained in `path`.
        leaves : list
            Names (strings) of the pandas objects contained in `path`.

        Examples
        --------
        >>> df1 = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 'B'])
        >>> store = pd.HDFStore("store.h5", 'w')  # doctest: +SKIP
        >>> store.put('data', df1, format='table')  # doctest: +SKIP
        >>> df2 = pd.DataFrame([[5, 6], [7, 8]], columns=['A', 'B'])
        >>> store.append('data', df2)  # doctest: +SKIP
        >>> store.close()  # doctest: +SKIP
        >>> for group in store.walk():  # doctest: +SKIP
        ...     print(group)  # doctest: +SKIP
        >>> store.close()  # doctest: +SKIP
        Nr‹  r  )r…   rÝ   rË   r   r�  rŽ  r�  Ú_v_childrenry  rP   rÃ   ÚGroupr�   rÈ   r»   Úrstrip)r×   rp   r  r¹   ÚleavesÚchildr‹  rU   rU   rV   Úwalkç  s&   €'€òzHDFStore.walkúNode | Nonec                 C  s~   |   ¡  | d¡sd| }| jdusJ ‚tdusJ ‚z
| j | j|¡}W n tjjy0   Y dS w t|tj	ƒs=J t
|ƒƒ‚|S )z9return the node with the key or None if it does not existr  N)rÝ   Ú
startswithrË   r   rî   rÞ   Ú
exceptionsÚNoSuchNodeErrorrP   rE   rë   )r×   r‰   rï   rU   rU   rV   rî   #  s   
ÿzHDFStore.get_nodeúGenericFixed | Tablec                 C  s8   |   |¡}|du rtd|› d�ƒ‚|  |¡}| ¡  |S )z<return the storer object for a key, raise if not in the fileNr  r  )rî   rê   r,  r-  )r×   r‰   rÃ   rT   rU   rU   rV   r2  3  s   

zHDFStore.get_storerr  ÚpropindexesÚ	overwritec	              	   C  sÎ   t |||||d�}	|du rt|  ¡ ƒ}t|ttfƒs|g}|D ]E}
|  |
¡}|durd|
|	v r5|r5|	 |
¡ |  |
¡}t|tƒr[d}|rKdd„ |j	D ƒ}|	j
|
||t|ddƒ|jd� q|	j|
||jd� q|	S )	a;  
        Copy the existing store to a new file, updating in place.

        Parameters
        ----------
        propindexes : bool, default True
            Restore indexes in copied file.
        keys : list, optional
            List of keys to include in the copy (defaults to all).
        overwrite : bool, default True
            Whether to overwrite (remove and replace) existing nodes in the new store.
        mode, complib, complevel, fletcher32 same as in HDFStore.__init__

        Returns
        -------
        open file handle of the new store
        )rŒ   r�   r�   rÍ   NFc                 S  ó   g | ]}|j r|j‘qS rU   )Ú
is_indexedra   ©rh   r†   rU   rU   rV   rl   k  ó    z!HDFStore.copy.<locals>.<listcomp>r˜   )r“   r˜   rX   r^   )r¤   rm   r  rP   rn   r2  rç   r¼   r  rc  r�   rŽ  rX   r£   )r×   r‚   rŒ   r�  r  r�   r�   rÍ   rž  Ú	new_storer;  rT   Údatar“   rU   rU   rV   Úcopy=  s8   
ÿ




û€zHDFStore.copyc           
      C  s  t | jƒ}t| ƒ› d|› d�}| jr~t|  ¡ ƒ}t|ƒrxg }g }|D ]K}z|  |¡}|durA| t |j	p5|ƒ¡ | t |p>dƒ¡ W q" t
yJ   ‚  tym } z| |¡ t |ƒ}	| d|	› d�¡ W Y d}~q"d}~ww |td||ƒ7 }|S |d7 }|S |d	7 }|S )
a  
        Print detailed information on the store.

        Returns
        -------
        str

        Examples
        --------
        >>> df = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 'B'])
        >>> store = pd.HDFStore("store.h5", 'w')  # doctest: +SKIP
        >>> store.put('data', df)  # doctest: +SKIP
        >>> print(store.info())  # doctest: +SKIP
        >>> store.close()  # doctest: +SKIP
        <class 'pandas.io.pytables.HDFStore'>
        File path: store.h5
        /data    frame    (shape->[2,2])
        rô   rõ   Nzinvalid_HDFStore nodez[invalid_HDFStore node: r=  é   ÚEmptyzFile is CLOSED)r>   rÑ   rë   r±   rv  r  ro   r2  r�   rP  r[  r\  r=   )
r×   rµ   ÚoutputÚlkeysr  ry  r;  rT   ÚdetailÚdstrrU   rU   rV   Úinfox  s8   

€
€ýüþzHDFStore.infoc                 C  s   | j st| j› d�ƒ‚d S )Nz file is not open!)r±   r   rÑ   rÛ   rU   rU   rV   rÝ   ­  s   ÿzHDFStore._check_if_openr’   c              
   C  s>   z	t | ¡  }W |S  ty } z	td|› d�ƒ|‚d}~ww )zvalidate / deprecate formatsz#invalid HDFStore format specified [r=  N)Ú_FORMAT_MAPÚlowerrê   r·   )r×   r’   ra  rU   rU   rV   rW  ±  s   ý€ÿzHDFStore._validate_formatrO   úDataFrame | Series | NonerX   c              
   C  s
  |durt |ttfƒstdƒ‚tt|jddƒƒ}tt|jddƒƒ}|du rZ|du rHtƒ  tdus2J ‚t|ddƒs?t |tj	j
ƒrDd}d}ntdƒ‚t |tƒrPd	}nd
}|dkrZ|d7 }d|vrŽttdœ}z|| }	W n ty… }
 ztd|› dt|ƒ› d|› �ƒ|
‚d}
~
ww |	| |||d�S |du rÑ|durÑ|dkr´t|ddƒ}|dur³|jdkr¬d}n%|jdkr³d}n|dkrÑt|ddƒ}|durÑ|jdkrÊd}n|jdkrÑd}ttttttdœ}z|| }	W n tyü }
 ztd|› dt|ƒ› d|› �ƒ|
‚d}
~
ww |	| |||d�S )z"return a suitable class to operateNz(value must be None, Series, or DataFramer‹  Ú
table_typerv   Úframe_tableÚgeneric_tablezKcannot create a storer if the object is not existing nor a value are passedÚseriesÚframeÚ_table)r³  r´  z=cannot properly create the storer for: [_STORER_MAP] [group->ú,value->z	,format->©rX   rš   Úseries_tabler“   re   Úappendable_seriesÚappendable_multiseriesÚappendable_frameÚappendable_multiframe)r²  r¹  rº  r»  r¼  Úwormz<cannot properly create the storer for: [_TABLE_MAP] [group->)rP   r/   r)   r·   rW   rŽ  r�  r…   r   rv   r  ÚSeriesFixedÚ
FrameFixedrê   rë   ÚnlevelsÚGenericTableÚAppendableSeriesTableÚAppendableMultiSeriesTableÚAppendableFrameTableÚAppendableMultiFrameTableÚ	WORMTable)r×   rÃ   r’   rŠ   rX   rš   ÚptÚttÚ_STORER_MAPÚclsra  r“   Ú
_TABLE_MAPrU   rU   rV   r,  »  s¢   ÿÿ

ÿÿÿÿý€ÿ

€

úÿÿÿÿý€ÿzHDFStore._create_storerc                 C  sÖ   t |dd ƒr|dks|rd S |  ||¡}| j|||||d�}|r9|jr-|jr1|dkr1|jr1tdƒ‚|js8| ¡  n| ¡  |jsF|rFtdƒ‚|j||||||	|
||||||d� t|t	ƒrg|ri|j
|d� d S d S d S )	NÚemptyrv   r·  ru   zCan only append to Tablesz0Compression not supported on Fixed format stores)Úobjrc  r�   r�   r�   rÍ   r”   r­   rd  r–   rœ   r˜   rU  )rª   )rŽ  Ú_identify_groupr,  rO  Ú	is_existsr°   Úset_object_infoÚwriterP   r  r‰  )r×   r‰   rŠ   r’   rc  r“   r�   r�   r�   rÍ   r”   r­   rd  r–   rœ   r˜   rX   rš   rU  rÃ   rT   rU   rU   rV   rX    s>   €
óÿzHDFStore._write_to_grouprÃ   rE   c                 C  s   |   |¡}| ¡  | ¡ S r\   )r,  r-  r#  )r×   rÃ   rT   rU   rU   rV   r   T  s   
zHDFStore._read_groupc                 C  sN   |   |¡}| jdusJ ‚|dur|s| jj|dd� d}|du r%|  |¡}|S )z@Identify HDF5 group based on key, delete/create group if needed.NTrY  )rî   rË   Úremove_nodeÚ_create_nodes_and_group)r×   r‰   r�   rÃ   rU   rU   rV   rÎ  Y  s   

zHDFStore._identify_groupc                 C  sv   | j dusJ ‚| d¡}d}|D ](}t|ƒsq|}| d¡s"|d7 }||7 }|  |¡}|du r6| j  ||¡}|}q|S )z,Create nodes from key and return group name.Nr  )rË   Úsplitro   Úendswithrî   Úcreate_group)r×   r‰   Úpathsrµ   ÚpÚnew_pathrÃ   rU   rU   rV   rÓ  k  s   


z HDFStore._create_nodes_and_group)r†   NNF)rŒ   r[   r�   rŽ   rÍ   r‘   rZ   r›   ©rZ   r[   ©r‰   r[   )r‰   r[   rZ   r›   )ra   r[   )r‰   r[   rZ   r‘   ©rZ   rd   )rZ   rK   )rú   rû   rü   rý   rþ   rÿ   rZ   r›   )r  )r  r[   rZ   r  )rZ   r  )rZ   r  )r†   )rŒ   r[   rZ   r›   ©rZ   r›   ©rZ   r‘   ©F)r  r‘   rZ   r›   )NNNNFNF)r‰   r[   r¬   r‘   r­   rŽ   r¯   r‘   ©NNN©r‰   r[   r¨   rŽ   r©   rŽ   ©NN)r‰   r[   r6  r[   r¨   rŽ   r©   rŽ   )NNNNNFNF)r¬   r‘   r­   rŽ   r¯   r‘   )NTFNNNNNNr~   TF)r‰   r[   rŠ   r‹   r“   r‘   r�   r‘   r�   rŽ   r”   r•   r˜   r™   rš   r[   rU  r‘   r–   r‘   rZ   r›   )NNTTNNNNNNNNNNr~   )r‰   r[   rŠ   r‹   r“   rb  r�   r‘   r�   rŽ   r”   r•   r­   rŽ   r–   r—   r˜   r™   rš   r[   rZ   r›   )NNF)re  rf  r–   r‘   rZ   r›   )r‰   r[   r‡  rŽ   rˆ  rY   rZ   r›   )rZ   rm   )r  )rp   r[   rZ   r‘  )r‰   r[   rZ   r˜  )r‰   r[   rZ   rœ  )r  TNNNFT)rŒ   r[   r�  r‘   r�   rŽ   rÍ   r‘   rž  r‘   rZ   r¤   )r’   r[   rZ   r[   )NNrO   r~   )rŠ   r¯  rX   r[   rš   r[   rZ   rœ  )NTFNNNNNNFNNNr~   T)r‰   r[   rŠ   r‹   r“   rb  r�   r‘   r�   rŽ   r”   r•   r­   rŽ   r–   r‘   rš   r[   rU  r‘   rZ   r›   )rÃ   rE   )r‰   r[   r�   r‘   rZ   rE   )r‰   r[   rZ   rE   )1rì   Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__rØ   rÜ   ÚpropertyrÞ   rß   rä   ræ   rè   rí   rð   rò   r÷   rø   r  r  r  r  rÖ   r¾   r±   r  râ   r¼   r5  r8  rT  r£   rç   r�   r†  rŠ  r¹   r—  rî   r2  r¥  r¬  rÝ   rW  r,  rX  r   rÎ  rÓ  rU   rU   rU   rV   r¤   ä  s
  
 Aú
!











*

-
 ÷`û$û+ö}ñL=îkùdû
('
<
÷
;5
ú`í
>
r¤   c                   @  s`   e Zd ZU dZded< ded< ded< 							dddd„Zddd„Zddd„Zdddd„ZdS )r.  aa  
    Define the iteration interface on a table

    Parameters
    ----------
    store : HDFStore
    s     : the referred storer
    func  : the function to execute the query
    where : the where of the query
    nrows : the rows to iterate on
    start : the passed start value (default is None)
    stop  : the passed stop value (default is None)
    iterator : bool, default False
        Whether to use the default iterator.
    chunksize : the passed chunking value (default is 100000)
    auto_close : bool, default False
        Whether to automatically close the store at the end of iteration.
    rŽ   r­   r¤   rž   rœ  rT   NFr¬   r‘   r¯   rZ   r›   c                 C  sš   || _ || _|| _|| _| jjr'|d u rd}|d u rd}|d u r"|}t||ƒ}|| _|| _|| _d | _	|s9|	d urE|	d u r?d}	t
|	ƒ| _nd | _|
| _d S )Nr   é † )rž   rT   r)  rp   rO  Úminr+  r¨   r©   rK  rd   r­   r¯   )r×   rž   rT   r)  rp   r+  r¨   r©   r¬   r­   r¯   rU   rU   rV   rØ   ™  s,   

zTableIterator.__init__r@   c                 c  s€   � | j }| jd u rtdƒ‚|| jk r:t|| j | jƒ}|  d d | j||… ¡}|}|d u s1t|ƒs2q|V  || jk s|  ¡  d S )Nz*Cannot iterate until get_result is called.)	r¨   rK  r°   r©   ré  r­   r)  ro   r¾   )r×   rÉ   r©   rŠ   rU   rU   rV   r  Ã  s   €


ù	zTableIterator.__iter__c                 C  s   | j r
| j ¡  d S d S r\   )r¯   rž   r¾   rÛ   rU   rU   rV   r¾   Ó  s   ÿzTableIterator.closerK  c                 C  sŠ   | j d urt| jtƒstdƒ‚| jj| jd�| _| S |r3t| jtƒs&tdƒ‚| jj| j| j| j	d�}n| j}|  
| j| j	|¡}|  ¡  |S )Nz0can only use an iterator or chunksize on a table)rp   z$can only read_coordinates on a tabler1  )r­   rP   rT   r  r·   r3  rp   rK  r¨   r©   r)  r¾   )r×   rK  rp   ÚresultsrU   rU   rV   r/  ×  s   
ÿzTableIterator.get_result)NNFNF)rž   r¤   rT   rœ  r¬   r‘   r­   rŽ   r¯   r‘   rZ   r›   ©rZ   r@   rÝ  rß  )rK  r‘   )	rì   rã  rä  rå  ræ  rØ   r  r¾   r/  rU   rU   rU   rV   r.  �  s   
 	õ
*
r.  c                   @  s\  e Zd ZU dZdZded< dZded< g d¢Z													dMdNdd„Ze	dOdd„ƒZ
e	dPdd„ƒZdQdd„ZdPdd„ZdRdd„ZdSdd„Ze	dSd d!„ƒZdTd'd(„Zd)d*„ Ze	d+d,„ ƒZe	d-d.„ ƒZe	d/d0„ ƒZe	d1d2„ ƒZdUd4d5„ZdVdWd6d7„ZdWd8d9„ZdXd=d>„ZdVd?d@„ZdYdAdB„ZdWdCdD„ZdWdEdF„ZdWdGdH„ZdZdIdJ„Z dZdKdL„Z!dS )[ÚIndexCola  
    an index column description class

    Parameters
    ----------
    axis   : axis which I reference
    values : the ndarray like converted values
    kind   : a string description of this type
    typ    : the pytables type
    pos    : the position in the pytables

    Tr‘   Úis_an_indexableÚis_data_indexable)ÚfreqÚtzÚ
index_nameNra   r[   ÚcnamerY   rZ   r›   c                 C  s    t |tƒs	tdƒ‚|| _|| _|| _|| _|p|| _|| _|| _	|| _
|	| _|
| _|| _|| _|| _|| _|d ur>|  |¡ t | jtƒsFJ ‚t | jtƒsNJ ‚d S )Nz`name` must be a str.)rP   r[   r°   ry  rˆ  Útypra   rò  rF  Úposrï  rð  rñ  r  rv   rÅ   ÚmetadataÚset_pos)r×   ra   ry  rˆ  ró  rò  rF  rô  rï  rð  rñ  r  rv   rÅ   rõ  rU   rU   rV   rØ     s(   


zIndexCol.__init__rd   c                 C  ó   | j jS r\   )ró  ÚitemsizerÛ   rU   rU   rV   rø  .  s   zIndexCol.itemsizec                 C  ó   | j › d�S )NÚ_kindr`   rÛ   rU   rU   rV   Ú	kind_attr3  ó   zIndexCol.kind_attrrô  c                 C  s,   || _ |dur| jdur|| j_dS dS dS )z,set the position of this column in the TableN)rô  ró  Ú_v_pos)r×   rô  rU   rU   rV   rö  7  s   ÿzIndexCol.set_posc                 C  ó@   t tt| j| j| j| j| jfƒƒ}d dd„ t	g d¢|ƒD ƒ¡S )Nú,c                 S  ó   g | ]\}}|› d |› �‘qS ©z->rU   rl  rU   rU   rV   rl   B  ó    ÿÿz%IndexCol.__repr__.<locals>.<listcomp>)ra   rò  rF  rô  rˆ  )
rn   Úmapr>   ra   rò  rF  rô  rˆ  ÚjoinrN  ©r×   ÚtemprU   rU   rV   r÷   =  s   ÿþÿzIndexCol.__repr__Úotherr   c                   ó   t ‡ ‡fdd„dD ƒƒS )úcompare 2 col itemsc                 3  ó(   � | ]}t ˆ|d ƒt ˆ |d ƒkV  qd S r\   ©rŽ  r¡  ©r  r×   rU   rV   rj  J  ó
   € ÿ
ÿz"IndexCol.__eq__.<locals>.<genexpr>)ra   rò  rF  rô  ©rg  ©r×   r  rU   r  rV   Ú__eq__H  ó   þzIndexCol.__eq__c                 C  s   |   |¡ S r\   )r  r  rU   rU   rV   Ú__ne__O  ró   zIndexCol.__ne__c                 C  s"   t | jdƒsdS t| jj| jƒjS )z%return whether I am an indexed columnri  F)Úhasattrrv   rŽ  ri  rò  r   rÛ   rU   rU   rV   r   R  s   zIndexCol.is_indexedry  ú
np.ndarrayrX   rš   ú3tuple[np.ndarray, np.ndarray] | tuple[Index, Index]c           
      C  s  t |tjƒsJ t|ƒƒ‚|jjdur|| j  ¡ }t| j	ƒ}t
||||ƒ}i }t| jƒ|d< | jdur:t| jƒ|d< t}t |jd¡sIt |jtƒrLt}n|jdkrYd|v rYdd„ }z
||fi |¤Ž}W n ty|   d|v rrd|d< ||fi |¤Ž}Y nw t|| jƒ}	|	|	fS )zV
        Convert the data from this selection to the appropriate pandas type.
        Nra   rï  ÚMÚi8c                 [  s   t dd| i|¤ŽS )NÚordinalrU   )r-   )r?  ÚkwdsrU   rU   rV   r    {  s
    ÿÿz"IndexCol.convert.<locals>.<lambda>)rP   rQ   Úndarrayrë   ÚdtypeÚfieldsrò  r¥  rW   rˆ  Ú_maybe_convertrñ  rï  r+   r   Úis_np_dtyper%   r*   r°   Ú_set_tzrð  )
r×   ry  rœ   rX   rš   Úval_kindr¿   ÚfactoryÚnew_pd_indexÚfinal_pd_indexrU   rU   rV   ÚconvertZ  s2   

ÿûzIndexCol.convertc                 C  rÙ   )zreturn the values©ry  rÛ   rU   rU   rV   Ú	take_data‹  rà   zIndexCol.take_datac                 C  r÷  r\   )rv   r�  rÛ   rU   rU   rV   Úattrs�  ó   zIndexCol.attrsc                 C  r÷  r\   ©rv   ÚdescriptionrÛ   rU   rU   rV   r*  “  r(  zIndexCol.descriptionc                 C  s   t | j| jdƒS )z!return my current col descriptionN)rŽ  r*  rò  rÛ   rU   rU   rV   Úcol—  ó   zIndexCol.colc                 C  rÙ   ©zreturn my cython valuesr%  rÛ   rU   rU   rV   Úcvaluesœ  ó   zIndexCol.cvaluesr@   c                 C  s
   t | jƒS r\   )r  ry  rÛ   rU   rU   rV   r  ¡  rå   zIndexCol.__iter__c                 C  s\   t | jƒdkr(t|tƒr| | j¡}|dur*| jj|k r,tƒ j	|| j
d�| _dS dS dS dS )zŸ
        maybe set a string col itemsize:
            min_itemsize can be an integer or a dict with this columns name
            with an integer size
        ÚstringN)rø  rô  )rW   rˆ  rP   rf  râ   ra   ró  rø  r…   Ú	StringColrô  )r×   r”   rU   rU   rV   Úmaybe_set_size¤  s   
ûzIndexCol.maybe_set_sizec                 C  ó   d S r\   rU   rÛ   rU   rU   rV   Úvalidate_names±  rù   zIndexCol.validate_namesÚhandlerÚAppendableTabler�   c                 C  s:   |j | _ |  ¡  |  |¡ |  |¡ |  |¡ |  ¡  d S r\   )rv   Úvalidate_colÚvalidate_attrÚvalidate_metadataÚwrite_metadataÚset_attr)r×   r5  r�   rU   rU   rV   Úvalidate_and_set´  s   


zIndexCol.validate_and_setc                 C  s^   t | jƒdkr-| j}|dur-|du r| j}|j|k r*td|› d| j› d|j› d�ƒ‚|jS dS )z:validate this column: return the compared against itemsizer0  Nz#Trying to store a string with len [z] in [z)] column but
this column has a limit of [zC]!
Consider using min_itemsize to preset the sizes on these columns)rW   rˆ  r+  rø  r°   rò  )r×   rø  ÚcrU   rU   rV   r7  ¼  s   
ÿþÿzIndexCol.validate_colc                 C  sJ   |rt | j| jd ƒ}|d ur!|| jkr#td|› d| j› d�ƒ‚d S d S d S )Nzincompatible kind in col [ú - r=  )rŽ  r'  rû  rˆ  r·   )r×   r�   Úexisting_kindrU   rU   rV   r8  Ï  s   ÿýzIndexCol.validate_attrc                 C  sÆ   | j D ]]}t| |dƒ}| | ji ¡}| |¡}||v rT|durT||krT|dv rBt|||f }tj|tt	ƒ d� d||< t
| |dƒ qtd| j› d|› d|› d|› d�	ƒ‚|dus\|dur`|||< qdS )	z
        set/update the info for this indexable with the key/value
        if there is a conflict raise/warn as needed
        N)rï  rñ  ©Ú
stacklevelzinvalid info for [z] for [z], existing_value [z] conflicts with new value [r=  )Ú_info_fieldsrŽ  Ú
setdefaultra   râ   rs   ÚwarningsÚwarnr   r   Úsetattrr°   )r×   r¬  r‰   rŠ   ÚidxÚexisting_valueÚwsrU   rU   rV   Úupdate_infoØ  s.   

ÿÿþÿ€èzIndexCol.update_infoc                 C  s(   |  | j¡}|dur| j |¡ dS dS )z!set my state from the passed infoN)râ   ra   Ú__dict__Úupdate)r×   r¬  rG  rU   rU   rV   Úset_info÷  s   ÿzIndexCol.set_infoc                 C  s   t | j| j| jƒ dS )zset the kind for this columnN)rF  r'  rû  rˆ  rÛ   rU   rU   rV   r;  ý  ó   zIndexCol.set_attrc                 C  sT   | j dkr"| j}| | j¡}|dur$|dur&t||ddd�s(tdƒ‚dS dS dS dS )z:validate that kind=category does not change the categoriesÚcategoryNT©Ú
strict_nanÚdtype_equalzEcannot append a categorical with different categories to the existing)rÅ   rõ  Úread_metadatarò  r(   r°   )r×   r5  Únew_metadataÚcur_metadatarU   rU   rV   r9  	  s   
ÿÿÿözIndexCol.validate_metadatac                 C  s"   | j dur| | j| j ¡ dS dS )zset the meta dataN)rõ  r:  rò  )r×   r5  rU   rU   rV   r:  	  s   
ÿzIndexCol.write_metadata)NNNNNNNNNNNNN)ra   r[   rò  rY   rZ   r›   rÜ  rÚ  )rô  rd   rZ   r›   ©r  r   rZ   r‘   rÞ  )ry  r  rX   r[   rš   r[   rZ   r  rë  r\   rÝ  )r5  r6  r�   r‘   rZ   r›   )r�   r‘   rZ   r›   )r5  r6  rZ   r›   )"rì   rã  rä  rå  rí  ræ  rî  rB  rØ   rç  rø  rû  rö  r÷   r  r  r   r$  r&  r'  r*  r+  r.  r  r2  r4  r<  r7  r8  rJ  rM  r;  r9  r:  rU   rU   rU   rV   rì  ñ  sd   
 ñ+




1









	


rì  c                   @  s2   e Zd ZdZeddd„ƒZddd„Zddd„ZdS )ÚGenericIndexColz:an index which is not represented in the data of the tablerZ   r‘   c                 C  ó   dS ©NFrU   rÛ   rU   rU   rV   r   	  ó   zGenericIndexCol.is_indexedry  r  rX   r[   rš   útuple[Index, Index]c                 C  s,   t |tjƒsJ t|ƒƒ‚tt|ƒƒ}||fS )zÛ
        Convert the data from this selection to the appropriate pandas type.

        Parameters
        ----------
        values : np.ndarray
        nan_rep : str
        encoding : str
        errors : str
        )rP   rQ   r  rë   r.   ro   )r×   ry  rœ   rX   rš   r“   rU   rU   rV   r$  	  s   zGenericIndexCol.convertr›   c                 C  r3  r\   rU   rÛ   rU   rU   rV   r;  1	  rù   zGenericIndexCol.set_attrNrÞ  )ry  r  rX   r[   rš   r[   rZ   r[  rÝ  )rì   rã  rä  rå  rç  r   r$  r;  rU   rU   rU   rV   rW  	  s    
rW  c                      s  e Zd ZdZdZdZddgZ												d>d?‡ fdd„Zed@dd„ƒZ	ed@dd„ƒZ
d@dd„ZdAdd„ZdBdd„Zdd „ ZedCd#d$„ƒZed%d&„ ƒZedDd)d*„ƒZedEd+d,„ƒZed-d.„ ƒZed/d0„ ƒZed1d2„ ƒZed3d4„ ƒZdFd5d6„ZdGd:d;„ZdFd<d=„Z‡  ZS )HÚDataCola3  
    a data holding column, by definition this is not indexable

    Parameters
    ----------
    data   : the actual data
    cname  : the column name in the table to hold the data (typically
                values)
    meta   : a string description of the metadata
    metadata : the actual metadata
    Frð  r  Nra   r[   rò  rY   r  úDtypeArg | NonerZ   r›   c                   s2   t ƒ j|||||||||	|
|d� || _|| _d S )N)ra   ry  rˆ  ró  rô  rò  rð  r  rv   rÅ   rõ  )ÚsuperrØ   r  r¤  )r×   ra   ry  rˆ  ró  rò  rô  rð  r  rv   rÅ   rõ  r  r¤  ©Ú	__class__rU   rV   rØ   F	  s   õ
zDataCol.__init__c                 C  rù  )NÚ_dtyper`   rÛ   rU   rU   rV   Ú
dtype_attrf	  rü  zDataCol.dtype_attrc                 C  rù  )NÚ_metar`   rÛ   rU   rU   rV   Ú	meta_attrj	  rü  zDataCol.meta_attrc                 C  rþ  )Nrÿ  c                 S  r   r  rU   rl  rU   rU   rV   rl   u	  r  z$DataCol.__repr__.<locals>.<listcomp>)ra   rò  r  rˆ  Úshape)
rn   r  r>   ra   rò  r  rˆ  re  r  rN  r  rU   rU   rV   r÷   n	  s   ÿÿþÿzDataCol.__repr__r  r   r‘   c                   r  )r	  c                 3  r
  r\   r  r¡  r  rU   rV   rj  }	  r  z!DataCol.__eq__.<locals>.<genexpr>)ra   rò  r  rô  r  r  rU   r  rV   r  {	  r  zDataCol.__eq__r¤  rG   c                 C  s@   |d usJ ‚| j d u sJ ‚t|ƒ\}}|| _|| _ t|ƒ| _d S r\   )r  Ú_get_data_and_dtype_namer¤  Ú_dtype_to_kindrˆ  )r×   r¤  Ú
dtype_namerU   rU   rV   Úset_data‚	  s   zDataCol.set_datac                 C  rÙ   )zreturn the data©r¤  rÛ   rU   rU   rV   r&  Œ	  rà   zDataCol.take_datary  rC   c                 C  sÖ   |j }|j}|j}|jdkrd|jf}t|tƒr&|j}| j||j j	d�}|S t
 |d¡s1t|tƒr8|  |¡}|S t
 |d¡rE|  |¡}|S t|ƒrUtƒ j||d d�}|S t|ƒra|  ||¡}|S | j||j	d�}|S )zW
        Get an appropriately typed and shaped pytables.Col object for values.
        re   ©rˆ  r  Úmr   ©rø  re  )r  rø  re  rr  ÚsizerP   r3   ÚcodesÚget_atom_datara   r   r  r%   Úget_atom_datetime64Úget_atom_timedelta64r    r…   Ú
ComplexColr"   Úget_atom_string)rÊ  ry  r  rø  re  ro  ÚatomrU   rU   rV   Ú	_get_atom�	  s.   


õ

÷
ùûþzDataCol._get_atomc                 C  s   t ƒ j||d d�S )Nr   rm  ©r…   r1  ©rÊ  re  rø  rU   rU   rV   rt  °	  ó   zDataCol.get_atom_stringrˆ  ú	type[Col]c                 C  sR   |  d¡r|dd… }d|› d�}n|  d¡rd}n	| ¡ }|› d�}ttƒ |ƒS )z0return the PyTables column class for this columnÚuinté   NÚUIntrC   ÚperiodÚInt64Col)r™  Ú
capitalizerŽ  r…   )rÊ  rˆ  Úk4Úcol_nameÚkcaprU   rU   rV   Úget_atom_coltype´	  s   


zDataCol.get_atom_coltypec                 C  s   | j |d�|d d�S )Nrk  r   ©re  ©r„  ©rÊ  re  rˆ  rU   rU   rV   rp  Ã	  rN  zDataCol.get_atom_datac                 C  ó   t ƒ j|d d�S ©Nr   r…  ©r…   r  ©rÊ  re  rU   rU   rV   rq  Ç	  ó   zDataCol.get_atom_datetime64c                 C  rˆ  r‰  rŠ  r‹  rU   rU   rV   rr  Ë	  rŒ  zDataCol.get_atom_timedelta64c                 C  ó   t | jdd ƒS )Nre  )rŽ  r¤  rÛ   rU   rU   rV   re  Ï	  ó   zDataCol.shapec                 C  rÙ   r-  rj  rÛ   rU   rU   rV   r.  Ó	  r/  zDataCol.cvaluesc                 C  sh   |r.t | j| jdƒ}|dur|t| jƒkrtdƒ‚t | j| jdƒ}|dur0|| jkr2tdƒ‚dS dS dS )zAvalidate that we have the same order as the existing & same dtypeNz4appended items do not match existing items in table!z@appended items dtype do not match existing items dtype in table!)rŽ  r'  rû  rm   ry  r°   rb  r  )r×   r�   Úexisting_fieldsÚexisting_dtyperU   rU   rV   r8  Ø	  s   ÿùzDataCol.validate_attrr  rX   rš   c                 C  s   t |tjƒsJ t|ƒƒ‚|jjdur|| j }| jdusJ ‚| jdu r.t|ƒ\}}t	|ƒ}n|}| j}| j
}t |tjƒs>J ‚t| jƒ}| j}	| j}
| j}|dusRJ ‚t|ƒ}|dkrbt||dd�}n‹|dkrntj|dd�}n|dkr–ztjd	d
„ |D ƒtd�}W nl ty•   tjdd
„ |D ƒtd�}Y nXw |dkrÓ|	}| ¡ }|du r¬tg tjd�}nt|ƒ}| ¡ rÉ||  }||dk  | t¡ ¡ j8  < tj|||
dd�}nz	|j|dd�}W n tyì   |jddd�}Y nw t|ƒdkrût ||||d�}| j!|fS )aR  
        Convert the data from this selection to the appropriate pandas type.

        Parameters
        ----------
        values : np.ndarray
        nan_rep :
        encoding : str
        errors : str

        Returns
        -------
        index : listlike to become an Index
        data : ndarraylike to become a column
        NÚ
datetime64T©ÚcoerceÚtimedelta64úm8[ns]©r  r   c                 S  ó   g | ]}t  |¡‘qS rU   ©r   Úfromordinal©rh   rm  rU   rU   rV   rl   
  r<  z#DataCol.convert.<locals>.<listcomp>c                 S  r—  rU   ©r   Úfromtimestamprš  rU   rU   rV   rl    
  r<  rO  éÿÿÿÿF)Ú
categoriesr  Úvalidate©r¥  ÚOr0  ©rœ   rX   rš   )"rP   rQ   r  rë   r  r  rò  ró  rf  rg  rˆ  rW   rÅ   rõ  r  rð  r  ÚasarrayÚobjectr°   Úravelr+   Úfloat64r2   ÚanyÚastyperd   ÚcumsumÚ_valuesr3   Ú
from_codesr·   Ú_unconvert_string_arrayry  )r×   ry  rœ   rX   rš   Ú	convertedrh  rˆ  rÅ   rõ  r  rð  r  rž  ro  ÚmaskrU   rU   rV   r$  å	  sj   




ÿ
ÿÿ
 ÿÿÿ
zDataCol.convertc                 C  sH   t | j| j| jƒ t | j| j| jƒ | jdusJ ‚t | j| j| jƒ dS )zset the data for this columnN)rF  r'  rû  ry  rd  rÅ   r  rb  rÛ   rU   rU   rV   r;  I
  s   zDataCol.set_attr)NNNNNNNNNNNN)ra   r[   rò  rY   r  r]  rZ   r›   rÚ  rV  )r¤  rG   rZ   r›   )ry  rG   rZ   rC   )rˆ  r[   rZ   rz  ©rˆ  r[   rZ   rC   rÝ  )ry  r  rX   r[   rš   r[   )rì   rã  rä  rå  rí  rî  rB  rØ   rç  rb  rd  r÷   r  ri  r&  Úclassmethodrv  rt  r„  rp  rq  rr  re  r.  r8  r$  r;  Ú__classcell__rU   rU   r_  rV   r\  5	  sZ    ò 










dr\  c                   @  sP   e Zd ZdZdZddd„Zedd„ ƒZeddd„ƒZedd„ ƒZ	edd„ ƒZ
dS )ÚDataIndexableColz+represent a data column that can be indexedTrZ   r›   c                 C  s   t t| jƒjƒstdƒ‚d S )Nú-cannot have non-object label DataIndexableCol)r"   r+   ry  r  r°   rÛ   rU   rU   rV   r4  V
  s   þzDataIndexableCol.validate_namesc                 C  s   t ƒ j|d�S )N)rø  rw  rx  rU   rU   rV   rt  [
  rŽ  z DataIndexableCol.get_atom_stringrˆ  r[   rC   c                 C  s   | j |d�ƒ S )Nrk  r†  r‡  rU   rU   rV   rp  _
  rŽ  zDataIndexableCol.get_atom_datac                 C  ó
   t ƒ  ¡ S r\   rŠ  r‹  rU   rU   rV   rq  c
  ó   
z$DataIndexableCol.get_atom_datetime64c                 C  r´  r\   rŠ  r‹  rU   rU   rV   rr  g
  rµ  z%DataIndexableCol.get_atom_timedelta64NrÝ  r¯  )rì   rã  rä  rå  rî  r4  r°  rt  rp  rq  rr  rU   rU   rU   rV   r²  Q
  s    


r²  c                   @  s   e Zd ZdZdS )ÚGenericDataIndexableColz(represent a generic pytables data columnN)rì   rã  rä  rå  rU   rU   rU   rV   r¶  l
  s    r¶  c                   @  s|  e Zd ZU dZded< dZded< ded< ded	< d
ed< dZded< 		dPdQdd„ZedRdd„ƒZ	edSdd„ƒZ
edd „ ƒZdTd!d"„ZdUd#d$„ZdVd%d&„Zed'd(„ ƒZed)d*„ ƒZed+d,„ ƒZed-d.„ ƒZedWd/d0„ƒZedRd1d2„ƒZed3d4„ ƒZdUd5d6„ZdUd7d8„Zed9d:„ ƒZedRd;d<„ƒZed=d>„ ƒZdXd@dA„ZdYdUdCdD„ZdRdEdF„Z	B	B	B	BdZd[dJdK„ZdLdM„ Z	Bd\d]dNdO„Z dBS )^ÚFixedzø
    represent an object in my store
    facilitate read/write of various types of objects
    this is an abstract base class

    Parameters
    ----------
    parent : HDFStore
    group : Node
        The group node where the table resides.
    r[   Úpandas_kindru   Úformat_typeútype[DataFrame | Series]Úobj_typerd   rr  r¤   rÊ   Fr‘   rO  rO   r~   rÃ   rE   rX   rY   rš   rZ   r›   c                 C  sZ   t |tƒsJ t|ƒƒ‚td usJ ‚t |tjƒsJ t|ƒƒ‚|| _|| _t|ƒ| _|| _	d S r\   )
rP   r¤   rë   r   rE   rÊ   rÃ   r_   rX   rš   )r×   rÊ   rÃ   rX   rš   rU   rU   rV   rØ   „
  s   

zFixed.__init__c                 C  s*   | j d dko| j d dko| j d dk S )Nr   re   é
   é   )ÚversionrÛ   rU   rU   rV   Úis_old_version“
  s   *zFixed.is_old_versionútuple[int, int, int]c                 C  sf   t t| jjddƒƒ}ztdd„ | d¡D ƒƒ}t|ƒdkr$|d }W |S W |S  ty2   d}Y |S w )	zcompute and set our versionÚpandas_versionNc                 s  s   � | ]}t |ƒV  qd S r\   ©rd   r>  rU   rU   rV   rj  œ
  s   € z Fixed.version.<locals>.<genexpr>Ú.r½  rA  )r   r   r   )rW   rŽ  rÃ   r�  rn   rÔ  ro   r�   )r×   r¾  rU   rU   rV   r¾  —
  s   
üþþzFixed.versionc                 C  s   t t| jjdd ƒƒS )Nr‹  )rW   rŽ  rÃ   r�  rÛ   rU   rU   rV   r‹  £
  ry  zFixed.pandas_typec                 C  s^   |   ¡  | j}|dur,t|ttfƒr"d dd„ |D ƒ¡}d|› d�}| jd›d|› d	�S | jS )
ú(return a pretty representation of myselfNrÿ  c                 S  ó   g | ]}t |ƒ‘qS rU   ©r>   r>  rU   rU   rV   rl   ­
  ó    z"Fixed.__repr__.<locals>.<listcomp>ú[r=  ú12.12z	 (shape->ú))r-  re  rP   rm   rn   r  r‹  )r×   rT   ÚjshaperU   rU   rV   r÷   §
  s   zFixed.__repr__c                 C  s   t | jƒ| j_t tƒ| j_dS )zset my pandas type & versionN)r[   r¸  r'  r‹  Ú_versionrÁ  rÛ   rU   rU   rV   rÐ  ²
  s   zFixed.set_object_infoc                 C  s   t   | ¡}|S r\   r   )r×   Únew_selfrU   rU   rV   r¥  ·
  s   
z
Fixed.copyc                 C  rÙ   r\   )r+  rÛ   rU   rU   rV   re  »
  rà   zFixed.shapec                 C  r÷  r\   ©rÃ   r»   rÛ   rU   rU   rV   rP  ¿
  r(  zFixed.pathnamec                 C  r÷  r\   )rÊ   rË   rÛ   rU   rU   rV   rË   Ã
  r(  zFixed._handlec                 C  r÷  r\   )rÊ   rÕ   rÛ   rU   rU   rV   rÕ   Ç
  r(  zFixed._filtersc                 C  r÷  r\   )rÊ   rÒ   rÛ   rU   rU   rV   rÒ   Ë
  r(  zFixed._complevelc                 C  r÷  r\   )rÊ   rÔ   rÛ   rU   rU   rV   rÔ   Ï
  r(  zFixed._fletcher32c                 C  r÷  r\   )rÃ   r�  rÛ   rU   rU   rV   r'  Ó
  r(  zFixed.attrsc                 C  rX  ©zset our object attributesNrU   rÛ   rU   rU   rV   Ú	set_attrs×
  ó    zFixed.set_attrsc                 C  rX  )zget our object attributesNrU   rÛ   rU   rU   rV   Ú	get_attrsÚ
  rÑ  zFixed.get_attrsc                 C  rÙ   )zreturn my storable©rÃ   rÛ   rU   rU   rV   ÚstorableÝ
  r/  zFixed.storablec                 C  rX  rY  rU   rÛ   rU   rU   rV   rÏ  â
  rZ  zFixed.is_existsc                 C  r�  )Nr+  )rŽ  rÔ  rÛ   rU   rU   rV   r+  æ
  rŽ  zFixed.nrowsúLiteral[True] | Nonec                 C  s   |du rdS dS )z%validate against an existing storableNTrU   r  rU   rU   rV   rŸ  ê
  s   zFixed.validateNc                 C  rX  )ú+are we trying to operate on an old version?NrU   )r×   rp   rU   rU   rV   Úvalidate_versionð
  rÑ  zFixed.validate_versionc                 C  s   | j }|du r	dS |  ¡  dS )zr
        infer the axes of my storer
        return a boolean indicating if we have a valid storer or not
        NFT)rÔ  rÒ  )r×   rT   rU   rU   rV   r-  ó
  s
   zFixed.infer_axesr¨   rŽ   r©   c                 C  ó   t dƒ‚)Nz>cannot read on an abstract storer: subclasses should implement©r³   ©r×   rp   rª   r¨   r©   rU   rU   rV   r#  þ
  s   ÿz
Fixed.readc                 K  rØ  )Nz?cannot write on an abstract storer: subclasses should implementrÙ  ©r×   r¿   rU   rU   rV   rÑ  	  s   ÿzFixed.writec                 C  s,   t  |||¡r| jj| jdd� dS tdƒ‚)zs
        support fully deleting the node in its entirety (only) - where
        specification must be None
        TrY  Nz#cannot delete on an abstract storer)r^  r_  rË   rÒ  rÃ   r·   )r×   rp   r¨   r©   rU   rU   rV   r`    s   zFixed.delete)rO   r~   )
rÊ   r¤   rÃ   rE   rX   rY   rš   r[   rZ   r›   rÞ  )rZ   rÀ  rÚ  rÝ  )rZ   r·  rÜ  )rZ   rÕ  r\   ©NNNN©r¨   rŽ   r©   rŽ   rà  )r¨   rŽ   r©   rŽ   rZ   r›   )!rì   rã  rä  rå  ræ  r¹  rO  rØ   rç  r¿  r¾  r‹  r÷   rÐ  r¥  re  rP  rË   rÕ   rÒ   rÔ   r'  rÐ  rÒ  rÔ  rÏ  r+  rŸ  r×  r-  r#  rÑ  r`  rU   rU   rU   rV   r·  p
  sj   
 û














ûÿr·  c                   @  sî   e Zd ZU dZedediZdd„ e ¡ D ƒZg Z	de
d< d<d
d„Zdd„ Zdd„ Zd=dd„Zed>dd„ƒZd=dd„Zd=dd„Zd=dd„Zd?d@d!d"„Z	d?dAd$d%„ZdBd'd(„ZdCd*d+„Z	d?dDd,d-„Z	d?dEd0d1„ZdFd4d5„Z	dGdHd:d;„ZdS )IÚGenericFixedza generified fixed versionÚdatetimer~  c                 C  s   i | ]\}}||“qS rU   rU   )rh   r;  rm  rU   rU   rV   rn     r<  zGenericFixed.<dictcomp>r  Ú
attributesrZ   r[   c                 C  s   | j  |d¡S )NÚ )Ú_index_type_maprâ   )r×   rÊ  rU   rU   rV   Ú_class_to_alias$  s   zGenericFixed._class_to_aliasc                 C  s   t |tƒr|S | j |t¡S r\   )rP   rë   Ú_reverse_index_maprâ   r+   )r×   ÚaliasrU   rU   rV   Ú_alias_to_class'  s   
zGenericFixed._alias_to_classc                 C  s¸   |   tt|ddƒƒ¡}|tkrd	dd„}|}n|tkr#d	dd„}|}n|}i }d|v r7|d |d< |tu r7t}d|v rXt|d tƒrL|d  	d¡|d< n|d |d< |tu sXJ ‚||fS )
NÚindex_classrá  c                 S  s:   t j| j|d�}tj|d d�}|d ur| d¡ |¡}|S )N)rï  r`   ÚUTC)r4   Ú_simple_newry  r*   Útz_localizeÚ
tz_convert)ry  rï  rð  ÚdtaÚresultrU   rU   rV   rw   6  s
   z*GenericFixed._get_index_factory.<locals>.fc                 S  s$   t |ƒ}tj| |d�}tj|d d�S )Nr–  r`   )r'   r5   ré  r-   )ry  rï  rð  r  ÚparrrU   rU   rV   rw   A  s   rï  rð  zutf-8râ  )
ræ  rW   rŽ  r*   r-   r+   r0   rP   ÚbytesrS   )r×   r'  rç  rw   r!  r¿   rU   rU   rV   Ú_get_index_factory-  s*   ÿ

zGenericFixed._get_index_factoryr›   c                 C  s$   |durt dƒ‚|durt dƒ‚dS )zE
        raise if any keywords are passed which are not-None
        Nzqcannot pass a column specification when reading a Fixed format store. this store must be selected in its entiretyzucannot pass a where specification when reading from a Fixed format store. this store must be selected in its entirety)r·   )r×   rª   rp   rU   rU   rV   Úvalidate_read\  s   ÿÿÿzGenericFixed.validate_readr‘   c                 C  rX  )NTrU   rÛ   rU   rU   rV   rÏ  k  rZ  zGenericFixed.is_existsc                 C  s   | j | j_ | j| j_dS rÏ  )rX   r'  rš   rÛ   rU   rU   rV   rÐ  o  s   
zGenericFixed.set_attrsc              	   C  sR   t t| jddƒƒ| _tt| jddƒƒ| _| jD ]}t| |tt| j|dƒƒƒ qdS )úretrieve our attributesrX   Nrš   r~   )r_   rŽ  r'  rX   rW   rš   rà  rF  )r×   r  rU   rU   rV   rÒ  t  s
   
ÿzGenericFixed.get_attrsc                 K  r   r\   )rÐ  ©r×   rÍ  r¿   rU   rU   rV   rÑ  |  ró   zGenericFixed.writeNr‰   r¨   rŽ   r©   c                 C  sÌ   ddl }t| j|ƒ}|j}t|ddƒ}t||jƒr"|d ||… }n=tt|ddƒƒ}	t|ddƒ}
|
dur<tj|
|	d�}n|||… }|	dkrTt|d	dƒ}t	||d
d�}n|	dkr_tj
|dd�}|rd|jS |S )z2read an array for the specified node (off of groupr   NÚ
transposedFÚ
value_typere  r–  r‘  rð  Tr’  r”  r•  )r€   rŽ  rÃ   r�  rP   ÚVLArrayrW   rQ   rÌ  r  r£  ÚT)r×   r‰   r¨   r©   r€   rï   r'  rô  Úretr  re  rð  rU   rU   rV   Ú
read_array  s&   zGenericFixed.read_arrayr+   c                 C  sd   t t| j|› d�ƒƒ}|dkr| j|||d�S |dkr+t| j|ƒ}| j|||d�}|S td|› �ƒ‚)NÚ_varietyÚmulti©r¨   r©   Úregularzunrecognized index variety: )rW   rŽ  r'  Úread_multi_indexrÃ   Úread_index_noder·   )r×   r‰   r¨   r©   Úvarietyrï   r“   rU   rU   rV   Ú
read_index¡  s   zGenericFixed.read_indexr“   c                 C  sê   t |tƒrt| j|› d�dƒ |  ||¡ d S t| j|› d�dƒ td|| j| jƒ}|  ||j	¡ t
| j|ƒ}|j|j_|j|j_t |ttfƒrQ|  t|ƒ¡|j_t |tttfƒr^|j|j_t |tƒrq|jd urst|jƒ|j_d S d S d S )Nrú  rû  rý  r“   )rP   r,   rF  r'  Úwrite_multi_indexÚ_convert_indexrX   rš   Úwrite_arrayry  rŽ  rÃ   rˆ  r�  ra   r*   r-   rã  rë   rç  r0   rï  rð  Ú_get_tz)r×   r‰   r“   r­  rï   rU   rU   rV   Úwrite_index¯  s    



ÿzGenericFixed.write_indexr,   c                 C  sÒ   t | j|› d�|jƒ tt|j|j|jƒƒD ]P\}\}}}t|j	t
ƒr'tdƒ‚|› d|› �}t||| j| jƒ}|  ||j¡ t| j|ƒ}	|j|	j_||	j_t |	j|› d|› �|ƒ |› d|› �}
|  |
|¡ qd S )NÚ_nlevelsz=Saving a MultiIndex with an extension dtype is not supported.Ú_levelÚ_nameÚ_label)rF  r'  rÀ  Ú	enumeraterN  Úlevelsro  ÚnamesrP   r  r&   r³   r  rX   rš   r  ry  rŽ  rÃ   rˆ  r�  ra   )r×   r‰   r“   ÚiÚlevÚlevel_codesra   Ú	level_keyÚ
conv_levelrï   Ú	label_keyrU   rU   rV   r  Æ  s$   ÿÿ
ìzGenericFixed.write_multi_indexc                 C  s¤   t | j|› d�ƒ}g }g }g }t|ƒD ]6}|› d|› �}	t | j|	ƒ}
| j|
||d�}| |¡ | |j¡ |› d|› �}| j|||d�}| |¡ qt|||dd�S )Nr  r  rü  r
  T)r  ro  r  rG  )	rŽ  r'  rq  rÃ   rÿ  r�   ra   rù  r,   )r×   r‰   r¨   r©   rÀ  r  ro  r  r  r  rï   r  r  r  rU   rU   rV   rþ  ß  s    
ÿzGenericFixed.read_multi_indexrï   rE   c                 C  sØ   |||… }d|j v rt |j j¡dkrtj|j j|j jd�}t|j jƒ}d }d|j v r6t|j j	ƒ}t|ƒ}|j }|  
|¡\}}	|dv rW|t||| j| jd�fdti|	¤Ž}
n|t||| j| jd�fi |	¤Ž}
||
_	|
S )Nre  r   r–  ra   )r   r¤  r·  r  )r�  rQ   Úprodre  rÌ  rõ  rW   rˆ  rb   ra   rð  Ú_unconvert_indexrX   rš   r¤  )r×   rï   r¨   r©   r¤  rˆ  ra   r'  r!  r¿   r“   rU   rU   rV   rÿ  ö  s:   
ÿÿüûÿÿüzGenericFixed.read_index_noderŠ   rG   c                 C  sJ   t  d|j ¡}| j | j||¡ t| j|ƒ}t|jƒ|j	_
|j|j	_dS )zwrite a 0-len array©re   N)rQ   rÌ  rr  rË   Úcreate_arrayrÃ   rŽ  r[   r  r�  rõ  re  )r×   r‰   rŠ   Úarrrï   rU   rU   rV   Úwrite_array_empty  s
   zGenericFixed.write_array_emptyrÍ  rF   r  úIndex | Nonec                 C  sJ  t |dd�}|| jv r| j | j|¡ |jdk}d}t|jtƒr$tdƒ‚|s0t	|dƒr0|j
}d}d }| jd urSttƒ� tƒ j |j¡}W d   ƒ n1 sNw   Y  |d uru|sn| jj| j|||j| jd�}||d d …< n­|  ||¡ n¦|jjtjkr­tj|dd�}	|r†n|	d	kr‹nt|	||f }
tj|
ttƒ d
� | j | j|tƒ  ¡ ¡}|  |¡ nnt !|jd¡rÉ| j "| j|| #d¡¡ dt$| j|ƒj%_&nRt|jt'ƒrë| j "| j||j(¡ t$| j|ƒ}t)|j*ƒ|j%_*d|j%_&n0t !|jd¡�r| j "| j|| #d¡¡ dt$| j|ƒj%_&n|�r|  ||¡ n	| j "| j||¡ |t$| j|ƒj%_+d S )NT)Úextract_numpyr   Fz]Cannot store a category dtype in a HDF5 dataset that uses format="fixed". Use format="table".r÷  )rÎ   ©Úskipnar0  r@  r  r  r‘  rl  r”  ),r8   rÃ   rË   rÒ  rn  rP   r  r$   r³   r  r÷  rÕ   r   r°   r…   ÚAtomÚ
from_dtypeÚcreate_carrayre  r  rë   rQ   Úobject_r   Úinfer_dtypert   rD  rE  r   r   Úcreate_vlarrayÚ
ObjectAtomr�   r  r  ÚviewrŽ  r�  rõ  r%   Úasi8r  rð  rô  )r×   r‰   rÍ  r  rŠ   Úempty_arrayrô  ru  ÚcaÚinferred_typerI  Úvlarrrï   rU   rU   rV   r  %  sh   

ÿ


þÿ
ÿ
zGenericFixed.write_arrayrÚ  rÝ  rÞ  râ  rá  )r‰   r[   r¨   rŽ   r©   rŽ   rZ   r+   )r‰   r[   r“   r+   rZ   r›   )r‰   r[   r“   r,   rZ   r›   )r‰   r[   r¨   rŽ   r©   rŽ   rZ   r,   )rï   rE   r¨   rŽ   r©   rŽ   rZ   r+   )r‰   r[   rŠ   rG   rZ   r›   r\   )r‰   r[   rÍ  rF   r  r  rZ   r›   )rì   rã  rä  rå  r*   r-   râ  r  rä  rà  ræ  rã  ræ  rð  rñ  rç  rÏ  rÐ  rÒ  rÑ  rù  r  r  r  rþ  rÿ  r  r  rU   rU   rU   rV   rÞ    s4   
 

/


#ÿ

ÿÿ
&
ÿrÞ  c                      sR   e Zd ZU dZdgZded< edd„ ƒZ				dddd„Zd‡ fdd„Z	‡  Z
S )r¾  r³  ra   r?   c              	   C  s*   zt | jjƒfW S  ttfy   Y d S w r\   )ro   rÃ   ry  r·   r�   rÛ   rU   rU   rV   re  †  s
   ÿzSeriesFixed.shapeNr¨   rŽ   r©   rZ   r/   c                 C  s^   |   ||¡ | jd||d�}| jd||d�}t||| jdd�}tƒ r-t|dd�r-| d¡}|S )	Nr“   rü  ry  F)r“   ra   r¥  Tr  ústring[pyarrow_numpy])rñ  r  rù  r/   ra   r   r   r¨  )r×   rp   rª   r¨   r©   r“   ry  rí  rU   rU   rV   r#  �  s   
zSeriesFixed.readr›   c                   s<   t ƒ j|fi |¤Ž |  d|j¡ |  d|¡ |j| j_d S )Nr“   ry  )r^  rÑ  r  r“   r  ra   r'  ró  r_  rU   rV   rÑ  �  s   zSeriesFixed.writerÜ  ©r¨   rŽ   r©   rŽ   rZ   r/   rÝ  )rì   rã  rä  r¸  rà  ræ  rç  re  r#  rÑ  r±  rU   rU   r_  rV   r¾  €  s   
 
ûr¾  c                      sR   e Zd ZU ddgZded< eddd„ƒZ				dddd„Zd‡ fdd„Z‡  Z	S )ÚBlockManagerFixedrr  Únblocksrd   rZ   úShape | Nonec                 C  sª   zJ| j }d}t| jƒD ]}t| jd|› d�ƒ}t|dd ƒ}|d ur'||d 7 }q| jj}t|dd ƒ}|d urAt|d|d … ƒ}ng }| |¡ |W S  tyT   Y d S w )Nr   ÚblockÚ_itemsre  re   )	rr  rq  r.  rŽ  rÃ   Úblock0_valuesrm   r�   r�   )r×   rr  r  r  rï   re  rU   rU   rV   re  ©  s&   €
ÿzBlockManagerFixed.shapeNr¨   rŽ   r©   r)   c                 C  s6  |   ||¡ |  ¡  d¡}g }t| jƒD ]}||kr||fnd\}}	| jd|› �||	d�}
| |
¡ q|d }g }t| jƒD ]<}|  d|› d�¡}| jd|› d�||	d�}|| 	|¡ }t
|j||d d	d
�}tƒ rut|dd�ru| d¡}| |¡ q>t|ƒdkr‘t|ddd�}|j|d	d�}|S t
|d |d d�S )Nr   râ  rF  rü  r0  r1  rª  re   F©rª   r“   r¥  Tr  r+  )rF  r¥  )rª   r¥  ©rª   r“   )rñ  r»  Ú_get_block_manager_axisrq  rr  r  r�   r.  rù  rw  r)   r÷  r   r   r¨  ro   r1   r|  )r×   rp   rª   r¨   r©   Úselect_axisrc  r  r%  r&  Úaxr  ÚdfsÚ	blk_itemsry  ÚdfÚoutrU   rU   rV   r#  Ä  s,   
zBlockManagerFixed.readr›   c                   sè   t ƒ j|fi |¤Ž t|jtƒr| d¡}|j}| ¡ s | ¡ }|j| j	_t
|jƒD ]\}}|dkr9|js9tdƒ‚|  d|› �|¡ q*t|jƒ| j	_t
|jƒD ]"\}}|j |j¡}| jd|› d�|j|d� |  d|› d�|¡ qOd S )Nr0  r   z/Columns index has to be unique for fixed formatrF  rª  )r  r1  )r^  rÑ  rP   Ú_mgrr:   Ú_as_managerÚis_consolidatedÚconsolidaterr  r'  r  rc  Ú	is_uniquer°   r  ro   Úblocksr.  r  rx  Úmgr_locsr  ry  )r×   rÍ  r¿   r¤  r  r7  Úblkr9  r_  rU   rV   rÑ  ê  s"   

üzBlockManagerFixed.write)rZ   r/  rÜ  )r¨   rŽ   r©   rŽ   rZ   r)   rÝ  )
rì   rã  rä  rà  ræ  rç  re  r#  rÑ  r±  rU   rU   r_  rV   r-  ¤  s   
 û&r-  c                   @  s   e Zd ZdZeZdS )r¿  r´  N)rì   rã  rä  r¸  r)   r»  rU   rU   rU   rV   r¿    s    r¿  c                      s(  e Zd ZU dZdZdZded< ded< dZded	< d
Zded< 								d‹dŒ‡ fd"d#„Z	e
d�d$d%„ƒZd�d&d'„ZdŽd)d*„Zd�d+d,„Ze
d�d.d/„ƒZd‘d3d4„Ze
d’d6d7„ƒZe
d�d8d9„ƒZe
d:d;„ ƒZe
d<d=„ ƒZe
d>d?„ ƒZe
d@dA„ ƒZe
d“dCdD„ƒZe
d’dEdF„ƒZe
d�dGdH„ƒZe
d”dJdK„ƒZd•dMdN„ZdOdP„ Zd–dRdS„Zd—dUdV„Zd˜dYdZ„Zd™d[d\„Z d�d]d^„Z!d�d_d`„Z"dšd�dadb„Z#d�dcdd„Z$e%dedf„ ƒZ&	d›dœdhdi„Z'	d�dždndo„Z(e)dŸdqdr„ƒZ*dsdt„ Z+	
			d d¡dwdx„Z,e-d¢d{d|„ƒZ.dšd£dd€„Z/d¤d„d…„Z0	d›d¥d†d‡„Z1			d›d¦d‰dŠ„Z2‡  Z3S )§r  aa  
    represent a table:
        facilitate read/write of various types of tables

    Attrs in Table Node
    -------------------
    These are attributes that are store in the main table node, they are
    necessary to recreate these tables when read back in.

    index_axes    : a list of tuples of the (original indexing axis and
        index column)
    non_index_axes: a list of tuples of the (original index axis and
        columns on a non-indexing axis)
    values_axes   : a list of the columns which comprise the data of this
        table
    data_columns  : a list of the columns that we are allowing indexing
        (these become single columns in values_axes)
    nan_rep       : the string to use for nan representations for string
        objects
    levels        : the names of levels
    metadata      : the names of the metadata columns
    Ú
wide_tablerv   r[   r¹  r°  re   zint | list[Hashable]r  Trm   rõ  Nr~   rÊ   r¤   rÃ   rE   rX   rY   rš   Ú
index_axesúlist[IndexCol] | NonerB  ú list[tuple[AxisInt, Any]] | NoneÚvalues_axesúlist[DataCol] | Noner˜   úlist | Noner¬  údict | NonerZ   r›   c                   sP   t ƒ j||||d� |pg | _|pg | _|pg | _|pg | _|	p!i | _|
| _d S )Nr·  )r^  rØ   rE  rB  rH  r˜   r¬  rœ   )r×   rÊ   rÃ   rX   rš   rE  rB  rH  r˜   r¬  rœ   r_  rU   rV   rØ   )  s   





zTable.__init__c                 C  s   | j  d¡d S )NÚ_r   )r°  rÔ  rÛ   rU   rU   rV   Útable_type_short>  ó   zTable.table_type_shortc                 C  s¦   |   ¡  t| jƒrd | j¡nd}d|› d�}d}| jr-d dd„ | jD ƒ¡}d|› d�}d d	d„ | jD ƒ¡}| jd
›|› d| j› d| j	› d| j
› d|› d|› d�S )rÄ  rÿ  rá  z,dc->[r=  rÃ  c                 S  rÅ  rU   ©r[   r>  rU   rU   rV   rl   J  rÇ  z"Table.__repr__.<locals>.<listcomp>rÈ  c                 S  r  rU   r`   r¡  rU   rU   rV   rl   M  r	  rÉ  z (typ->z,nrows->z,ncols->z,indexers->[rÊ  )r-  ro   r˜   r  r¿  r¾  rE  r‹  rM  r+  Úncols)r×   Újdcrƒ  ÚverÚjverÚjindex_axesrU   rU   rV   r÷   B  s(   ÿÿþþþÿzTable.__repr__r=  c                 C  s"   | j D ]}||jkr|  S qdS )zreturn the axis for cN)rc  ra   )r×   r=  r†   rU   rU   rV   rä   T  s
   

ÿzTable.__getitem__c              
   C  sº   |du rdS |j | j krtd|j › d| j › d�ƒ‚dD ]?}t| |dƒ}t||dƒ}||krZt|ƒD ]\}}|| }||krKtd|› d|› d|› d�ƒ‚q1td|› d|› d|› d�ƒ‚qdS )	z"validate against an existing tableNz'incompatible table_type with existing [r>  r=  )rE  rB  rH  zinvalid combination of [z] on appending data [z] vs current table [)r°  r·   rŽ  r  r°   r\  )r×   r  r=  ÚsvÚovr  ÚsaxÚoaxrU   rU   rV   rŸ  [  s@   ÿÿÿÿÿÿÿÿÿòýzTable.validater‘   c                 C  s   t | jtƒS )z@the levels attribute is 1 or a list in the case of a multi-index)rP   r  rm   rÛ   rU   rU   rV   Úis_multi_index|  s   zTable.is_multi_indexrÍ  r‹   ú tuple[DataFrame, list[Hashable]]c              
   C  sT   t  |jj¡}z| ¡ }W n ty } ztdƒ|‚d}~ww t|tƒs&J ‚||fS )ze
        validate that we can store the multi-index; reset and return the
        new object
        zBduplicate names/columns in the multi-index when storing as a tableN)r^  Úfill_missing_namesr“   r  Úreset_indexr°   rP   r)   )r×   rÍ  r  Ú	reset_objra  rU   rU   rV   Úvalidate_multiindex�  s   ÿþ€ÿzTable.validate_multiindexrd   c                 C  s   t  dd„ | jD ƒ¡S )z-based on our axes, compute the expected nrowsc                 S  s   g | ]}|j jd  ‘qS rA  )r.  re  ©rh   r  rU   rU   rV   rl   •  r¢  z(Table.nrows_expected.<locals>.<listcomp>)rQ   r  rE  rÛ   rU   rU   rV   Únrows_expected’  s   zTable.nrows_expectedc                 C  s
   d| j v S )zhas this table been createdrv   rÓ  rÛ   rU   rU   rV   rÏ  —  s   
zTable.is_existsc                 C  r�  ©Nrv   ©rŽ  rÃ   rÛ   rU   rU   rV   rÔ  œ  rŽ  zTable.storablec                 C  rÙ   )z,return the table group (this is my storable))rÔ  rÛ   rU   rU   rV   rv      r/  zTable.tablec                 C  r÷  r\   )rv   r  rÛ   rU   rU   rV   r  ¥  r(  zTable.dtypec                 C  r÷  r\   r)  rÛ   rU   rU   rV   r*  ©  r(  zTable.descriptionúitertools.chain[IndexCol]c                 C  s   t  | j| j¡S r\   )rL  rM  rE  rH  rÛ   rU   rU   rV   rc  ­  rN  z
Table.axesc                 C  s   t dd„ | jD ƒƒS )z.the number of total columns in the values axesc                 s  s   � | ]}t |jƒV  qd S r\   )ro   ry  r¡  rU   rU   rV   rj  ´  s   € zTable.ncols.<locals>.<genexpr>)ÚsumrH  rÛ   rU   rU   rV   rP  ±  s   zTable.ncolsc                 C  rX  rY  rU   rÛ   rU   rU   rV   Úis_transposed¶  rZ  zTable.is_transposedútuple[int, ...]c                 C  s(   t t dd„ | jD ƒdd„ | jD ƒ¡ƒS )z@return a tuple of my permutated axes, non_indexable at the frontc                 S  s   g | ]}t |d  ƒ‘qS rA  rÂ  r¡  rU   rU   rV   rl   ¿  r¢  z*Table.data_orientation.<locals>.<listcomp>c                 S  s   g | ]}t |jƒ‘qS rU   )rd   rF  r¡  rU   rU   rV   rl   À  r<  )rn   rL  rM  rB  rE  rÛ   rU   rU   rV   Údata_orientationº  s   þÿzTable.data_orientationúdict[str, Any]c                   sR   dddœ‰ dd„ ˆj D ƒ}‡ fdd„ˆjD ƒ}‡fdd„ˆjD ƒ}t|| | ƒS )z<return a dict of the kinds allowable columns for this objectr“   rª   ©r   re   c                 S  s   g | ]}|j |f‘qS rU   ©rò  r¡  rU   rU   rV   rl   Ê  r<  z$Table.queryables.<locals>.<listcomp>c                   s   g | ]
\}}ˆ | d f‘qS r\   rU   )rh   rF  ry  )Ú
axis_namesrU   rV   rl   Ë  s    c                   s&   g | ]}|j tˆ jƒv r|j|f‘qS rU   )ra   rp  r˜   rò  rš  rÛ   rU   rV   rl   Ì  s     )rE  rB  rH  rf  )r×   Úd1Úd2Úd3rU   )rk  r×   rV   Ú
queryablesÄ  s   

ÿzTable.queryablesc                 C  ó   dd„ | j D ƒS )zreturn a list of my index colsc                 S  s   g | ]}|j |jf‘qS rU   )rF  rò  r_  rU   rU   rV   rl   Õ  r¢  z$Table.index_cols.<locals>.<listcomp>©rE  rÛ   rU   rU   rV   Ú
index_colsÒ  r,  zTable.index_colsr  c                 C  rp  )zreturn a list of my values colsc                 S  r  rU   rj  r_  rU   rU   rV   rl   Ù  r	  z%Table.values_cols.<locals>.<listcomp>)rH  rÛ   rU   rU   rV   Úvalues_cols×  rN  zTable.values_colsr‰   c                 C  s   | j j}|› d|› d�S )z)return the metadata pathname for this keyz/meta/z/metarÎ  r!  rU   rU   rV   Ú_get_metadata_pathÛ  s   zTable._get_metadata_pathry  r  c                 C  s0   | j j|  |¡t|dd�d| j| j| jd� dS )z£
        Write out a metadata array to the key as a fixed-format Series.

        Parameters
        ----------
        key : str
        values : ndarray
        Fr   rv   )r’   rX   rš   rœ   N)rÊ   r£   rt  r/   rX   rš   rœ   )r×   r‰   ry  rU   rU   rV   r:  à  s   	

úzTable.write_metadatac                 C  s0   t t | jddƒ|dƒdur| j |  |¡¡S dS )z'return the meta data array for this keyrÅ   N)rŽ  rÃ   rÊ   r¼   rt  rã   rU   rU   rV   rS  ò  s   zTable.read_metadatac                 C  sp   t | jƒ| j_|  ¡ | j_|  ¡ | j_| j| j_| j| j_| j| j_| j| j_| j	| j_	| j
| j_
| j| j_dS )zset our table type & indexablesN)r[   r°  r'  rr  rs  rB  r˜   rœ   rX   rš   r  r¬  rÛ   rU   rU   rV   rÐ  ø  s   





zTable.set_attrsc                 C  s°   t | jddƒpg | _t | jddƒpg | _t | jddƒpi | _t | jddƒ| _tt | jddƒƒ| _tt | jddƒƒ| _	t | jd	dƒpBg | _
d
d„ | jD ƒ| _dd„ | jD ƒ| _dS )rò  rB  Nr˜   r¬  rœ   rX   rš   r~   r  c                 S  ó   g | ]}|j r|‘qS rU   ©rí  r¡  rU   rU   rV   rl     r<  z#Table.get_attrs.<locals>.<listcomp>c                 S  ó   g | ]}|j s|‘qS rU   rv  r¡  rU   rU   rV   rl     r<  )rŽ  r'  rB  r˜   r¬  rœ   r_   rX   rW   rš   r  Ú
indexablesrE  rH  rÛ   rU   rU   rV   rÒ    s   zTable.get_attrsc                 C  sF   |dur| j r!td dd„ | jD ƒ¡ }tj|ttƒ d� dS dS dS )rÖ  NrÃ  c                 S  rÅ  rU   rO  r>  rU   rU   rV   rl     rÇ  z*Table.validate_version.<locals>.<listcomp>r@  )r¿  rr   r  r¾  rD  rE  r   r   )r×   rp   rI  rU   rU   rV   r×    s   
ýýzTable.validate_versionc                 C  sR   |du rdS t |tƒsdS |  ¡ }|D ]}|dkrq||vr&td|› d�ƒ‚qdS )zˆ
        validate the min_itemsize doesn't contain items that are not in the
        axes this needs data_columns to be defined
        Nry  zmin_itemsize has the key [z%] which is not an axis or data_column)rP   rf  ro  r°   )r×   r”   Úqr;  rU   rU   rV   Úvalidate_min_itemsize  s   

ÿÿüzTable.validate_min_itemsizec                   sÔ   g }ˆj ‰ˆjj‰tˆjjƒD ]5\}\}}tˆ|ƒ}ˆ |¡}|dur%dnd}|› d�}tˆ|dƒ}	t||||	|ˆj||d�}
| |
¡ qt	ˆj
ƒ‰t|ƒ‰ ‡ ‡‡‡‡fdd„‰| ‡fdd„tˆjjƒD ƒ¡ |S )	z/create/cache the indexables if they don't existNrO  rú  )ra   rF  rô  rˆ  ró  rv   rÅ   rõ  c                   s¢   t |tƒsJ ‚t}|ˆv rt}tˆ|ƒ}t|ˆjƒ}tˆ|› d�d ƒ}tˆ|› d�d ƒ}t|ƒ}ˆ |¡}tˆ|› d�d ƒ}	|||||ˆ |  |ˆj	|	||d�
}
|
S )Nrú  ra  rc  )
ra   rò  ry  rˆ  rô  ró  rv   rÅ   rõ  r  )
rP   r[   r\  r²  rŽ  Ú_maybe_adjust_namer¾  rg  rS  rv   )r  r=  Úklassru  Úadj_namery  r  rˆ  ÚmdrÅ   rÍ  )Úbase_posrƒ  Údescr×   Útable_attrsrU   rV   rw   T  s0   

özTable.indexables.<locals>.fc                   s   g | ]	\}}ˆ ||ƒ‘qS rU   rU   )rh   r  r=  )rw   rU   rV   rl   y  r@  z$Table.indexables.<locals>.<listcomp>)r*  rv   r'  r  rr  rŽ  rS  rì  r�   rp  r˜   ro   rt  rs  )r×   Ú_indexablesr  rF  ra   ru  r~  rÅ   rû  rˆ  Ú	index_colrU   )r  rƒ  r€  rw   r×   r�  rV   rx  1  s2   


ø

 %zTable.indexablesrˆ  c              	   C  sP  |   ¡ sdS |du rdS |du s|du rdd„ | jD ƒ}t|ttfƒs&|g}i }|dur0||d< |dur8||d< | j}|D ]h}t|j|dƒ}|durŽ|jrx|j	}|j
}	|j}
|durc|
|krc| ¡  n|
|d< |durt|	|krt| ¡  n|	|d< |js�|j d¡r…td	ƒ‚|jdi |¤Ž q=|| jd
 d v r¥td|› d|› d|› d�ƒ‚q=dS )aZ  
        Create a pytables index on the specified columns.

        Parameters
        ----------
        columns : None, bool, or listlike[str]
            Indicate which columns to create an index on.

            * False : Do not create any indexes.
            * True : Create indexes on all columns.
            * None : Create indexes on all columns.
            * listlike : Create indexes on the given columns.

        optlevel : int or None, default None
            Optimization level, if None, pytables defaults to 6.
        kind : str or None, default None
            Kind of index, if None, pytables defaults to "medium".

        Raises
        ------
        TypeError if trying to create an index on a complex-type column.

        Notes
        -----
        Cannot index Time64Col or ComplexCol.
        Pytables must be >= 3.0.
        NFTc                 S  rŸ  rU   )rî  rò  r¡  rU   rU   rV   rl   ¢  r¢  z&Table.create_index.<locals>.<listcomp>r‡  rˆ  ÚcomplexzíColumns containing complex values can be stored but cannot be indexed when using table format. Either use fixed format, set index=False, or do not include the columns containing complex values to data_columns when initializing the table.r   re   zcolumn z/ is not a data_column.
In order to read column z: you must reload the dataframe 
into HDFStore and include z  with the data_columns argument.rU   )r-  rc  rP   rn   rm   rv   rŽ  ri  r   r“   r‡  rˆ  Úremove_indexrë   r™  r·   r‰  rB  r�   )r×   rª   r‡  rˆ  Úkwrv   r=  rm  r“   Úcur_optlevelÚcur_kindrU   rU   rV   r‰  }  sX   

ÿ€ÿþÿþâzTable.create_indexr¨   rŽ   r©   ú9list[tuple[np.ndarray, np.ndarray] | tuple[Index, Index]]c           	      C  sZ   t | |||d�}| ¡ }g }| jD ]}| | j¡ |j|| j| j| jd�}| 	|¡ q|S )a  
        Create the axes sniffed from the table.

        Parameters
        ----------
        where : ???
        start : int or None, default None
        stop : int or None, default None

        Returns
        -------
        List[Tuple[index_values, column_values]]
        r1  r¢  )
Ú	Selectionr¼   rc  rM  r¬  r$  rœ   rX   rš   r�   )	r×   rp   r¨   r©   Ú	selectionry  rê  r†   ÚresrU   rU   rV   Ú
_read_axesÓ  s   
üzTable._read_axesrô  c                 C  ó   |S )zreturn the data for this objrU   ©rÊ  rÍ  rô  rU   rU   rV   Ú
get_objectõ  s   zTable.get_objectc                   s²   t |ƒsg S |d \}‰ | j |i ¡}| d¡dkr&|r&td|› d|› �ƒ‚|du r/tˆ ƒ}n|du r5g }t|tƒrPt|ƒ‰t|ƒ}| ‡fdd	„| 	¡ D ƒ¡ ‡ fd
d	„|D ƒS )zd
        take the input data_columns and min_itemize and create a data
        columns spec
        r   rë   r,   z"cannot use a multi-index on axis [z] with data_columns TNc                   s    g | ]}|d kr|ˆ vr|‘qS r%  rU   r:  )Úexisting_data_columnsrU   rV   rl     s
    þz/Table.validate_data_columns.<locals>.<listcomp>c                   s   g | ]}|ˆ v r|‘qS rU   rU   )rh   r=  )Úaxis_labelsrU   rV   rl     r¢  )
ro   r¬  râ   r°   rm   rP   rf  rp  rt  r  )r×   r˜   r”   rB  rF  r¬  rU   )r’  r‘  rV   Úvalidate_data_columnsú  s.   ÿÿ


þÿ	zTable.validate_data_columnsr)   rŸ  c           /        s‚  t ˆtƒs| jj}td|› dtˆƒ› d�ƒ‚ˆ du rdg‰ ‡fdd„ˆ D ƒ‰ |  ¡ r=d}d	d„ | jD ƒ‰ t| j	ƒ}| j
}nd
}| j}	| jdksIJ ‚tˆ ƒ| jd krVtdƒ‚g }
|du r^d}t‡ fdd„dD ƒƒ}ˆj| }t|ƒ}|r¡t|
ƒ}| j| d }tt |¡t |¡ddd�s¡tt t|ƒ¡t t|ƒ¡ddd�r¡|}|	 |i ¡}t|jƒ|d< t|ƒj|d< |
 ||f¡ ˆ d }ˆj| }ˆ |¡}t||| j| jƒ}||_| d¡ |  |	¡ | !|¡ |g}t|ƒ}|dksòJ ‚t|
ƒdksúJ ‚|
D ]}t"ˆ|d |d ƒ‰qü|jdk}|  #|||
¡}|  $ˆ|¡ %¡ }|  &|||
| j'|¡\}}g }t(t)||ƒƒD ]×\}\}}t*}d}|�rbt|ƒdk�rb|d |v �rbt+}|d }|du �sbt |t,ƒ�sbtdƒ‚|�rŒ|�rŒz| j'| }W n t-t.f�y‹ }  ztd|› d| j'› d�ƒ| ‚d} ~ ww d}|�p•d|› �}!t/|!|j0|||| j| j|d�}"t1|!| j2ƒ}#| 3|"¡}$t4|"j5j6ƒ}%d}&t7|"ddƒdu�rÆt8|"j9ƒ}&d }' }(})t |"j5t:ƒ�râ|"j;})d}'tj|"j<d
d� =¡ }(t>|"ƒ\}*}+||#|!t|ƒ|$||%|&|)|'|(|+|*d�},|,  |	¡ | |,¡ |d7 }�q2dd„ |D ƒ}-t| ƒ| j?| j| j| j||
||-|	|d�
}.t@| d ƒ�r/| jA|._A|. B|¡ |�r?|�r?|. C| ¡ |.S )!a0  
        Create and return the axes.

        Parameters
        ----------
        axes: list or None
            The names or numbers of the axes to create.
        obj : DataFrame
            The object to create axes on.
        validate: bool, default True
            Whether to validate the obj against an existing object already written.
        nan_rep :
            A value to use for string column nan_rep.
        data_columns : List[str], True, or None, default None
            Specify the columns that we want to create to allow indexing on.

            * True : Use all available columns.
            * None : Use no columns.
            * List[str] : Use the specified columns.

        min_itemsize: Dict[str, int] or None, default None
            The min itemsize for a column in bytes.
        z/cannot properly create the storer for: [group->r¶  r=  Nr   c                   r9  rU   )Ú_get_axis_numberr¡  )rÍ  rU   rV   rl   L  r<  z&Table._create_axes.<locals>.<listcomp>Tc                 S  r  rU   rk  r¡  rU   rU   rV   rl   Q  r	  Fr½  re   z<currently only support ndim-1 indexers in an AppendableTableÚnanc                 3  s   � | ]	}|ˆ vr|V  qd S r\   rU   r>  )rc  rU   rV   rj  i  s   € z%Table._create_axes.<locals>.<genexpr>ri  rP  r  rë   r³  zIncompatible appended table [z]with existing table [Úvalues_block_)Úexisting_colr”   rœ   rX   rš   rª   rð  rO  r   )ra   rò  ry  ró  rô  rˆ  rð  r  rÅ   rõ  r  r¤  c                 S  rŸ  rU   )rî  ra   )rh   r+  rU   rU   rV   rl   ÷  r¢  )
rÊ   rÃ   rX   rš   rE  rB  rH  r˜   r¬  rœ   r  )DrP   r)   rÃ   rÈ   r·   rë   r-  rE  rm   r˜   rœ   r¬  rr  ro   r°   ro  rc  rB  r(   rQ   Úarrayrv  rC  r  rì   r�   Ú_get_axis_namer  rX   rš   rF  rö  rJ  r2  Ú_reindex_axisr“  r�  rH  Ú_get_blocks_and_itemsrH  r  rN  r\  r²  r[   Ú
IndexErrorrê   Ú_maybe_convert_for_string_atomry  r{  r¾  rv  rg  r  ra   rŽ  r  rð  r$   r  rž  r¥  rf  rÊ   r  r  rz  rŸ  )/r×   rc  rÍ  rŸ  rœ   r˜   r”   rÃ   Útable_existsÚnew_infoÚnew_non_index_axesrG  r†   Úappend_axisÚindexerÚ
exist_axisr¬  Ú	axis_nameÚ	new_indexÚnew_index_axesÚjrô  r´  rA  r9  Úvaxesr  rC  Úb_itemsr|  ra   r—  ra  Únew_nameÚdata_convertedr}  ró  rˆ  rð  rÅ   rõ  r  r¤  rh  r+  ÚdcsÚ	new_tablerU   )rc  rÍ  rV   Ú_create_axes   s0  
 ÿÿ
ÿ
üü





ÿÿ"ÿÿý€ÿø


ô

ö

zTable._create_axesr´  rž  c                 C  s~  t | jtƒr|  d¡} dd„ }| j}tt|ƒ}t|jƒ}||ƒ}t|ƒri|d \}	}
t	|
ƒ 
t	|ƒ¡}| j||	d�j}tt|ƒ}t|jƒ}||ƒ}|D ]}| j|g|	d�j}tt|ƒ}| |j¡ | ||ƒ¡ qK|r»dd„ t||ƒD ƒ}g }g }|D ];}t|jƒ}z| |¡\}}| |¡ | |¡ W q{ ttfy¶ } zd d	d
„ |D ƒ¡}td|› d�ƒ|‚d }~ww |}|}||fS )Nr0  c                   s   ‡ fdd„ˆ j D ƒS )Nc                   s   g | ]	}ˆ j  |j¡‘qS rU   )r  rx  rB  )rh   rC  ©ÚmgrrU   rV   rl     r@  zFTable._get_blocks_and_items.<locals>.get_blk_items.<locals>.<listcomp>)rA  r¯  rU   r¯  rV   Úget_blk_items  s   z2Table._get_blocks_and_items.<locals>.get_blk_itemsr   rk  c                 S  s"   i | ]\}}t | ¡ ƒ||f“qS rU   )rn   Útolist)rh   Úbr©  rU   rU   rV   rn  =  s    ÿÿz/Table._get_blocks_and_items.<locals>.<dictcomp>rÿ  c                 S  rÅ  rU   rÆ  )rh   ÚitemrU   rU   rV   rl   J  rÇ  z/Table._get_blocks_and_items.<locals>.<listcomp>z+cannot match existing table structure for [z] on appending data)rP   r<  r:   r=  r   r;   rm   rA  ro   r+   ru  r|  rt  rN  rn   ry  rQ  r�   rœ  rê   r  r°   )r´  rž  r   rH  r˜   r±  r°  rA  r9  rF  r’  Ú
new_labelsr=  Úby_itemsÚ
new_blocksÚnew_blk_itemsÚear  r³  r©  ra  ÚjitemsrU   rU   rV   r›    sV   





þ


ÿý€þzTable._get_blocks_and_itemsr‹  rŠ  c                   sª   |durt |ƒ}|dur'ˆjr'tˆjt ƒsJ ‚ˆjD ]}||vr&| d|¡ qˆjD ]\}}tˆ |||ƒ‰ ‡ ‡fdd„}q*|jdurS|j ¡ D ]\}}	}
|||
|	ƒ‰ qGˆ S )zprocess axes filtersNr   c                   sÈ   ˆ j D ]X}ˆ  |¡}ˆ  |¡}|d usJ ‚| |kr3ˆjr$| tˆjƒ¡}|||ƒ}ˆ j|d�|   S | |v r[tt	ˆ | ƒj
ƒ}t|ƒ}tˆ tƒrLd| }|||ƒ}ˆ j|d�|   S qtd| › d�ƒ‚)Nrk  re   zcannot find the field [z] for filtering!)Ú_AXIS_ORDERSr”  Ú	_get_axisrY  Úunionr+   r  r{  r9   rŽ  ry  rP   r)   r°   )ÚfieldÚfiltÚopr¤  Úaxis_numberÚaxis_valuesÚtakersry  ©rÍ  r×   rU   rV   Úprocess_filtere  s$   





öz*Table.process_axes.<locals>.process_filter)	rm   rY  rP   r  ÚinsertrB  rš  Úfilterr’   )r×   rÍ  r‹  rª   r  rF  ÚlabelsrÅ  r¾  rÀ  r¿  rU   rÄ  rV   Úprocess_axesT  s   
€
 zTable.process_axesr�   rÍ   rd  c                 C  s„   |du r
t | jdƒ}d|dœ}dd„ | jD ƒ|d< |r6|du r$| jp#d}tƒ j|||p-| jd	�}||d
< |S | jdur@| j|d
< |S )z:create the description of the table from the axes & valuesNi'  rv   )ra   rd  c                 S  s   i | ]}|j |j“qS rU   )rò  ró  r¡  rU   rU   rV   rn  š  r<  z,Table.create_description.<locals>.<dictcomp>r*  é	   )r�   r�   rÍ   rÎ   )Úmaxr`  rc  rÒ   r…   r  rÔ   rÕ   )r×   r�   r�   rÍ   rd  re  rÎ   rU   rU   rV   Úcreate_description‹  s"   	

ý
ý
zTable.create_descriptionc           
      C  s�   |   |¡ |  ¡ sdS t| |||d�}| ¡ }|jdurD|j ¡ D ]"\}}}| j|| ¡ | ¡ d d�}	|||	j	|| ¡   |ƒj
 }q!t|ƒS )zf
        select coordinates (row numbers) from a table; return the
        coordinates object
        Fr1  Nre   rü  )r×  r-  rŠ  Úselect_coordsrÇ  r’   r7  ré  rË  Úilocry  r+   )
r×   rp   r¨   r©   r‹  Úcoordsr¾  rÀ  r¿  r¤  rU   rU   rV   r3  ª  s   

ÿ zTable.read_coordinatesr6  c                 C  s¸   |   ¡  |  ¡ s
dS |durtdƒ‚| jD ]>}||jkrS|js'td|› d�ƒ‚t| jj	|ƒ}| 
| j¡ |j|||… | j| j| jd�}tt|d |jƒ|dd�  S qtd|› d	�ƒ‚)
zj
        return a single column from the table, generally only indexables
        are interesting
        FNz4read_column does not currently accept a where clausezcolumn [z=] can not be extracted individually; it is not data indexabler¢  re   )ra   r¥  z] not found in the table)r×  r-  r·   rc  ra   rî  r°   rŽ  rv   ri  rM  r¬  r$  rœ   rX   rš   r/   r  rð  rê   )r×   r6  rp   r¨   r©   r†   r=  Ú
col_valuesrU   rU   rV   r7  Ä  s,   


ÿ
üðzTable.read_column)Nr~   NNNNNN)rÊ   r¤   rÃ   rE   rX   rY   rš   r[   rE  rF  rB  rG  rH  rI  r˜   rJ  r¬  rK  rZ   r›   rÚ  )r=  r[   rÝ  rÞ  )rÍ  r‹   rZ   rZ  rÜ  )rZ   rc  )rZ   rf  )rZ   rh  )rZ   r  )r‰   r[   rZ   r[   )r‰   r[   ry  r  rZ   r›   rÛ  r\   rà  )rˆ  rY   rZ   r›   râ  )r¨   rŽ   r©   rŽ   rZ   r‰  ©rô  r‘   )TNNN)rÍ  r)   rŸ  r‘   )r´  r)   rž  r‘   )r‹  rŠ  rZ   r)   )r�   rŽ   rÍ   r‘   rd  rŽ   rZ   rh  rÝ  )r6  r[   r¨   rŽ   r©   rŽ   )4rì   rã  rä  rå  r¸  r¹  ræ  r  rO  rØ   rç  rM  r÷   rä   rŸ  rY  r^  r`  rÏ  rÔ  rv   r  r*  rc  rP  re  rg  ro  rr  rs  rt  r:  rS  rÐ  rÒ  r×  rz  r   rx  r‰  r�  r°  r�  r“  r®  Ústaticmethodr›  rÉ  rÌ  r3  r7  r±  rU   rU   r_  rV   r  	  s    
 õ


!





	







LÿWÿ"*ù qC
7 ÿûr  c                   @  s2   e Zd ZdZdZ				dddd„Zddd„ZdS )rÆ  zË
    a write-once read-many table: this format DOES NOT ALLOW appending to a
    table. writing is a one-time operation the data are stored in a format
    that allows for searching the data on disk
    r½  Nr¨   rŽ   r©   c                 C  rØ  )z[
        read the indices and the indexing array, calculate offset rows and return
        z!WORMTable needs to implement readrÙ  rÚ  rU   rU   rV   r#  ù  s   
zWORMTable.readrZ   r›   c                 K  rØ  )zÞ
        write in a format that we can search later on (but cannot append
        to): write out the indices and the values using _write_array
        (e.g. a CArray) create an indexing table so that we can search
        z"WORMTable needs to implement writerÙ  rÛ  rU   rU   rV   rÑ    s   zWORMTable.writerÜ  rÝ  rÝ  )rì   rã  rä  rå  r°  r#  rÑ  rU   rU   rU   rV   rÆ  ð  s    ûrÆ  c                   @  sZ   e Zd ZdZdZ												dd dd„Zd!d"dd„Zd#dd„Zd$d%dd„ZdS )&r6  ú(support the new appendable table formatsÚ
appendableNFTr�   r‘   r­   rŽ   r–   rU  rZ   r›   c                 C  s¶   |s| j r| j | jd¡ | j||||||d�}|jD ]}| ¡  q|j sA|j||||	d�}| ¡  ||d< |jj	|jfi |¤Ž |j
|j_
|jD ]}| ||¡ qI|j||
d� d S )Nrv   )rc  rÍ  rŸ  r”   rœ   r˜   )r�   r�   rÍ   rd  rU  )r–   )rÏ  rË   rÒ  rÃ   r®  rc  r4  rÌ  rÐ  Úcreate_tabler¬  r'  r<  Ú
write_data)r×   rÍ  rc  r�   r�   r�   rÍ   r”   r­   rd  r–   rœ   r˜   rU  rv   r†   ÚoptionsrU   rU   rV   rÑ    s4   
ú
	
ü

zAppendableTable.writec                   sÀ  | j j}| j}g }|r*| jD ]}t|jƒjdd�}t|tj	ƒr)| 
|jddd�¡ qt|ƒrD|d }|dd… D ]}||@ }q8| ¡ }nd}dd	„ | jD ƒ}	t|	ƒ}
|
dksZJ |
ƒ‚d
d	„ | jD ƒ}dd	„ |D ƒ}g }t|ƒD ]\}}|f| j ||
|   j }| 
| |¡¡ qo|du r�d}tjt||ƒ| j d�}|| d }t|ƒD ]9}|| ‰t|d | |ƒ‰ ˆˆ krº dS | j|‡ ‡fdd	„|	D ƒ|durÐ|ˆˆ … nd‡ ‡fdd	„|D ƒd� q¤dS )z`
        we form the data into a 2-d including indexes,values,mask write chunk-by-chunk
        r   rk  Úu1Fr   re   Nc                 S  r  rU   )r.  r¡  rU   rU   rV   rl   j  r	  z.AppendableTable.write_data.<locals>.<listcomp>c                 S  ó   g | ]}|  ¡ ‘qS rU   )r&  r¡  rU   rU   rV   rl   p  rÇ  c              	   S  s,   g | ]}|  t t |j¡|jd  ¡¡‘qS r  )Ú	transposerQ   ÚrollÚarangerr  rš  rU   rU   rV   rl   q  s   , rè  r–  c                   ó   g | ]}|ˆˆ … ‘qS rU   rU   r¡  ©Úend_iÚstart_irU   rV   rl   …  r¢  c                   rÝ  rU   rU   rš  rÞ  rU   rV   rl   ‡  r¢  )Úindexesr®  ry  )r  r  r`  rH  r2   r¤  rg  rP   rQ   r  r�   r¨  ro   r¥  rE  r  re  ÚreshaperÌ  ré  rq  Úwrite_data_chunk)r×   r­   r–   r  r+  Úmasksr†   r®  rl  rá  Únindexesry  Úbvaluesr  rm  Ú	new_shapeÚrowsÚchunksrU   rÞ  rV   rÖ  O  sP   
€

üúzAppendableTable.write_datarè  r  rá  úlist[np.ndarray]r®  únpt.NDArray[np.bool_] | Nonery  c                 C  sè   |D ]}t  |j¡s dS q|d jd }|t|ƒkr#t j|| jd�}| jj}t|ƒ}t|ƒD ]
\}	}
|
|||	 < q/t|ƒD ]\}	}||||	|  < q>|dura| ¡ j	t
dd� }| ¡ sa|| }t|ƒrr| j |¡ | j ¡  dS dS )zê
        Parameters
        ----------
        rows : an empty memory space where we are putting the chunk
        indexes : an array of the indexes
        mask : an array of the masks
        values : an array of the values
        Nr   r–  Fr   )rQ   r  re  ro   rÌ  r  r  r  r¥  r¨  r‘   rg  rv   r�   r  )r×   rè  rá  r®  ry  rm  r+  r  rå  r  rG  rl  rU   rU   rV   rã  Š  s*   ÿþz AppendableTable.write_data_chunkr¨   r©   c                 C  sb  |d u st |ƒs4|d u r|d u r| j}| jj| jdd� |S |d u r%| j}| jj||d�}| j ¡  |S |  ¡ s:d S | j}t	| |||d�}| 
¡ }t|dd� ¡ }t |ƒ}	|	r¯| ¡ }
t|
|
dk jƒ}t |ƒskdg}|d |	krv| |	¡ |d dkr‚| dd¡ | ¡ }t|ƒD ]}| t||ƒ¡}|j||jd  ||jd  d d� |}qŠ| j ¡  |	S )	NTrY  rü  Fr   re   r   r�  )ro   r+  rË   rÒ  rÃ   rv   Úremove_rowsr  r-  rŠ  rÍ  r/   Úsort_valuesÚdiffrm   r“   r�   rÆ  rQ  Úreversedrx  rq  )r×   rp   r¨   r©   r+  rv   r‹  ry  Úsorted_seriesÚlnrî  r¹   Úpgr  rè  rU   rU   rV   r`  ¶  sF   ü

ÿ
zAppendableTable.delete)NFNNNNNNFNNT)
r�   r‘   r­   rŽ   r–   r‘   rU  r‘   rZ   r›   rß  )r­   rŽ   r–   r‘   rZ   r›   )
rè  r  rá  rê  r®  rë  ry  rê  rZ   r›   rà  rÝ  )	rì   rã  rä  rå  r°  rÑ  rÖ  rã  r`  rU   rU   rU   rV   r6    s&    ò;
;,r6  c                   @  sZ   e Zd ZU dZdZdZdZeZde	d< e
dd	d
„ƒZeddd„ƒZ				dddd„ZdS )rÄ  rÓ  r±  r»  r½  rº  r»  rZ   r‘   c                 C  s   | j d jdkS )Nr   re   )rE  rF  rÛ   rU   rU   rV   re  ù  rN  z"AppendableFrameTable.is_transposedrô  c                 C  s   |r|j }|S )zthese are written transposed)r÷  r�  rU   rU   rV   r�  ý  s   zAppendableFrameTable.get_objectNr¨   rŽ   r©   c                   sR  ˆ   |¡ ˆ  ¡ sd S ˆ j|||d�}tˆ jƒr$ˆ j ˆ jd d i ¡ni }‡ fdd„tˆ jƒD ƒ}t|ƒdks:J ‚|d }|| d }	g }
tˆ jƒD ]¹\}}|ˆ j	vrUqK|| \}}| d¡dkrgt
|ƒ}nt |¡}| d¡}|d ur||j|d	d
� ˆ jrŽ|}|}t
|	t|	dd ƒd�}n|j}t
|	t|	dd ƒd�}|}|jdkr²t|tjƒr²| d|jd f¡}t|tjƒrÂt|j||dd�}nt|t
ƒrÏt|||d�}n	tj|g||d�}tƒ rá|jjdksñ|j|jk ¡ sñJ |j|jfƒ‚tƒ rÿt|d	d�rÿ| d¡}|
  |¡ qKt|
ƒdk�r|
d }nt!|
dd�}t"ˆ |||d�}ˆ j#|||d�}|S )Nr1  r   c                   s"   g | ]\}}|ˆ j d  u r|‘qS rA  rq  )rh   r  r7  rÛ   rU   rV   rl     s   " z-AppendableFrameTable.read.<locals>.<listcomp>re   rë   r,   r  T©Úinplacera   r`   Fr3  r4  r¡  r  r+  rk  )r‹  rª   )$r×  r-  r�  ro   rB  r¬  râ   r  rc  rH  r+   r,   Úfrom_tuplesÚ	set_namesre  rŽ  r÷  rr  rP   rQ   r  râ  re  r)   Ú_from_arraysr   r  rˆ  Údtypesrg  r   r¨  r�   r1   rŠ  rÉ  )r×   rp   rª   r¨   r©   rí  r¬  ÚindsÚindr“   Úframesr  r†   Ú
index_valsr.  ri  r  ry  Úindex_Úcols_r:  r‹  rU   rÛ   rV   r#    sf   
ÿý




 þ

zAppendableFrameTable.readrÞ  rÑ  rÜ  rÝ  )rì   rã  rä  rå  r¸  r°  rr  r)   r»  ræ  rç  re  r°  r�  r#  rU   rU   rU   rV   rÄ  ñ  s   
 ûrÄ  c                      sf   e Zd ZdZdZdZdZeZe	ddd„ƒZ
edd
d„ƒZd‡ fdd„	Z				dd‡ fdd„Z‡  ZS )rÂ  rÓ  r¸  r¹  r½  rZ   r‘   c                 C  rX  rY  rU   rÛ   rU   rU   rV   re  b  rZ  z#AppendableSeriesTable.is_transposedrô  c                 C  rŽ  r\   rU   r�  rU   rU   rV   r�  f  rZ  z AppendableSeriesTable.get_objectNc                   s<   t |tƒs|jp	d}| |¡}tƒ jd||j ¡ dœ|¤ŽS )ú+we are going to write this as a frame tablery  ©rÍ  r˜   NrU   )rP   r)   ra   Úto_framer^  rÑ  rª   r²  )r×   rÍ  r˜   r¿   ra   r_  rU   rV   rÑ  j  s   


zAppendableSeriesTable.writer¨   rŽ   r©   r/   c                   s�   | j }|d ur!|r!t| jtƒsJ ‚| jD ]}||vr | d|¡ qtƒ j||||d�}|r5|j| jdd� |jd d …df }|j	dkrFd |_	|S )Nr   rE  Tró  ry  )
rY  rP   r  rm   rÆ  r^  r#  Ú	set_indexrÎ  ra   )r×   rp   rª   r¨   r©   rY  r  rT   r_  rU   rV   r#  q  s   
€
zAppendableSeriesTable.readrÞ  rÑ  r\   rÜ  r,  )rì   rã  rä  rå  r¸  r°  rr  r/   r»  rç  re  r°  r�  rÑ  r#  r±  rU   rU   r_  rV   rÂ  Z  s     	ûrÂ  c                      s(   e Zd ZdZdZdZ‡ fdd„Z‡  ZS )rÃ  rÓ  r¸  rº  c                   s^   |j pd}|  |¡\}| _t| jtƒsJ ‚t| jƒ}| |¡ t|ƒ|_tƒ j	dd|i|¤ŽS )rÿ  ry  rÍ  NrU   )
ra   r^  r  rP   rm   r�   r+   rª   r^  rÑ  )r×   rÍ  r¿   ra   Únewobjri  r_  rU   rV   rÑ  �  s   



z AppendableMultiSeriesTable.write)rì   rã  rä  rå  r¸  r°  rÑ  r±  rU   rU   r_  rV   rÃ  Š  s
    rÃ  c                   @  sb   e Zd ZU dZdZdZdZeZde	d< e
dd	d
„ƒZe
dd„ ƒZddd„Zedd„ ƒZdd„ ZdS )rÁ  z:a table that read/writes the generic pytables table formatr±  r²  r½  zlist[Hashable]r  rZ   r[   c                 C  rÙ   r\   )r¸  rÛ   rU   rU   rV   r‹  ¤  rà   zGenericTable.pandas_typec                 C  s   t | jdd ƒp	| jS ra  rb  rÛ   rU   rU   rV   rÔ  ¨  ry  zGenericTable.storabler›   c                 C  sL   g | _ d| _g | _dd„ | jD ƒ| _dd„ | jD ƒ| _dd„ | jD ƒ| _dS )rò  Nc                 S  ru  rU   rv  r¡  rU   rU   rV   rl   ²  r<  z*GenericTable.get_attrs.<locals>.<listcomp>c                 S  rw  rU   rv  r¡  rU   rU   rV   rl   ³  r<  c                 S  r  rU   r`   r¡  rU   rU   rV   rl   ´  r	  )rB  rœ   r  rx  rE  rH  r˜   rÛ   rU   rU   rV   rÒ  ¬  s   zGenericTable.get_attrsc           
   
   C  s¨   | j }|  d¡}|durdnd}tdd| j||d�}|g}t|jƒD ]/\}}t|tƒs-J ‚t||ƒ}|  |¡}|dur=dnd}t	|||g|| j||d�}	| 
|	¡ q"|S )z0create the indexables from the table descriptionr“   NrO  r   )ra   rF  rv   rÅ   rõ  )ra   rô  ry  ró  rv   rÅ   rõ  )r*  rS  rW  rv   r  Ú_v_namesrP   r[   rŽ  r¶  r�   )
r×   re  r~  rÅ   rƒ  r‚  r  r  ru  rƒ  rU   rU   rV   rx  ¶  s.   
ÿ

ù	zGenericTable.indexablesc                 K  rØ  )Nz cannot write on an generic tablerÙ  rÛ  rU   rU   rV   rÑ  Ù  s   zGenericTable.writeNrÚ  rÝ  )rì   rã  rä  rå  r¸  r°  rr  r)   r»  ræ  rç  r‹  rÔ  rÒ  r   rx  rÑ  rU   rU   rU   rV   rÁ  ›  s   
 



"rÁ  c                      s^   e Zd ZdZdZeZdZe 	d¡Z
eddd„ƒZd‡ fd
d„	Z								dd‡ fdd„Z‡  ZS )rÅ  za frame with a multi-indexr¼  r½  z^level_\d+$rZ   r[   c                 C  rX  )NÚappendable_multirU   rÛ   rU   rU   rV   rM  å  rZ  z*AppendableMultiFrameTable.table_type_shortNc                   sx   |d u rg }n	|du r|j  ¡ }|  |¡\}| _t| jtƒs J ‚| jD ]}||vr/| d|¡ q#tƒ jd||dœ|¤ŽS )NTr   r   rU   )	rª   r²  r^  r  rP   rm   rÆ  r^  rÑ  )r×   rÍ  r˜   r¿   r  r_  rU   rV   rÑ  é  s   

€zAppendableMultiFrameTable.writer¨   rŽ   r©   c                   sD   t ƒ j||||d�}| ˆ j¡}|j ‡ fdd„|jjD ƒ¡|_|S )NrE  c                   s    g | ]}ˆ j  |¡rd n|‘qS r\   )Ú
_re_levelsÚsearch)rh   ra   rÛ   rU   rV   rl     s     z2AppendableMultiFrameTable.read.<locals>.<listcomp>)r^  r#  r  r  r“   rö  r  )r×   rp   rª   r¨   r©   r:  r_  rÛ   rV   r#  õ  s   ÿzAppendableMultiFrameTable.readrÚ  r\   rÜ  rÝ  )rì   rã  rä  rå  r°  r)   r»  rr  ÚreÚcompiler  rç  rM  rÑ  r#  r±  rU   rU   r_  rV   rÅ  Ý  s    
ûrÅ  rÍ  r)   rF  rH   rÈ  r+   c                 C  s¢   |   |¡}t|ƒ}|d urt|ƒ}|d u s| |¡r!| |¡r!| S t| ¡ ƒ}|d ur6t| ¡ ƒj|dd�}| |¡sOtd d ƒg| j }|||< | jt|ƒ } | S )NF)Úsort)	r¼  r9   ÚequalsÚuniquerz  Úslicerr  r{  rn   )rÍ  rF  rÈ  r  r7  ÚslicerrU   rU   rV   rš    s   

rš  rð  r   ústr | tzinfoc                 C  s   t  | ¡}|S )z+for a tz-aware type, return an encoded zone)r   Úget_timezone)rð  ÚzonerU   rU   rV   r  !  s   
r  ry  únp.ndarray | Indexr“  r*   c                 C  r3  r\   rU   ©ry  rð  r“  rU   rU   rV   r  '  s   r  r  c                 C  r3  r\   rU   r  rU   rU   rV   r  .  rZ  ústr | tzinfo | Noneúnp.ndarray | DatetimeIndexc                 C  sŒ   t | tƒr| jdu s| j|ksJ ‚|dur;t | tƒr!| j}| j} nd}|  ¡ } t|ƒ}t| |d�} |  d¡ |¡} | S |rDt	j
| dd�} | S )a  
    coerce the values to a DatetimeIndex if tz is set
    preserve the input shape if possible

    Parameters
    ----------
    values : ndarray or Index
    tz : str or tzinfo
    coerce : if we do not have a passed timezone, coerce to M8[ns] ndarray
    Nr`   rè  úM8[ns]r–  )rP   r*   rð  ra   r&  r¥  rW   rê  rë  rQ   r£  )ry  rð  r“  ra   rU   rU   rV   r  3  s   

ûra   c              
   C  st  t | tƒsJ ‚|j}t|ƒ\}}t|ƒ}t |¡}t |j	d¡s*t
|j	ƒs*t|j	ƒr=t| |||t|dd ƒt|dd ƒ|d�S t |tƒrFtdƒ‚tj|dd�}	t |¡}
|	dkrotjd	d
„ |
D ƒtjd�}t| |dtƒ  ¡ |d�S |	dkrŠt|
||ƒ}|j	j}t| |dtƒ  |¡|d�S |	dv r—t| ||||d�S t |tjƒr¢|j	tks¤J ‚|dks¬J |ƒ‚tƒ  ¡ }t| ||||d�S )NÚiurï  rð  )ry  rˆ  ró  rï  rð  rñ  zMultiIndex not supported here!Fr  r   c                 S  rÙ  rU   )Ú	toordinalrš  rU   rU   rV   rl     rÇ  z"_convert_index.<locals>.<listcomp>r–  )rñ  r0  )ÚintegerÚfloating)ry  rˆ  ró  rñ  r¤  )rP   r[   ra   rf  rg  r²  rv  r   r  r  r#   r   rì  rŽ  r,   r·   r"  rQ   r£  Úint32r…   Ú	Time32ColÚ_convert_string_arrayrø  r1  r  r¤  r$  )ra   r“   rX   rš   rñ  r­  rh  rˆ  ru  r)  ry  rø  rU   rU   rV   r  Y  s^   
ÿþý

ù


ÿ
û
ÿ
r  rˆ  c                 C  sÖ   |dkr
t | ƒ}|S |dkrt| ƒ}|S |dkr>ztjdd„ | D ƒtd�}W |S  ty=   tjdd„ | D ƒtd�}Y |S w |dv rIt | ¡}|S |d	v rWt| d ||d
�}|S |dkrdt | d ¡}|S td|› �ƒ‚)Nr‘  r”  r   c                 S  r—  rU   r˜  rš  rU   rU   rV   rl   ¢  r<  z$_unconvert_index.<locals>.<listcomp>r–  c                 S  r—  rU   r›  rš  rU   rU   rV   rl   ¤  r<  )r  Úfloatr‘   r0  r¢  r¤  r   zunrecognized index type )r*   r0   rQ   r£  r¤  r°   r¬  )r¤  rˆ  rX   rš   r“   rU   rU   rV   r  ™  s4   ïñôô
	øÿüÿr  ræ  rG   r  c                 C  s„  |j tkr|S ttj|ƒ}|j j}tj|dd�}	|	dkr tdƒ‚|	dkr(tdƒ‚|	dks2|dks2|S t	|ƒ}
| 
¡ }|||
< tj|dd�}	|	dkr|t|jd	 ƒD ]+}|| }tj|dd�}	|	dkr{t|ƒ|krk|| nd
|› �}td|› d|	› d�ƒ‚qPt|||ƒ |j¡}|j}t|tƒrœt| | ¡pš| d¡pšd	ƒ}t|p d	|ƒ}|d ur¶| |¡}|d ur¶||kr¶|}|jd|› �dd�}|S )NFr  r   z+[date] is not implemented as a table columnrß  z>too many timezones in this block, create separate data columnsr0  r¤  r   zNo.zCannot serialize the column [z2]
because its data contents are not [string] but [z] object dtypery  z|Sr   )r  r¤  r   rQ   r  ra   r   r"  r·   r2   r¥  rq  re  ro   r  râ  rø  rP   rf  rd   râ   rË  r7  r¨  )ra   ræ  r—  r”   rœ   rX   rš   rª   rh  r)  r®  r¤  r  r+  Úerror_column_labelr«  rø  ÚecirU   rU   rV   r�  ²  sP   

ÿþÿþ


r�  r¤  c                 C  s`   t | ƒrt|  ¡ dd�j ||¡j | j¡} t|  ¡ ƒ}t	dt
 |¡ƒ}tj| d|› �d�} | S )a  
    Take a string-like that is object dtype and coerce to a fixed size string type.

    Parameters
    ----------
    data : np.ndarray[object]
    encoding : str
    errors : str
        Handler for encoding errors.

    Returns
    -------
    np.ndarray[fixed-length-string]
    Fr   re   ÚSr–  )ro   r/   r¥  r[   Úencoderª  râ  re  r   rË  Ú
libwritersÚmax_len_string_arrayrQ   r£  )r¤  rX   rš   Úensuredrø  rU   rU   rV   r  û  s   

ýr  c                 C  sœ   | j }tj|  ¡ td�} t| ƒr=t t| ƒ¡}d|› �}t	| d t
ƒr1t| dd�jj||d�j} n| j|dd�jtdd�} |du rCd}t | |¡ |  |¡S )	a*  
    Inverse of _convert_string_array.

    Parameters
    ----------
    data : np.ndarray[fixed-length-string]
    nan_rep : the storage repr of NaN
    encoding : str
    errors : str
        Handler for encoding errors.

    Returns
    -------
    np.ndarray[object]
        Decoded data.
    r–  ÚUr   Fr   )rš   Nr•  )re  rQ   r£  r¥  r¤  ro   r#  r$  r   rP   rï  r/   r[   rS   rª  r¨  Ú!string_array_replace_from_nan_reprâ  )r¤  rœ   rX   rš   re  rø  r  rU   rU   rV   r¬    s   

r¬  r   c                 C  s6   t |tƒsJ t|ƒƒ‚t|ƒrt|||ƒ}|| ƒ} | S r\   )rP   r[   rë   Ú_need_convertÚ_get_converter)ry  r   rX   rš   ÚconvrU   rU   rV   r  @  s
   r  c                   s4   | dkrdd„ S | dkr‡ ‡fdd„S t d| › �ƒ‚)Nr‘  c                 S  s   t j| dd�S )Nr  r–  )rQ   r£  ©r?  rU   rU   rV   r    J  s    z _get_converter.<locals>.<lambda>r0  c                   s   t | d ˆ ˆd�S )Nr¢  )r¬  r+  r·  rU   rV   r    L  s    ÿzinvalid kind )r°   )rˆ  rX   rš   rU   r·  rV   r)  H  s
   r)  c                 C  s   | dv rdS dS )N)r‘  r0  TFrU   rk  rU   rU   rV   r(  S  s   r(  r¾  úSequence[int]c                 C  sl   t |tƒst|ƒdk rtdƒ‚|d dkr4|d dkr4|d dkr4t d| ¡}|r4| ¡ d }d|› �} | S )	zö
    Prior to 0.10.1, we named values blocks like: values_block_0 an the
    name values_0, adjust the given name if necessary.

    Parameters
    ----------
    name : str
    version : Tuple[int, int, int]

    Returns
    -------
    str
    é   z6Version is incorrect, expected sequence of 3 integers.r   re   r¼  r½  zvalues_block_(\d+)Úvalues_)rP   r[   ro   r°   r  r  r¹   )ra   r¾  rl  ÚgrprU   rU   rV   r{  Y  s   $
r{  Ú	dtype_strc                 C  sÊ   t | ƒ} |  d¡rd}|S |  d¡rd}|S |  d¡rd}|S |  d¡r(d}|S |  d¡r1d}|S |  d¡r:d	}|S |  d
¡rCd
}|S |  d¡rLd}|S |  d¡rUd}|S | dkr]d}|S td| › d�ƒ‚)zA
    Find the "kind" string describing the given dtype name.
    )r0  rï  r0  r  r„  )rd   r{  r  r‘  Ú	timedeltar”  r‘   rO  r~  r¤  zcannot interpret dtype of [r=  )rW   r™  r°   )r0  rˆ  rU   rU   rV   rg  r  s@   

ê
ì
î
ð
ò
ô
ö	
øûþrg  c                 C  sb   t | tƒr| j} | jj d¡d }| jjdv r t |  	d¡¡} nt | t
ƒr(| j} t | ¡} | |fS )zJ
    Convert the passed data into a storable form and a dtype string.
    rÈ  r   ÚmMr  )rP   r3   ro  r  ra   rÔ  rˆ  rQ   r£  r%  r-   r&  )r¤  rh  rU   rU   rV   rf  “  s   


rf  c                   @  s:   e Zd ZdZ			ddd
d„Zdd„ Zdd„ Zdd„ ZdS )rŠ  zæ
    Carries out a selection operation on a tables.Table object.

    Parameters
    ----------
    table : a Table object
    where : list of Terms (or convertible to)
    start, stop: indices to start and/or stop selection

    Nrv   r  r¨   rŽ   r©   rZ   r›   c                 C  sV  || _ || _|| _|| _d | _d | _d | _d | _t|ƒrŒt	t
ƒ�d tj|dd�}|dv r}t |¡}|jtjkrV| j| j}}|d u rDd}|d u rL| j j}t ||¡| | _n't|jjtjƒr}| jd urj|| jk  ¡ sv| jd urz|| jk ¡ rzt
dƒ‚|| _W d   ƒ n1 s‡w   Y  | jd u r§|  |¡| _| jd ur©| j ¡ \| _| _d S d S d S )NFr  )r  Úbooleanr   z3where must have index locations >= start and < stop)rv   rp   r¨   r©   Ú	conditionrÇ  ÚtermsrK  r!   r   r°   r   r"  rQ   r£  r  Úbool_r+  rÜ  Ú
issubclassrë   r  r§  ÚgenerateÚevaluate)r×   rv   rp   r¨   r©   ÚinferredrU   rU   rV   rØ   µ  sF   

ÿ€î

ûzSelection.__init__c              
   C  sr   |du rdS | j  ¡ }z
t||| j jd�W S  ty8 } zd | ¡ ¡}td|› d|› d�ƒ}t|ƒ|‚d}~ww )z'where can be a : dict,list,tuple,stringN)ro  rX   rÿ  z-                The passed where expression: a*  
                            contains an invalid variable reference
                            all of the variable references must be a reference to
                            an axis (e.g. 'index' or 'columns'), or a data_column
                            The currently defined references are: z
                )	rv   ro  r6   rX   Ú	NameErrorr  r  r   r°   )r×   rp   ry  ra  Úqkeysr  rU   rU   rV   r8  â  s"   
ÿûÿ
	€ózSelection.generatec                 C  sX   | j dur| jjj| j  ¡ | j| jd�S | jdur!| jj | j¡S | jjj| j| jd�S )ú(
        generate the selection
        Nrü  )	r4  rv   Ú
read_wherer’   r¨   r©   rK  r3  r#  rÛ   rU   rU   rV   r¼   ù  s   
ÿ
zSelection.selectc                 C  s”   | j | j}}| jj}|du rd}n|dk r||7 }|du r!|}n|dk r)||7 }| jdur<| jjj| j ¡ ||dd�S | jdurD| jS t 	||¡S )r=  Nr   T)r¨   r©   r
  )
r¨   r©   rv   r+  r4  Úget_where_listr’   rK  rQ   rÜ  )r×   r¨   r©   r+  rU   rU   rV   rÍ    s"   
ÿ
zSelection.select_coordsrà  )rv   r  r¨   rŽ   r©   rŽ   rZ   r›   )rì   rã  rä  rå  rØ   r8  r¼   rÍ  rU   rU   rU   rV   rŠ  ©  s    û-rŠ  )rX   rY   rZ   r[   )rc   rd   )r†   NNFNTNNNNr~   rO   )r‡   rˆ   r‰   r[   rŠ   r‹   rŒ   r[   r�   rŽ   r�   rY   r�   r‘   r’   rY   r“   r‘   r”   r•   r–   r—   r˜   r™   rš   r[   rX   r[   rZ   r›   )	Nr¦   r~   NNNNFN)r‡   rˆ   rŒ   r[   rš   r[   rp   r§   r¨   rŽ   r©   rŽ   rª   r«   r¬   r‘   r­   rŽ   )rÃ   rE   rÄ   rE   rZ   r‘   r\   )rÍ  r)   rF  rH   rÈ  r+   rZ   r)   )rð  r   rZ   r  rß  )ry  r  rð  r  r“  r‘   rZ   r*   )ry  r  rð  r›   r“  r‘   rZ   r  )ry  r  rð  r  r“  r‘   rZ   r  )
ra   r[   r“   r+   rX   r[   rš   r[   rZ   rì  )rˆ  r[   rX   r[   rš   r[   rZ   r  )ra   r[   ræ  rG   rª   r  )r¤  r  rX   r[   rš   r[   rZ   r  )ry  r  r   r[   rX   r[   rš   r[   )rˆ  r[   rX   r[   rš   r[   )rˆ  r[   rZ   r‘   )ra   r[   r¾  r,  rZ   r[   )r0  r[   rZ   r[   )r¤  rG   )³rå  Ú
__future__r   Ú
contextlibr   r¥  rß  r   r   rL  r´   r  Útextwrapr   Útypingr   r   r	   r
   r   r   r   rD  ÚnumpyrQ   Úpandas._configr   r   r   Úpandas._libsr   r   r#  Úpandas._libs.libr   Úpandas._libs.tslibsr   Úpandas.compat._optionalr   Úpandas.compat.pickle_compatr   Úpandas.errorsr   r   r   r   r   Úpandas.util._decoratorsr   Úpandas.util._exceptionsr   Úpandas.core.dtypes.commonr   r   r    r!   r"   r#   Úpandas.core.dtypes.dtypesr$   r%   r&   r'   Úpandas.core.dtypes.missingr(   r  r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   Úpandas.core.arraysr3   r4   r5   Úpandas.core.commonÚcoreÚcommonr^  Ú pandas.core.computation.pytablesr6   r7   Úpandas.core.constructionr8   Úpandas.core.indexes.apir9   Úpandas.core.internalsr:   r;   Úpandas.io.commonr<   Úpandas.io.formats.printingr=   r>   Úcollections.abcr?   r@   rA   ÚtypesrB   r€   rC   rD   rE   Úpandas._typingrF   rG   rH   rI   rJ   rK   rL   rM   rN   rÌ  r]   rW   r_   rb   rg   rq   rr   ræ  rs   rt   r­  rs  ry   rz   Úconfig_prefixÚregister_optionÚis_boolÚis_one_of_factoryr   r„   r…   r¥   rÂ   rº   r¤   r.  rì  rW  r\  r²  r¶  r·  rÞ  r¾  r-  r¿  r  rÆ  r6  rÄ  rÂ  rÃ  rÁ  rÅ  rš  r  r  r  r  r�  r  r¬  r  r)  r(  r{  rg  rf  rŠ  rU   rU   rU   rV   Ú<module>   s<   $	 0(


üþ
ñ:ö 
           (p  )   -  f$`       n di0B+ÿ
ÿÿ
&
@

I

&




!