a
    é´«jµÅ ã                   @  sr  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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+ ddl,m-Z-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z< ddl=m>Z>m?Z?m@Z@mAZA ddlBmCZC ddlDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZO ddlPmQZQmRZRmSZS ddlTmUZU ddlVmW  mXZY ddlZm[Z[m\Z\ ddl]m^Z_m`Z` ddlambZb ddlcmdZdmeZe ddlfmgZg ddlhmiZimjZj e�r–ddlkmlZlmmZmmnZn ddlompZp dd lqmrZrmsZsmtZt dd!lumvZvmwZwmxZxmyZymzZzm{Z{m|Z|m}Z} dd"lcm~Z~ d#Zd$Z€d%d&„ Z�d'd(d)œd*d+„Z‚d,d-„ Zƒe[Z„d.d/œd0d1„Z…d2Z†d3e‡d4< d5Zˆd3e‡d6< d7Z‰d3e‡d8< d9d9d:d:d;œZŠeEdgiZ‹d<ZŒd3e‡d=< d>Z�d3e‡d?< e Žd@¡�@ ej�dAdBeŒej�dC� ej�dDde�e ‘g dE¢¡dC� W d  ƒ n1 �sv0    Y  da’dBa“dFdG„ Z”dÂdKd(dLd(dMd'dNd'dNdOdPdQd(d(dRdSœdTdU„Z•dÃdKd(d(dWdMdMdXdNdMdYœ	dZd[„Z–d\d\dNd]œd^d_„Z—G d`da„ daƒZ˜G dbdc„ dcƒZ™G ddde„ deƒZšG dfdg„ dgešƒZ›G dhdi„ diešƒZœG djdk„ dkeœƒZ�G dldm„ dme�ƒZžG dndo„ doƒZŸG dpdq„ dqeŸƒZ G drds„ dse ƒZ¡G dtdu„ due ƒZ¢G dvdw„ dwe¢ƒZ£G dxdy„ dyeŸƒZ¤G dzd{„ 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Šdˆd‹œdŒd�„Z¬dŽd�d�œd‘d’„Z­edÅd“d�dNd”d•œd–d—„ƒZ®edÆd“dRdNd˜d•œd™d—„ƒZ®dÇd“dšdNd›d•œdœd—„Z®d(dŠd(d(ded�œdždŸ„Z¯d(d(d(d“d œd¡d¢„Z°d(d£d¤d¥œd¦d§„Z±d˜d(d(d˜d¨œd©dª„Z²d˜d(d(d˜d¨œd«d¬„Z³d˜d(d(d(d­œd®d¯„Z´d(d(d(d°œd±d²„Zµd(dNd³œd´dµ„Z¶d(d¶d(d·œd¸d¹„Z·d(d(dºœd»d¼„Z¸d£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_copy_on_writeÚusing_string_dtype)ÚlibÚwriters)Úis_string_array)Ú	timezones)ÚHAS_PYARROW)Ú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ÚStringDtypeÚTimedeltaIndexÚconcatÚisna)ÚCategoricalÚDatetimeArrayÚPeriodArray)ÚBaseStringArray)ÚPyTablesExprÚmaybe_expression)ÚarrayÚ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 unicoderT   )Ú
isinstanceÚnpÚbytes_Údecode)Ús© rZ   úQ/var/www/html/laksyashrimp/venv/lib/python3.9/site-packages/pandas/io/pytables.pyÚ_ensure_decoded’   s    
r\   ú
str | NoneÚstr)ÚencodingÚreturnc                 C  s   | d u rt } | S ©N)Ú_default_encoding©r_   rZ   rZ   r[   Ú_ensure_encoding™   s    rd   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
    )rU   r^   ©ÚnamerZ   rZ   r[   Ú_ensure_str¡   s    
rg   Úint©Úscope_levelc                   sV   |d ‰ t | ttfƒr*‡ fdd„| D ƒ} nt| ƒr>t| ˆ d�} | du sNt| ƒrR| 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 )Nrk   ri   )r;   ÚTerm)Ú.0Úterm©ÚlevelrZ   r[   Ú
<listcomp>»   s   þz _ensure_term.<locals>.<listcomp>ri   N)rU   ÚlistÚtupler;   rl   Úlen)Úwhererj   rZ   ro   r[   Ú_ensure_term°   s    	
þrv   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)Úfrz   Útr{   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.hdfZdropna_tableF)Z	validatorÚdefault_format)rz   r{   Nc                  C  sL   t d u rHdd l} | a ttƒ� | jjdkaW d   ƒ n1 s>0    Y  t S )Nr   Ústrict)Ú
_table_modÚtablesr   ÚAttributeErrorÚfileZ_FILE_OPEN_POLICYÚ!_table_file_open_policy_is_strict)rƒ   rZ   rZ   r[   Ú_tablesô   s    

ÿ r‡   ÚaTr�   zFilePath | HDFStoreúDataFrame | Seriesú
int | NoneÚboolúint | dict[str, int] | Noneúbool | Noneú Literal[True] | list[str] | NoneÚNone)Úpath_or_bufÚkeyÚvalueÚmodeÚ	complevelÚcomplibÚappendÚformatÚindexÚmin_itemsizeÚdropnaÚdata_columnsÚerrorsr_   r`   c              
     sš   |r$‡ ‡‡‡‡‡‡‡‡‡	f
dd„}n‡ ‡‡‡‡‡‡‡‡‡	f
dd„}t | ƒ} t| tƒrŽt| |||d��}||ƒ W d  ƒ q–1 s‚0    Y  n|| ƒ dS )z+store this object, close it if we opened itc                   s   | j ˆˆ	ˆˆˆˆˆˆ ˆˆd�
S )N)r—   r˜   r™   Únan_reprš   r›   rœ   r_   )r–   ©Ústore©
r›   rš   r_   rœ   r—   r˜   r‘   r™   r�   r’   rZ   r[   Ú<lambda>  s   özto_hdf.<locals>.<lambda>c                   s   | j ˆˆ	ˆˆˆˆˆ ˆˆˆd�
S )N)r—   r˜   r™   r�   r›   rœ   r_   rš   ©Úputrž   r    rZ   r[   r¡   +  s   ö)r“   r”   r•   N)rA   rU   r^   ÚHDFStore)r�   r‘   r’   r“   r”   r•   r–   r—   r˜   r™   r�   rš   r›   rœ   r_   r|   rŸ   rZ   r    r[   Úto_hdf
  s     
ÿ(r¥   Úrzstr | list | Nonezlist[str] | None)	r�   r“   rœ   ru   ÚstartÚstopÚcolumnsÚiteratorÚ	chunksizec
                 K  s–  |dvrt d|› d�ƒ‚|dur,t|dd�}t| tƒrN| jsDtdƒ‚| }d}ntt| ƒ} t| tƒshtd	ƒ‚zt	j
 | ¡}W n tt fy’   d}Y n0 |s¨td
| › d�ƒ‚t| f||dœ|
¤Ž}d}zt|du �r| ¡ }t|ƒdkrêt 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  ƒ n1 �s€0    Y  ‚ Y n0 dS )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.

    Notes
    -----
    When ``errors="surrogatepass"``, ``pd.options.future.infer_string`` is true,
    and PyArrow is installed, if a UTF-16 surrogate is encountered when decoding
    to UTF-8, the resulting dtype will be
    ``pd.StringDtype(storage="python", na_value=np.nan)``.

    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.Nrk   ri   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.)ru   r§   r¨   r©   rª   r«   Ú
auto_close)Ú
ValueErrorrv   rU   r¤   Úis_openÚOSErrorrA   r^   ÚNotImplementedErrorÚosÚpathÚexistsÚ	TypeErrorÚFileNotFoundErrorÚgroupsrt   Ú_is_metadata_ofÚ_v_pathnameÚselectÚLookupErrorr   r„   Úclose)r�   r‘   r“   rœ   ru   r§   r¨   r©   rª   r«   ÚkwargsrŸ   r­   r´   r·   Zcandidate_only_groupZgroup_to_checkrZ   rZ   r[   Úread_hdfB  sj    V
ÿ

ÿ

ÿ
ÿø

(r¾   rJ   )ÚgroupÚparent_groupr`   c                 C  sF   | j |j krdS | }|j dkrB|j}||kr:|jdkr:dS |j}qdS )zDCheck if a given group is a metadata group for a given parent_group.Frk   ÚmetaT)Z_v_depthZ	_v_parentÚ_v_name)r¿   rÀ   ÚcurrentÚparentrZ   rZ   r[   r¸   ä  s    
r¸   c                   @  s6  e Zd ZU dZded< ded< d•dd	d
ddœdd„Zddœdd„Zedd„ ƒZeddœdd„ƒZ	ddœdd„Z
dddœdd„Zdddœdd„Zddœdd „Zdd
dœd!d"„Zd#dœd$d%„Zddœd&d'„Zd(dœd)d*„Zd+d,d-dd.œd/d0„Zd–dd2d3œd4d5„Zd6dœd7d8„Zd9dœd:d;„Zd—ddd<œd=d>„Zddœd?d@„Zed
dœdAdB„ƒZd˜d
ddCœdDdE„ZddœdFdG„Zd™dd
d	d
dHœdIdJ„Zdšdd	d	dKœdLdM„Zd›ddd	d	dNœdOdP„Zdœd
d	d
dQœdRdS„Zd�ddVd
d
d	dWdXdd
d
ddYœdZd[„Zdždddœd\d]„Z dŸddVd^d
d	dWd	d_dXddd`œdadb„Z!d dcd
dddœdedf„Z"d¡dd	dgddhœdidj„Z#dkdœdldm„Z$d¢ddodpœdqdr„Z%ddsdœdtdu„Z&ddvdœdwdx„Z'd£dd
d	d
d
d dzœd{d|„Z(ddœd}d~„Z)ddœdd€„Z*ddd�œd‚dƒ„Z+d¤d…dddvd†œd‡dˆ„Z,d¥ddVd^d
d	dWd	d
dd
dd‰œdŠd‹„Z-dŒd�œdŽd�„Z.dd
dŒd�œd‘d’„Z/ddŒ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�   )r“   r”   Ú
fletcher32r`   c                 K  s²   d|v rt dƒ‚tdƒ}|d ur@||jjvr@t d|jj› d�ƒ‚|d u rX|d urX|jj}t|ƒ| _|d u rnd}|| _d | _|r‚|nd| _	|| _
|| _d | _| jf d|i|¤Ž d S )	Nr—   z-format is not a defined argument for HDFStorerƒ   zcomplib only supports z compression.rˆ   r   r“   )r®   r   ÚfiltersZall_complibsZdefault_complibrA   Ú_pathrÆ   rÅ   Ú
_complevelÚ_complibÚ_fletcher32Ú_filtersÚopen)Úselfr³   r“   r”   r•   rÇ   r½   rƒ   rZ   rZ   r[   Ú__init__7  s&    	ÿ
zHDFStore.__init__©r`   c                 C  s   | j S ra   ©rÉ   ©rÏ   rZ   rZ   r[   Ú
__fspath__X  s    zHDFStore.__fspath__c                 C  s   |   ¡  | jdusJ ‚| jjS )zreturn the root nodeN)Ú_check_if_openrÅ   ÚrootrÓ   rZ   rZ   r[   rÖ   [  s    zHDFStore.rootc                 C  s   | j S ra   rÒ   rÓ   rZ   rZ   r[   Úfilenameb  s    zHDFStore.filename©r‘   c                 C  s
   |   |¡S ra   )Úget©rÏ   r‘   rZ   rZ   r[   Ú__getitem__f  s    zHDFStore.__getitem__©r‘   r`   c                 C  s   |   ||¡ d S ra   r¢   )rÏ   r‘   r’   rZ   rZ   r[   Ú__setitem__i  s    zHDFStore.__setitem__c                 C  s
   |   |¡S ra   )ÚremoverÚ   rZ   rZ   r[   Ú__delitem__l  s    zHDFStore.__delitem__re   c              	   C  sD   z|   |¡W S  ttfy"   Y n0 tdt| ƒj› d|› d�ƒ‚dS )z$allow attribute access to get storesú'z' object has no attribute 'N)rÙ   ÚKeyErrorr   r„   ÚtypeÚ__name__)rÏ   rf   rZ   rZ   r[   Ú__getattr__o  s    ÿzHDFStore.__getattr__c                 C  s4   |   |¡}|dur0|j}|||dd… fv r0dS dS )zx
        check for existence of this key
        can match the exact pathname or the pathnm w/o the leading '/'
        Nrk   TF)Úget_noder¹   )rÏ   r‘   Únoderf   rZ   rZ   r[   Ú__contains__y  s    
zHDFStore.__contains__rh   c                 C  s   t |  ¡ ƒS ra   )rt   r·   rÓ   rZ   rZ   r[   Ú__len__…  s    zHDFStore.__len__c                 C  s   t | jƒ}t| ƒ› d|› d�S )Nú
File path: Ú
)rC   rÉ   râ   )rÏ   ÚpstrrZ   rZ   r[   Ú__repr__ˆ  s    
zHDFStore.__repr__rP   c                 C  s   | S ra   rZ   rÓ   rZ   rZ   r[   Ú	__enter__Œ  s    zHDFStore.__enter__ztype[BaseException] | NonezBaseException | NonezTracebackType | None)Úexc_typeÚ	exc_valueÚ	tracebackr`   c                 C  s   |   ¡  d S ra   )r¼   )rÏ   rî   rï   rð   rZ   rZ   r[   Ú__exit__�  s    zHDFStore.__exit__Úpandasú	list[str])Úincluder`   c                 C  s^   |dkrdd„ |   ¡ D ƒS |dkrJ| jdus0J ‚dd„ | jjddd	�D ƒS td
|› d�ƒ‚dS )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  s   g | ]
}|j ‘qS rZ   ©r¹   ©rm   ÚnrZ   rZ   r[   rq   ¶  ó    z!HDFStore.keys.<locals>.<listcomp>ÚnativeNc                 S  s   g | ]
}|j ‘qS rZ   rõ   rö   rZ   rZ   r[   rq   º  s   ú/ÚTable)Ú	classnamez8`include` should be either 'pandas' or 'native' but is 'rà   )r·   rÅ   Z
walk_nodesr®   )rÏ   rô   rZ   rZ   r[   Úkeys—  s    ÿ
ÿzHDFStore.keyszIterator[str]c                 C  s   t |  ¡ ƒS ra   )Úiterrý   rÓ   rZ   rZ   r[   Ú__iter__Á  s    zHDFStore.__iter__zIterator[tuple[str, list]]c                 c  s   |   ¡ D ]}|j|fV  qdS )z'
        iterate on key->group
        N)r·   r¹   )rÏ   ÚgrZ   rZ   r[   ÚitemsÄ  s    zHDFStore.items)r“   r`   c                 K  s¾   t ƒ }| j|krR| jdv r$|dv r$n(|dv rL| jrLtd| j› d| j› d�ƒ‚|| _| jr`|  ¡  | jrŠ| jdkrŠt ƒ j| j| j| j	d�| _
tr | jr d	}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ƒ   ÚmsgrZ   rZ   r[   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Ó   rZ   rZ   r[   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‹   ZisopenrÓ   rZ   rZ   r[   r¯      s    
zHDFStore.is_open)Úfsyncr`   c                 C  sT   | j durP| j  ¡  |rPttƒ�  t | j  ¡ ¡ W d  ƒ n1 sF0    Y  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  rZ   rZ   r[   r  	  s
    


zHDFStore.flushc                 C  sV   t ƒ �< |  |¡}|du r*td|› d�ƒ‚|  |¡W  d  ƒ S 1 sH0    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¿   rZ   rZ   r[   rÙ     s
    
zHDFStore.get)r‘   rª   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
  rk   ri   c                   s   ˆj | ||ˆ d�S )N)r§   r¨   ru   r©   ©Úread©Ú_startÚ_stopÚ_where©r©   rY   rZ   r[   Úfunc†  s    zHDFStore.select.<locals>.func©ru   Únrowsr§   r¨   rª   r«   r­   )rå   rá   rv   Ú_create_storerÚ
infer_axesÚTableIteratorr  Ú
get_result)rÏ   r‘   ru   r§   r¨   r©   rª   r«   r­   r¿   r  ÚitrZ   r  r[   rº   <  s(    @

özHDFStore.select©r‘   r§   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
        rk   ri   z&can only read_coordinates with a table©ru   r§   r¨   )rv   Ú
get_storerrU   rû   rµ   Úread_coordinates)rÏ   r‘   ru   r§   r¨   ÚtblrZ   rZ   r[   Úselect_as_coordinates™  s
    

zHDFStore.select_as_coordinates)r‘   Úcolumnr§   r¨   c                 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©r"  r§   r¨   )r  rU   rû   rµ   Úread_column)rÏ   r‘   r"  r§   r¨   r   rZ   rZ   r[   Úselect_column¹  s    #

zHDFStore.select_column)rª   r«   r­   c
                   sv  t |dd�}t|ttfƒr.t|ƒdkr.|d }t|tƒrRˆj||ˆ|||||	d�S t|ttfƒshtdƒ‚t|ƒsxtdƒ‚|du rˆ|d }‡fdd	„|D ƒ‰ˆ 	|¡}
d}t
 |
|fgtˆ|ƒ¡D ]\\}}|du ràt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
        rk   ri   r   )r‘   ru   r©   r§   r¨   rª   r«   r­   zkeys must be a list/tuplez keys must have a non-zero lengthNc                   s   g | ]}ˆ   |¡‘qS rZ   )r  ©rm   ÚkrÓ   rZ   r[   rq   %  rø   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 rZ   )rU   rû   ©rm   ÚxrZ   rZ   r[   rq   :  rø   c                 S  s   h | ]}|j d  d  ’qS ©r   )Únon_index_axes©rm   r}   rZ   rZ   r[   Ú	<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 )©ru   r©   r§   r¨   r  r-  )r  r  r  r©   rZ   r[   rq   B  s   ÿz=HDFStore.select_as_multiple.<locals>.func.<locals>.<listcomp>F)ÚaxisÚverify_integrity)r4   Ú_consolidate)r  r  r  Úobjs)r0  r©   Útblsr  r[   r  ?  s    þz)HDFStore.select_as_multiple.<locals>.funcr  T©Úcoordinates)rv   rU   rr   rs   rt   r^   rº   rµ   r®   r  Ú	itertoolsÚchainÚziprá   Úis_tableÚpathnamer  Úpopr  r  )rÏ   rý   ru   Úselectorr©   r§   r¨   rª   r«   r­   rY   r  r}   r'  Z_tblsr  r  rZ   )r0  r©   rÏ   r4  r[   Úselect_as_multipleá  sd    +
ø
 ÿ


özHDFStore.select_as_multipleTr�   r‰   rŒ   rŽ   )r‘   r’   r˜   r–   r”   r™   r›   rœ   Útrack_timesrš   r`   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_formatrz   )r—   r˜   r–   r•   r”   r™   r�   r›   r_   rœ   r?  rš   )r   Ú_validate_formatÚ_write_to_group)rÏ   r‘   r’   r—   r˜   r–   r•   r”   r™   r�   r›   r_   rœ   r?  rš   rZ   rZ   r[   r£   Z  s&    8
òzHDFStore.putc              
   C  sâ   t |dd�}z|  |¡}W n† ty.   ‚ Y nt ty@   ‚ Y nb ty  } zJ|dur`tdƒ|‚|  |¡}|durŒ|jdd� W Y d}~dS W Y d}~n
d}~0 0 t 	|||¡rÀ|j
jdd� n|jsÎtdƒ‚|j|||d�S 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

        rk   ri   Nz5trying to remove a node with a non-None where clause!T©Ú	recursivez7can only remove with where on objects written as tablesr  )rv   r  rá   ÚAssertionErrorÚ	Exceptionr®   rå   Z	_f_removeÚcomÚall_noner¿   r:  Údelete)rÏ   r‘   ru   r§   r¨   rY   Úerrræ   rZ   rZ   r[   rÞ   ¦  s2    ÿþ
$ÿzHDFStore.removezbool | list[str]r�   )r‘   r’   r˜   r–   r”   r™   r«   rš   r›   rœ   r`   c                 C  sl   |	durt dƒ‚|du r tdƒ}|du r4tdƒp2d}|  |¡}| 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_tabler@  r{   )r—   Úaxesr˜   r–   r•   r”   r™   r�   r«   Úexpectedrowsrš   r›   r_   rœ   )rµ   r   rA  rB  )rÏ   r‘   r’   r—   rK  r˜   r–   r•   r”   r©   r™   r�   r«   rL  rš   r›   r_   rœ   rZ   rZ   r[   r–   ß  s6    Iÿ
ðzHDFStore.appendÚdict)Údrš   r`   c                   s¬  |durt dƒ‚t|tƒs"tdƒ‚||vr2tdƒ‚ttttˆjƒƒtt	t
ˆƒ ƒ ƒƒ}d}	g }
| ¡ D ]0\}‰ ˆ du rŽ|	durˆtdƒ‚|}	qh|
 ˆ ¡ qh|	durÖˆj| }| t|
ƒ¡}t| |¡ƒ}| |¡||	< |du ræ|| }|�r*‡fdd„| ¡ D ƒ}t|ƒ}|D ]}| |¡}�qˆj| ‰| dd¡}| ¡ D ]h\}‰ ||k�rT|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˜   )rm   Úcols)r’   rZ   r[   Ú	<genexpr>�  rø   z.HDFStore.append_to_multiple.<locals>.<genexpr>r™   ©r0  c                   s   i | ]\}}|ˆ v r||“qS rZ   rZ   ©rm   r‘   r’   )ÚvrZ   r[   Ú
<dictcomp>   rø   z/HDFStore.append_to_multiple.<locals>.<dictcomp>)r›   r™   )rµ   rU   rM  r®   Únextrþ   ÚsetÚrangeÚndimÚ	_AXES_MAPrâ   r  ÚextendrK  Ú
differencer-   ÚsortedÚget_indexerÚtakeÚvaluesÚintersectionÚlocr<  Úreindexr–   )rÏ   rN  r’   r=  r›   rK  rš   r½   r0  Z
remain_keyZremain_valuesr'  ÚorderedZorddZidxsZvalid_indexr˜   r™   ÚdcÚvalÚfilteredrZ   )rU  r’   r[   Úappend_to_multipleE  sZ    ÿ
ÿÿ&ÿ

ÿýzHDFStore.append_to_multipler]   )r‘   ÚoptlevelÚkindr`   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©   rj  rk  )r‡   r  rU   rû   rµ   Úcreate_index)rÏ   r‘   r©   rj  rk  rY   rZ   rZ   r[   Úcreate_table_index¦  s    

zHDFStore.create_table_indexrr   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 | ]H}t |tjjƒst|jd dƒsHt|ddƒsHt |tjjƒr|jdkr|‘qS )Úpandas_typeNr{   )	rU   r‚   ÚlinkÚLinkÚgetattrÚ_v_attrsr{   rû   rÂ   )rm   r   rZ   rZ   r[   rq   è  s   ùz#HDFStore.groups.<locals>.<listcomp>)r‡   rÕ   rÅ   r‚   Úwalk_groupsrÓ   rZ   rZ   r[   r·   Î  s    þzHDFStore.groupsrú   z*Iterator[tuple[str, list[str], list[str]]])ru   r`   c                 c  s¼   t ƒ  |  ¡  | jdusJ ‚tdus(J ‚| j |¡D ]‚}t|jddƒdurLq4g }g }|j ¡ D ]B}t|jddƒ}|du r”t	|tj
jƒr | |j¡ q^| |j¡ q^|j d¡||fV  q4d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
        Nrn  rú   )r‡   rÕ   rÅ   r‚   rs  rq  rr  Z_v_childrenra  rU   r¿   ÚGroupr–   rÂ   r¹   Úrstrip)rÏ   ru   r   r·   ÚleavesÚchildrn  rZ   rZ   r[   Úwalkõ  s     'zHDFStore.walkzNode | Nonec                 C  s~   |   ¡  | d¡sd| }| jdus(J ‚tdus4J ‚z| j | j|¡}W n tjjy`   Y dS 0 t|tj	ƒszJ t
|ƒƒ‚|S )z9return the node with the key or None if it does not existrú   N)rÕ   Ú
startswithrÅ   r‚   rå   rÖ   Ú
exceptionsZNoSuchNodeErrorrU   rJ   râ   )rÏ   r‘   ræ   rZ   rZ   r[   rå   1  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¿   rY   rZ   rZ   r[   r  A  s    

zHDFStore.get_storerr  )r“   Úpropindexesr”   rÇ   Ú	overwriter`   c	              	   C  sÎ   t |||||d�}	|du r&t|  ¡ ƒ}t|ttfƒs:|g}|D ]Š}
|  |
¡}|dur>|
|	v rj|rj|	 |
¡ |  |
¡}t|tƒr¶d}|r–d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  s   g | ]}|j r|j‘qS rZ   )Ú
is_indexedrf   ©rm   rˆ   rZ   rZ   r[   rq   y  rø   z!HDFStore.copy.<locals>.<listcomp>r›   )r˜   r›   r_   rc   )r¤   rr   rý   rU   rs   r  rÞ   rº   rû   rK  r–   rq  r_   r£   )rÏ   r…   r“   r|  rý   r•   r”   rÇ   r}  Z	new_storer'  rY   Údatar˜   rZ   rZ   r[   ÚcopyK  s6    
ÿ




ûzHDFStore.copyc           
      C  s
  t | jƒ}t| ƒ› d|› d�}| jrþt|  ¡ ƒ}t|ƒrôg }g }|D ]œ}z<|  |¡}|dur‚| t |j	pj|ƒ¡ | t |p|dƒ¡ W qD t
y˜   ‚ Y qD tyÞ } z0| |¡ t |ƒ}	| d|	› d�¡ W Y d}~qDd}~0 0 qD|td||ƒ7 }n|d7 }n|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)rC   rÉ   râ   r¯   r^  rý   rt   r  r–   r;  rE  rF  rB   )
rÏ   r³   ÚoutputZlkeysrý   ra  r'  rY   ZdetailZdstrrZ   rZ   r[   Úinfo†  s.    


*
zHDFStore.infoc                 C  s   | j st| j› d�ƒ‚d S )Nz file is not open!)r¯   r   rÉ   rÓ   rZ   rZ   r[   rÕ   »  s    zHDFStore._check_if_open)r—   r`   c              
   C  sL   zt | ¡  }W n6 tyF } ztd|› d�ƒ|‚W Y d}~n
d}~0 0 |S )zvalidate / deprecate formatsz#invalid HDFStore format specified [r(  N)Ú_FORMAT_MAPÚlowerrá   rµ   )rÏ   r—   rJ  rZ   rZ   r[   rA  ¿  s
    (zHDFStore._validate_formatrT   zDataFrame | Series | None)r’   r_   rœ   r`   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 r¶|du r’tƒ  tdusdJ ‚t|ddƒs~t |tj	j
ƒrˆd}d}q¶tdƒ‚n$t |tƒr¢d	}nd
}|dkr¶|d7 }d|v�r.ttdœ}z|| }	W nF t�y }
 z,td|› dt|ƒ› d|› �ƒ|
‚W Y d}
~
n
d}
~
0 0 |	| |||d�S |du �rÈ|du�rÈ|dk�r†t|ddƒ}|du�rÈ|jdk�rtd}n|jdk�rÈd}nB|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 nF t�y, }
 z,td|› dt|ƒ› d|› �ƒ|
‚W Y d}
~
n
d}
~
0 0 |	| |||d�S )z"return a suitable class to operateNz(value must be None, Series, or DataFramern  Ú
table_typer{   Ú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->©r_   rœ   Úseries_tabler˜   rk   Úappendable_seriesÚappendable_multiseriesÚappendable_frameÚappendable_multiframe)rŠ  r‘  r’  r“  r”  Úwormz<cannot properly create the storer for: [_TABLE_MAP] [group->)rU   r1   r+   rµ   r\   rq  rr  r‡   r‚   r{   rû   ÚSeriesFixedÚ
FrameFixedrá   râ   ÚnlevelsÚGenericTableÚAppendableSeriesTableÚAppendableMultiSeriesTableÚAppendableFrameTableÚAppendableMultiFrameTableÚ	WORMTable)rÏ   r¿   r—   r’   r_   rœ   ÚptÚttZ_STORER_MAPÚclsrJ  r˜   Z
_TABLE_MAPrZ   rZ   r[   r  É  s˜    ÿÿ


ÿÿÿÿý





úÿÿÿÿýzHDFStore._create_storer)r‘   r’   r˜   r–   r”   r™   r«   rš   rœ   r?  r`   c                 C  sÎ   t |dd ƒr|dks|rd S |  ||¡}| j|||||d�}|rr|jrZ|jrb|dkrb|jrbtdƒ‚|jsz| ¡  n| ¡  |jsŒ|rŒtdƒ‚|j||||||	|
||||||d� t|t	ƒrÊ|rÊ|j
|d� d S )	NÚemptyr{   r�  rz   zCan only append to Tablesz0Compression not supported on Fixed format stores)ÚobjrK  r–   r•   r”   rÇ   r™   r«   rL  rš   r�   r›   r?  )r©   )rq  Ú_identify_groupr  r:  Ú	is_existsr®   Úset_object_infoÚwriterU   rû   rl  )rÏ   r‘   r’   r—   rK  r˜   r–   r•   r”   rÇ   r™   r«   rL  rš   r�   r›   r_   rœ   r?  r¿   rY   rZ   rZ   r[   rB  $  s:    

ózHDFStore._write_to_grouprJ   ©r¿   c                 C  s   |   |¡}| ¡  | ¡ S ra   )r  r  r  )rÏ   r¿   rY   rZ   rZ   r[   r  b  s    
zHDFStore._read_group)r‘   r–   r`   c                 C  sN   |   |¡}| jdusJ ‚|dur8|s8| jj|dd� d}|du rJ|  |¡}|S )z@Identify HDF5 group based on key, delete/create group if needed.NTrC  )rå   rÅ   Úremove_nodeÚ_create_nodes_and_group)rÏ   r‘   r–   r¿   rZ   rZ   r[   r¤  g  s    

zHDFStore._identify_groupc                 C  sv   | j dusJ ‚| d¡}d}|D ]P}t|ƒs.q |}| d¡sD|d7 }||7 }|  |¡}|du rl| j  ||¡}|}q |S )z,Create nodes from key and return group name.Nrú   )rÅ   Úsplitrt   Úendswithrå   Zcreate_group)rÏ   r‘   Úpathsr³   ÚpÚnew_pathr¿   rZ   rZ   r[   rª  y  s    


z HDFStore._create_nodes_and_group)rˆ   NNF)rò   )rˆ   )F)NNNNFNF)NNN)NN)NNNNNFNF)NTFNNNNNNr�   TF)NNN)NNTTNNNNNNNNNNr�   )NNF)NNN)rú   )r  TNNNFT)NNrT   r�   )NTFNNNNNNFNNNr�   T)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º   r!  r%  r>  r£   rÞ   r–   ri  rm  r·   rx  rå   r  r�  r…  rÕ   rA  r  rB  r  r¤  rª  rZ   rZ   rZ   r[   r¤   ò  s  
A    ú!

*-        ÷`   û$  û+        ö}            ñ$L=               î$k   ùd   û('<       ÷;5    ú`               í$>r¤   c                   @  sp   e Zd ZU dZded< ded< ded< dddd
dd
ddœdd„Zddœdd„Zddœdd„Zd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{  rY   NFr‹   r�   )rŸ   rY   rª   r«   r­   r`   c                 C  sš   || _ || _|| _|| _| jjrN|d u r,d}|d u r8d}|d u rD|}t||ƒ}|| _|| _|| _d | _	|sr|	d urŠ|	d u r~d}	t
|	ƒ| _nd | _|
| _d S )Nr   é † )rŸ   rY   r  ru   r:  Úminr  r§   r¨   r6  rh   r«   r­   )rÏ   rŸ   rY   r  ru   r  r§   r¨   rª   r«   r­   rZ   rZ   r[   rÐ   §  s,    
zTableIterator.__init__rE   rÑ   c                 c  sv   | j }| jd u rtdƒ‚|| jk rjt|| j | jƒ}|  d d | j||… ¡}|}|d u st|ƒsbq|V  q|  ¡  d S )Nz*Cannot iterate until get_result is called.)	r§   r6  r®   r¨   r¶  r«   r  rt   r¼   )rÏ   rÃ   r¨   r’   rZ   rZ   r[   rÿ   Ñ  s    

zTableIterator.__iter__c                 C  s   | j r| j ¡  d S ra   )r­   rŸ   r¼   rÓ   rZ   rZ   r[   r¼   á  s    zTableIterator.closer5  c                 C  sŠ   | j d ur4t| jtƒstdƒ‚| jj| jd�| _| S |rft| jtƒsLtdƒ‚| jj| j| j| j	d�}n| j}|  
| j| j	|¡}|  ¡  |S )Nz0can only use an iterator or chunksize on a table)ru   z$can only read_coordinates on a tabler  )r«   rU   rY   rû   rµ   r  ru   r6  r§   r¨   r  r¼   )rÏ   r6  ru   ÚresultsrZ   rZ   r[   r  å  s    
ÿzTableIterator.get_result)NNFNF)F)	rã   r°  r±  r²  r³  rÐ   rÿ   r¼   r  rZ   rZ   rZ   r[   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dKdd	d
dœdd„Ze	ddœdd„ƒZ
e	ddœdd„ƒZdd
dœdd„Zddœdd„Zdddœdd„Zddœdd„Ze	ddœdd „ƒZd!ddd"d#œd$d%„Zd&d'„ Ze	d(d)„ ƒZe	d*d+„ ƒZe	d,d-„ ƒZe	d.d/„ ƒZd0dœd1d2„ZdLd
dœd3d4„Zd
dœd5d6„Zd7dd
d8œd9d:„ZdMd;d<„Zdd
d=œd>d?„Zd
dœd@dA„Zd
dœdBdC„Zd
dœdDdE„Zd7d
dFœdGdH„Z d7d
dFœdIdJ„Z!dS )NÚ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_nameNr^   r]   r�   )rf   Úcnamer`   c                 C  s    t |tƒstdƒ‚|| _|| _|| _|| _|p0|| _|| _|| _	|| _
|	| _|
| _|| _|| _|| _|| _|d ur||  |¡ t | jtƒsŒJ ‚t | jtƒsœJ ‚d S )Nz`name` must be a str.)rU   r^   r®   ra  rk  Útyprf   r¾  r0  Úposr»  r¼  r½  re  r{   rÁ   ÚmetadataÚset_pos)rÏ   rf   ra  rk  r¿  r¾  r0  rÀ  r»  r¼  r½  re  r{   rÁ   rÁ  rZ   rZ   r[   rÐ     s(    


zIndexCol.__init__rh   rÑ   c                 C  s   | j jS ra   )r¿  ÚitemsizerÓ   rZ   rZ   r[   rÃ  <  s    zIndexCol.itemsizec                 C  s   | j › d�S )NÚ_kindre   rÓ   rZ   rZ   r[   Ú	kind_attrA  s    zIndexCol.kind_attr)rÀ  r`   c                 C  s$   || _ |dur | jdur || j_dS )z,set the position of this column in the TableN)rÀ  r¿  Z_v_pos)rÏ   rÀ  rZ   rZ   r[   rÂ  E  s    zIndexCol.set_posc                 C  s@   t tt| j| j| j| j| jfƒƒ}d dd„ t	g d¢|ƒD ƒ¡S )Nú,c                 S  s   g | ]\}}|› d |› �‘qS ©z->rZ   rT  rZ   rZ   r[   rq   P  s   ÿz%IndexCol.__repr__.<locals>.<listcomp>)rf   r¾  r0  rÀ  rk  )
rs   ÚmaprC   rf   r¾  r0  rÀ  rk  Újoinr9  ©rÏ   ÚtemprZ   rZ   r[   rì   K  s    ÿþÿzIndexCol.__repr__Úobject©Úotherr`   c                   s   t ‡ ‡fdd„dD ƒƒS )úcompare 2 col itemsc                 3  s&   | ]}t ˆ|d ƒt ˆ |d ƒkV  qd S ra   ©rq  r  ©rÎ  rÏ   rZ   r[   rR  X  s   ÿz"IndexCol.__eq__.<locals>.<genexpr>)rf   r¾  r0  rÀ  ©rO  ©rÏ   rÎ  rZ   rÑ  r[   Ú__eq__V  s    þzIndexCol.__eq__c                 C  s   |   |¡ S ra   )rÔ  rÓ  rZ   rZ   r[   Ú__ne__]  s    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 columnrQ  F)Úhasattrr{   rq  rQ  r¾  r~  rÓ   rZ   rZ   r[   r~  `  s    zIndexCol.is_indexedú
np.ndarrayz3tuple[np.ndarray, np.ndarray] | tuple[Index, Index]©ra  r_   rœ   r`   c              
   C  s‚  t |tjƒsJ t|ƒƒ‚|jjdur2|| j  ¡ }t| j	ƒ}t
||||ƒ}i }t| jƒ|d< | jdurtt| jƒ|d< t}t |jd¡s’t |jtƒr˜t}n|jdkr²d|v r²dd„ }z||fi |¤Ž}W n¦ t�y8 }	 zX|dk�r"td	ƒ�r"t|	ƒ d
¡�r"t�r"||fdtdtjd�i|¤Ž}n‚ W Y d}	~	n>d}	~	0  t�yl   d|v �rXd|d< ||fi |¤Ž}Y n0 t|| jƒ}
|
|
fS )zV
        Convert the data from this selection to the appropriate pandas type.
        Nrf   r»  ÚMÚi8c                 [  s    t j| | dd ¡d� |d ¡S )Nr»  )r»  rf   )r/   Zfrom_ordinalsrÙ   Z_rename)r*  ÚkwdsrZ   rZ   r[   r¡   ˆ  s   ÿýz"IndexCol.convert.<locals>.<lambda>Úsurrogatepassúfuture.infer_stringúsurrogates not allowedÚdtypeÚpython©ZstorageÚna_value)rU   rV   Úndarrayrâ   rß  Úfieldsr¾  r�  r\   rk  Ú_maybe_convertr½  r»  r-   r   Úis_np_dtyper'   r,   ÚUnicodeEncodeErrorr   r^   r¬  r   r2   Únanr®   Ú_set_tzr¼  )rÏ   ra  r�   r_   rœ   Úval_kindr½   ÚfactoryZnew_pd_indexrJ  Zfinal_pd_indexrZ   rZ   r[   Úconverth  sR    

ÿÿþýüÿþý
zIndexCol.convertc                 C  s   | j S )zreturn the values©ra  rÓ   rZ   rZ   r[   Ú	take_data¨  s    zIndexCol.take_datac                 C  s   | j jS ra   )r{   rr  rÓ   rZ   rZ   r[   Úattrs¬  s    zIndexCol.attrsc                 C  s   | j jS ra   ©r{   ÚdescriptionrÓ   rZ   rZ   r[   rñ  °  s    zIndexCol.descriptionc                 C  s   t | j| jdƒS )z!return my current col descriptionN)rq  rñ  r¾  rÓ   rZ   rZ   r[   Úcol´  s    zIndexCol.colc                 C  s   | j S ©zreturn my cython valuesrí  rÓ   rZ   rZ   r[   Úcvalues¹  s    zIndexCol.cvaluesrE   c                 C  s
   t | jƒS ra   )rþ   ra  rÓ   rZ   rZ   r[   rÿ   ¾  s    zIndexCol.__iter__c                 C  sP   t | jƒdkrLt|tƒr$| | j¡}|durL| jj|k rLtƒ j	|| j
d�| _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À  )r\   rk  rU   rM  rÙ   rf   r¿  rÃ  r‡   Ú	StringColrÀ  )rÏ   r™   rZ   rZ   r[   Úmaybe_set_sizeÁ  s
    
zIndexCol.maybe_set_sizec                 C  s   d S ra   rZ   rÓ   rZ   rZ   r[   Úvalidate_namesÎ  s    zIndexCol.validate_namesÚAppendableTable)Úhandlerr–   r`   c                 C  s:   |j | _ |  ¡  |  |¡ |  |¡ |  |¡ |  ¡  d S ra   )r{   Úvalidate_colÚvalidate_attrÚvalidate_metadataÚwrite_metadataÚset_attr)rÏ   rú  r–   rZ   rZ   r[   Úvalidate_and_setÑ  s    


zIndexCol.validate_and_setc                 C  s^   t | jƒdkrZ| j}|durZ|du r*| j}|j|k rTtd|› d| j› d|j› d�ƒ‚|jS dS )z:validate this column: return the compared against itemsizerõ  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)r\   rk  rò  rÃ  r®   r¾  )rÏ   rÃ  ÚcrZ   rZ   r[   rû  Ù  s    
ÿþÿzIndexCol.validate_col)r–   r`   c                 C  sB   |r>t | j| jd ƒ}|d ur>|| jkr>td|› d| j› d�ƒ‚d S )Nzincompatible kind in col [ú - r(  )rq  rï  rÅ  rk  rµ   )rÏ   r–   Zexisting_kindrZ   rZ   r[   rü  ì  s    ÿzIndexCol.validate_attrc                 C  sÈ   | j D ]¼}t| |dƒ}| | ji ¡}| |¡}||v rª|durª||krª|dv r„t|||f }tj|tt	ƒ d� d||< t
| |dƒ qÂtd| j› d|› d|› d|› d�	ƒ‚q|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_fieldsrq  Ú
setdefaultrf   rÙ   rx   ÚwarningsÚwarnr   r   Úsetattrr®   )rÏ   r…  r‘   r’   ÚidxZexisting_valueÚwsrZ   rZ   r[   Úupdate_infoõ  s*    

ÿÿþÿzIndexCol.update_infoc                 C  s$   |  | j¡}|dur | j |¡ dS )z!set my state from the passed infoN)rÙ   rf   Ú__dict__Úupdate)rÏ   r…  r
  rZ   rZ   r[   Úset_info	  s    zIndexCol.set_infoc                 C  s   t | j| j| jƒ dS )zset the kind for this columnN)r	  rï  rÅ  rk  rÓ   rZ   rZ   r[   rÿ  	  s    zIndexCol.set_attr)rú  r`   c                 C  sH   | j dkrD| j}| | j¡}|durD|durDt||ddd�sDtdƒ‚dS )z:validate that kind=category does not change the categoriesÚcategoryNT©Z
strict_nanZdtype_equalzEcannot append a categorical with different categories to the existing)rÁ   rÁ  Úread_metadatar¾  r*   r®   )rÏ   rú  Znew_metadataZcur_metadatarZ   rZ   r[   rý  	  s    
ÿþÿýÿzIndexCol.validate_metadatac                 C  s   | j dur| | j| j ¡ dS )zset the meta dataN)rÁ  rþ  r¾  )rÏ   rú  rZ   rZ   r[   rþ  /	  s    
zIndexCol.write_metadata)NNNNNNNNNNNNN)N)N)"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ü  r  r  rÿ  rý  rþ  rZ   rZ   rZ   r[   r¸  ÿ  sb   
             ñ+@




	r¸  c                   @  sD   e Zd ZdZeddœdd„ƒZddddd	œd
d„Zddœdd„ZdS )ÚGenericIndexColz:an index which is not represented in the data of the tabler‹   rÑ   c                 C  s   dS ©NFrZ   rÓ   rZ   rZ   r[   r~  8	  s    zGenericIndexCol.is_indexedr×  r^   ztuple[Index, Index]rØ  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
        )rU   rV   rã  râ   r0   rt   )rÏ   ra  r�   r_   rœ   r˜   rZ   rZ   r[   rì  <	  s    zGenericIndexCol.convertr�   c                 C  s   d S ra   rZ   rÓ   rZ   rZ   r[   rÿ  N	  s    zGenericIndexCol.set_attrN)rã   r°  r±  r²  r´  r~  rì  rÿ  rZ   rZ   rZ   r[   r  5	  s
   r  c                      s>  e Zd ZdZdZdZddgZd;dddd	d
œ‡ fdd„Zeddœdd„ƒZ	eddœdd„ƒZ
ddœdd„Zdddœdd„Zdd	dœdd„Zdd„ Zeddd œd!d"„ƒZed#d$„ ƒZedd%d&œd'd(„ƒZeddd&œd)d*„ƒZed+d,„ ƒZed-d.„ ƒZed/d0„ ƒZed1d2„ ƒZd	dœd3d4„Zd5ddd6œd7d8„Zd	dœd9d:„Z‡  ZS )<Ú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¼  re  Nr^   r]   zDtypeArg | Noner�   )rf   r¾  rß  r`   c                   s2   t ƒ j|||||||||	|
|d� || _|| _d S )N)rf   ra  rk  r¿  rÀ  r¾  r¼  re  r{   rÁ   rÁ  )ÚsuperrÐ   rß  r€  )rÏ   rf   ra  rk  r¿  r¾  rÀ  r¼  re  r{   rÁ   rÁ  rß  r€  ©Ú	__class__rZ   r[   rÐ   c	  s    õzDataCol.__init__rÑ   c                 C  s   | j › d�S )NÚ_dtypere   rÓ   rZ   rZ   r[   Ú
dtype_attrƒ	  s    zDataCol.dtype_attrc                 C  s   | j › d�S )NÚ_metare   rÓ   rZ   rZ   r[   Ú	meta_attr‡	  s    zDataCol.meta_attrc                 C  s@   t tt| j| j| j| j| jfƒƒ}d dd„ t	g d¢|ƒD ƒ¡S )NrÆ  c                 S  s   g | ]\}}|› d |› �‘qS rÇ  rZ   rT  rZ   rZ   r[   rq   ’	  s   ÿz$DataCol.__repr__.<locals>.<listcomp>)rf   r¾  rß  rk  Úshape)
rs   rÈ  rC   rf   r¾  rß  rk  r  rÉ  r9  rÊ  rZ   rZ   r[   rì   ‹	  s    ÿÿþÿzDataCol.__repr__rÌ  r‹   rÍ  c                   s   t ‡ ‡fdd„dD ƒƒS )rÏ  c                 3  s&   | ]}t ˆ|d ƒt ˆ |d ƒkV  qd S ra   rÐ  r  rÑ  rZ   r[   rR  š	  s   ÿz!DataCol.__eq__.<locals>.<genexpr>)rf   r¾  rß  rÀ  rÒ  rÓ  rZ   rÑ  r[   rÔ  ˜	  s    þzDataCol.__eq__rL   )r€  r`   c                 C  s@   |d usJ ‚| j d u sJ ‚t|ƒ\}}|| _|| _ t|ƒ| _d S ra   )rß  Ú_get_data_and_dtype_namer€  Ú_dtype_to_kindrk  )rÏ   r€  Ú
dtype_namerZ   rZ   r[   Úset_dataŸ	  s    zDataCol.set_datac                 C  s   | j S )zreturn the data©r€  rÓ   rZ   rZ   r[   rî  ©	  s    zDataCol.take_datarH   )ra  r`   c                 C  sÌ   |j }|j}|j}|jdkr&d|jf}t|tƒrJ|j}| j||j j	d�}n~t
 |d¡s`t|tƒrl|  |¡}n\t
 |d¡r„|  |¡}nDt|ƒr¢tƒ j||d d�}n&t|ƒr¸|  ||¡}n| j||j	d�}|S )zW
        Get an appropriately typed and shaped pytables.Col object for values.
        rk   ©rk  rÙ  Úmr   ©rÃ  r  )rß  rÃ  r  rZ  ÚsizerU   r6   ÚcodesÚget_atom_datarf   r   ræ  r'   Úget_atom_datetime64Úget_atom_timedelta64r"   r‡   Z
ComplexColr$   Úget_atom_string)r¡  ra  rß  rÃ  r  r'  ÚatomrZ   rZ   r[   Ú	_get_atom­	  s$    


zDataCol._get_atomc                 C  s   t ƒ j||d d�S )Nr   r%  ©r‡   rö  ©r¡  r  rÃ  rZ   rZ   r[   r+  Í	  s    zDataCol.get_atom_stringz	type[Col]©rk  r`   c                 C  sR   |  d¡r$|dd… }d|› d�}n"|  d¡r4d}n| ¡ }|› d�}ttƒ |ƒS )z0return the PyTables column class for this columnÚuinté   NZUIntrH   ÚperiodÚInt64Col)ry  Ú
capitalizerq  r‡   )r¡  rk  Zk4Zcol_nameZkcaprZ   rZ   r[   Úget_atom_coltypeÑ	  s    


zDataCol.get_atom_coltypec                 C  s   | j |d�|d d�S )Nr#  r   ©r  ©r6  ©r¡  r  rk  rZ   rZ   r[   r(  à	  s    zDataCol.get_atom_datac                 C  s   t ƒ j|d d�S ©Nr   r7  ©r‡   r4  ©r¡  r  rZ   rZ   r[   r)  ä	  s    zDataCol.get_atom_datetime64c                 C  s   t ƒ j|d d�S r:  r;  r<  rZ   rZ   r[   r*  è	  s    zDataCol.get_atom_timedelta64c                 C  s   t | jdd ƒS )Nr  )rq  r€  rÓ   rZ   rZ   r[   r  ì	  s    zDataCol.shapec                 C  s   | j S ró  r"  rÓ   rZ   rZ   r[   rô  ð	  s    zDataCol.cvaluesc                 C  s`   |r\t | j| jdƒ}|dur2|t| jƒkr2tdƒ‚t | j| jdƒ}|dur\|| jkr\tdƒ‚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!)rq  rï  rÅ  rr   ra  r®   r  rß  )rÏ   r–   Zexisting_fieldsZexisting_dtyperZ   rZ   r[   rü  õ	  s    ÿzDataCol.validate_attrr×  )ra  r_   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s¤J ‚t|ƒ}| d¡rÈt||dd�}�n&|dkrâtj|dd�}�n|dk�r8ztjd	d
„ |D ƒtd�}W n, t�y4   tjdd
„ |D ƒtd�}Y n0 n¶|dk�r¸|	}| ¡ }|du �rhtg tjd�}n<t|ƒ}| ¡ �r¤||  }||dk  | t¡ ¡ j8  < tj|||
dd�}n6z|j|dd�}W n" t �yì   |jddd�}Y n0 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  s   g | ]}t  |¡‘qS rZ   ©r   Úfromordinal©rm   rU  rZ   rZ   r[   rq   9
  rø   z#DataCol.convert.<locals>.<listcomp>c                 S  s   g | ]}t  |¡‘qS rZ   ©r   ÚfromtimestamprE  rZ   rZ   r[   rq   =
  rø   r  éÿÿÿÿF)Ú
categoriesre  Úvalidate©r�  ÚOrõ  ©r�   r_   rœ   )#rU   rV   rã  râ   rß  rä  r¾  r¿  r  r  rk  r\   rÁ   rÁ  re  r¼  ry  ré  ÚasarrayrÌ  r®   Úravelr-   Zfloat64r5   ÚanyÚastyperh   ZcumsumÚ_valuesr6   Z
from_codesrµ   Ú_unconvert_string_arrayra  )rÏ   ra  r�   r_   rœ   Ú	convertedr   rk  rÁ   rÁ  re  r¼  rß  rI  r'  ÚmaskrZ   rZ   r[   rì  
  sf    





ÿ
ÿ



 ÿÿzDataCol.convertc                 C  sH   t | j| j| jƒ t | j| j| jƒ | jdus2J ‚t | j| j| jƒ dS )zset the data for this columnN)r	  rï  rÅ  ra  r  rÁ   rß  r  rÓ   rZ   rZ   r[   rÿ  f
  s    zDataCol.set_attr)NNNNNNNNNNNN)rã   r°  r±  r²  r¹  rº  r  rÐ   r´  r  r  rì   rÔ  r!  rî  Úclassmethodr-  r+  r6  r(  r)  r*  r  rô  rü  rì  rÿ  Ú__classcell__rZ   rZ   r  r[   r  R	  sX               ò 





dr  c                   @  sZ   e Zd ZdZdZddœdd„Zedd„ ƒZed	d
dœdd„ƒZedd„ ƒZ	edd„ ƒZ
dS )ÚDataIndexableColz+represent a data column that can be indexedTr�   rÑ   c                 C  s   t t| jƒjƒstdƒ‚d S )Nú-cannot have non-object label DataIndexableCol)r$   r-   ra  rß  r®   rÓ   rZ   rZ   r[   rø  s
  s    zDataIndexableCol.validate_namesc                 C  s   t ƒ j|d�S )N)rÃ  r.  r/  rZ   rZ   r[   r+  x
  s    z DataIndexableCol.get_atom_stringr^   rH   r0  c                 C  s   | j |d�ƒ S )Nr#  r8  r9  rZ   rZ   r[   r(  |
  s    zDataIndexableCol.get_atom_datac                 C  s
   t ƒ  ¡ S ra   r;  r<  rZ   rZ   r[   r)  €
  s    z$DataIndexableCol.get_atom_datetime64c                 C  s
   t ƒ  ¡ S ra   r;  r<  rZ   rZ   r[   r*  „
  s    z%DataIndexableCol.get_atom_timedelta64N)rã   r°  r±  r²  rº  rø  rV  r+  r(  r)  r*  rZ   rZ   rZ   r[   rX  n
  s   

rX  c                   @  s   e Zd ZdZdS )ÚGenericDataIndexableColz(represent a generic pytables data columnN)rã   r°  r±  r²  rZ   rZ   rZ   r[   rZ  ‰
  s   rZ  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< dNd
dddddœdd„Zeddœdd„ƒZ	eddœdd„ƒZ
edd„ ƒZddœdd „Zddœd!d"„Zd dœd#d$„Zed%d&„ ƒZed'd(„ ƒZed)d*„ ƒZed+d,„ ƒZeddœd-d.„ƒZeddœd/d0„ƒZed1d2„ ƒZddœd3d4„Zddœd5d6„Zed7d8„ ƒZeddœd9d:„ƒZed;d<„ ƒZd=dœd>d?„ZdOddœdAdB„ZddœdCdD„ZdPdEdEdFœdGdH„ZddœdIdJ„ZdQdEdEddKœdLdM„Z d@S )RÚ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_kindrz   Úformat_typeútype[DataFrame | Series]Úobj_typerh   rZ  r¤   rÄ   Fr‹   r:  rT   r�   rJ   r]   r�   )rÄ   r¿   r_   rœ   r`   c                 C  sZ   t |tƒsJ t|ƒƒ‚td us"J ‚t |tjƒs:J t|ƒƒ‚|| _|| _t|ƒ| _|| _	d S ra   )
rU   r¤   râ   r‚   rJ   rÄ   r¿   rd   r_   rœ   )rÏ   rÄ   r¿   r_   rœ   rZ   rZ   r[   rÐ   ¡
  s    
zFixed.__init__rÑ   c                 C  s*   | j d dko(| j d dko(| j d dk S )Nr   rk   é
   é   )ÚversionrÓ   rZ   rZ   r[   Úis_old_version°
  s    zFixed.is_old_versionztuple[int, int, int]c                 C  s`   t t| jjddƒƒ}z0tdd„ | d¡D ƒƒ}t|ƒdkrB|d }W n tyZ   d}Y n0 |S )	zcompute and set our versionÚpandas_versionNc                 s  s   | ]}t |ƒV  qd S ra   ©rh   r)  rZ   rZ   r[   rR  ¹
  rø   z Fixed.version.<locals>.<genexpr>Ú.ra  r+  )r   r   r   )r\   rq  r¿   rr  rs   r«  rt   r„   )rÏ   rb  rZ   rZ   r[   rb  ´
  s    
zFixed.versionc                 C  s   t t| jjdd ƒƒS )Nrn  )r\   rq  r¿   rr  rÓ   rZ   rZ   r[   rn  À
  s    zFixed.pandas_typec                 C  s^   |   ¡  | j}|durXt|ttfƒrDd dd„ |D ƒ¡}d|› d�}| jd›d|› d	�S | jS )
ú(return a pretty representation of myselfNrÆ  c                 S  s   g | ]}t |ƒ‘qS rZ   ©rC   r)  rZ   rZ   r[   rq   Ê
  rø   z"Fixed.__repr__.<locals>.<listcomp>ú[r(  ú12.12z	 (shape->ú))r  r  rU   rr   rs   rÉ  rn  )rÏ   rY   ZjshaperZ   rZ   r[   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ï  rn  Ú_versionrd  rÓ   rZ   rZ   r[   r¦  Ï
  s    zFixed.set_object_infoc                 C  s   t   | ¡}|S ra   rK  )rÏ   Znew_selfrZ   rZ   r[   r�  Ô
  s    
z
Fixed.copyc                 C  s   | j S ra   )r  rÓ   rZ   rZ   r[   r  Ø
  s    zFixed.shapec                 C  s   | j jS ra   ©r¿   r¹   rÓ   rZ   rZ   r[   r;  Ü
  s    zFixed.pathnamec                 C  s   | j jS ra   )rÄ   rÅ   rÓ   rZ   rZ   r[   rÅ   à
  s    zFixed._handlec                 C  s   | j jS ra   )rÄ   rÍ   rÓ   rZ   rZ   r[   rÍ   ä
  s    zFixed._filtersc                 C  s   | j jS ra   )rÄ   rÊ   rÓ   rZ   rZ   r[   rÊ   è
  s    zFixed._complevelc                 C  s   | j jS ra   )rÄ   rÌ   rÓ   rZ   rZ   r[   rÌ   ì
  s    zFixed._fletcher32c                 C  s   | j jS ra   )r¿   rr  rÓ   rZ   rZ   r[   rï  ð
  s    zFixed.attrsc                 C  s   dS ©zset our object attributesNrZ   rÓ   rZ   rZ   r[   Ú	set_attrsô
  s    zFixed.set_attrsc                 C  s   dS )zget our object attributesNrZ   rÓ   rZ   rZ   r[   Ú	get_attrs÷
  s    zFixed.get_attrsc                 C  s   | j S )zreturn my storabler¨  rÓ   rZ   rZ   r[   Ústorableú
  s    zFixed.storablec                 C  s   dS r  rZ   rÓ   rZ   rZ   r[   r¥  ÿ
  s    zFixed.is_existsc                 C  s   t | jdd ƒS )Nr  )rq  rq  rÓ   rZ   rZ   r[   r    s    zFixed.nrowszLiteral[True] | Nonec                 C  s   |du rdS dS )z%validate against an existing storableNTrZ   rÓ  rZ   rZ   r[   rJ    s    zFixed.validateNc                 C  s   dS )ú+are we trying to operate on an old version?NrZ   )rÏ   ru   rZ   rZ   r[   Úvalidate_version  s    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)rq  rp  )rÏ   rY   rZ   rZ   r[   r    s
    zFixed.infer_axesrŠ   ©r§   r¨   c                 C  s   t dƒ‚d S )Nz>cannot read on an abstract storer: subclasses should implement©r±   ©rÏ   ru   r©   r§   r¨   rZ   rZ   r[   r    s    ÿz
Fixed.readc                 K  s   t dƒ‚d S )Nz?cannot write on an abstract storer: subclasses should implementru  ©rÏ   r£  r½   rZ   rZ   r[   r§  &  s    ÿzFixed.write©r§   r¨   r`   c                 C  s0   t  |||¡r$| jj| jdd� dS tdƒ‚dS )zs
        support fully deleting the node in its entirety (only) - where
        specification must be None
        TrC  Nz#cannot delete on an abstract storer)rG  rH  rÅ   r©  r¿   rµ   )rÏ   ru   r§   r¨   rZ   rZ   r[   rI  +  s    zFixed.delete)rT   r�   )N)NNNN)NNN)!rã   r°  r±  r²  r³  r]  r:  rÐ   r´  rc  rb  rn  rì   r¦  r�  r  r;  rÅ   rÍ   rÊ   rÌ   rï  ro  rp  rq  r¥  r  rJ  rs  r  r  r§  rI  rZ   rZ   rZ   r[   r[  �
  sh   
  û







    û ÿr[  c                   @  sF  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
d„Zdd„ Zdd„ Zdd	œdd„Zedd	œdd„ƒZdd	œdd„Zdd	œdd„Zdd	œdd„Zd:ddddœdd „Zd;dddd!d"œd#d$„Zdd!dd%œd&d'„Zdd(dd%œd)d*„Zd<dddd(d"œd+d,„Zd=d-ddd!d.œd/d0„Zdd1dd2œd3d4„Zd>dd5d6dd7œd8d9„ZdS )?ÚGenericFixedza generified fixed versionÚdatetimer3  c                 C  s   i | ]\}}||“qS rZ   rZ   )rm   r'  rU  rZ   rZ   r[   rV  =  rø   zGenericFixed.<dictcomp>ró   Ú
attributesr^   rÑ   c                 C  s   | j  |d¡S )NÚ )Ú_index_type_maprÙ   )rÏ   r¡  rZ   rZ   r[   Ú_class_to_aliasA  s    zGenericFixed._class_to_aliasc                 C  s   t |tƒr|S | j |t¡S ra   )rU   râ   Ú_reverse_index_maprÙ   r-   )rÏ   ÚaliasrZ   rZ   r[   Ú_alias_to_classD  s    
zGenericFixed._alias_to_classc                 C  s¸   |   tt|ddƒƒ¡}|tkr.d	dd„}|}n|tkrFd
dd„}|}n|}i }d|v rn|d |d< |tu rnt}d|v r°t|d tƒr˜|d  	d¡|d< n|d |d< |tu s°J ‚||fS )NÚindex_classr|  c                 S  s>   t j| j| j|d�}tj|d d�}|d ur:| d¡ |¡}|S )N)rß  r»  re   ÚUTC)r7   Ú_simple_newra  rß  r,   Útz_localizeÚ
tz_convert)ra  r»  r¼  ZdtaÚresultrZ   rZ   r[   r|   S  s    
ÿz*GenericFixed._get_index_factory.<locals>.fc                 S  s$   t |ƒ}tj| |d�}tj|d d�S )NrB  re   )r)   r8   r„  r/   )ra  r»  r¼  rß  ZparrrZ   rZ   r[   r|   `  s    r»  r¼  zutf-8)NN)NN)
r�  r\   rq  r,   r/   r-   r3   rU   ÚbytesrX   )rÏ   rï  r‚  r|   rë  r½   rZ   rZ   r[   Ú_get_index_factoryJ  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©   ru   rZ   rZ   r[   Úvalidate_read{  s    ÿÿzGenericFixed.validate_readr‹   c                 C  s   dS )NTrZ   rÓ   rZ   rZ   r[   r¥  Š  s    zGenericFixed.is_existsc                 C  s   | j | j_ | j| j_dS rn  )r_   rï  rœ   rÓ   rZ   rZ   r[   ro  Ž  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 attributesr_   Nrœ   r�   )rd   rq  rï  r_   r\   rœ   r{  r	  )rÏ   r÷   rZ   rZ   r[   rp  “  s    
zGenericFixed.get_attrsc                 K  s   |   ¡  d S ra   )ro  rw  rZ   rZ   r[   r§  š  s    zGenericFixed.writeNrŠ   r  c                 C  sö   ddl }t| j|ƒ}|j}t|ddƒ}t||jƒrd|d ||… }t|ddƒ}	|	durät||	d�}n€tt|ddƒƒ}	t|ddƒ}
|
dur˜tj	|
|	d�}n|||… }|	rÎ|	 
d¡rÎt|d	dƒ}t||d
d�}n|	dkrätj|dd�}|rî|jS |S dS )z2read an array for the specified node (off of groupr   NÚ
transposedFÚ
value_typerB  r  r=  r¼  Tr>  r@  rA  )rƒ   rq  r¿   rr  rU   ZVLArrayÚpd_arrayr\   rV   r¢  ry  ré  rN  ÚT)rÏ   r‘   r§   r¨   rƒ   ræ   rï  rŒ  Úretrß  r  r¼  rZ   rZ   r[   Ú
read_array�  s,    zGenericFixed.read_arrayr-   )r‘   r§   r¨   r`   c                 C  sh   t t| j|› d�ƒƒ}|dkr.| j|||d�S |dkrVt| j|ƒ}| j|||d�}|S td|› �ƒ‚d S )NÚ_varietyÚmultirt  Úregularzunrecognized index variety: )r\   rq  rï  Úread_multi_indexr¿   Úread_index_noderµ   )rÏ   r‘   r§   r¨   Zvarietyræ   r˜   rZ   rZ   r[   Ú
read_indexÂ  s    zGenericFixed.read_index)r‘   r˜   r`   c                 C  sà   t |tƒr,t| j|› d�dƒ |  ||¡ n°t| j|› d�dƒ td|| j| jƒ}|  ||j	¡ t
| j|ƒ}|j|j_|j|j_t |ttfƒr |  t|ƒ¡|j_t |tttfƒrº|j|j_t |tƒrÜ|jd urÜt|jƒ|j_d S )Nr’  r“  r”  r˜   )rU   r.   r	  rï  Úwrite_multi_indexÚ_convert_indexr_   rœ   Úwrite_arrayra  rq  r¿   rk  rr  rf   r,   r/   r~  râ   r‚  r3   r»  r¼  Ú_get_tz)rÏ   r‘   r˜   rT  ræ   rZ   rZ   r[   Úwrite_indexÐ  s    



zGenericFixed.write_indexr.   c                 C  sÒ   t | j|› d�|jƒ tt|j|j|jƒƒD ] \}\}}}t|j	t
ƒrNt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)r	  rï  r˜  Ú	enumerater9  Úlevelsr'  ÚnamesrU   rß  r(   r±   r™  r_   rœ   rš  ra  rq  r¿   rk  rr  rf   )rÏ   r‘   r˜   ÚiÚlevÚlevel_codesrf   Ú	level_keyZ
conv_levelræ   Ú	label_keyrZ   rZ   r[   r˜  ç  s"    ÿÿ
zGenericFixed.write_multi_indexc                 C  s¤   t | j|› d�ƒ}g }g }g }t|ƒD ]l}|› d|› �}	t | j|	ƒ}
| j|
||d�}| |¡ | |j¡ |› d|› �}| j|||d�}| |¡ q&t|||dd�S )Nr�  rž  rt  r   T)r¢  r'  r£  r1  )	rq  rï  rY  r¿   r–  r–   rf   r‘  r.   )rÏ   r‘   r§   r¨   r˜  r¢  r'  r£  r¤  r§  ræ   r¥  r¨  r¦  rZ   rZ   r[   r•     s     
ÿzGenericFixed.read_multi_indexrJ   )ræ   r§   r¨   r`   c              
   C  sb  |||… }d|j v r>t |j j¡dkr>tj|j j|j jd�}t|j jƒ}d }d|j v rlt|j j	ƒ}t|ƒ}|j }|  
|¡\}}	|dv r®|t||| j| jd�fdti|	¤Ž}
nªz$|t||| j| jd�fi |	¤Ž}
W n„ t�yV } zj| jdk�r@td	ƒ�r@t|ƒ d
¡�r@t�r@|t||| j| jd�fdtdtjd�i|	¤Ž}
n‚ W Y d }~n
d }~0 0 ||
_	|
S )Nr  r   rB  rf   )r   rÌ  r�  rß  rÜ  rÝ  rÞ  rà  rá  )rr  rV   Úprodr  r¢  r�  r\   rk  rg   rf   r‰  Ú_unconvert_indexr_   rœ   rÌ  rç  r   r^   r¬  r   r2   rè  )rÏ   ræ   r§   r¨   r€  rk  rf   rï  rë  r½   r˜   rJ  rZ   rZ   r[   r–    sb    
ÿÿüûÿÿü
ÿþýüÿÿüûzGenericFixed.read_index_noderL   )r‘   r’   r`   c                 C  sJ   t  d|j ¡}| j | j||¡ t| j|ƒ}t|jƒ|j	_
|j|j	_dS )zwrite a 0-len array©rk   N)rV   r¢  rZ  rÅ   Úcreate_arrayr¿   rq  r^   rß  rr  r�  r  )rÏ   r‘   r’   Zarrræ   rZ   rZ   r[   Úwrite_array_emptyN  s
    zGenericFixed.write_array_emptyrK   zIndex | None)r‘   r£  r  r`   c                 C  sº  t |dd�}|| jv r&| j | j|¡ |jdk}d}t|jtƒrHtdƒ‚|s`t	|dƒr`|j
}d}d }| jd ur¦ttƒ�  tƒ j |j¡}W d   ƒ n1 sœ0    Y  |d urì|sÜ| jj| j|||j| jd�}||d d …< n|  ||¡ �nº|jjtjk�rdtj|dd�}	|�rn,|	d	k�rn t|	||f }
tj|
ttƒ d
� | j | j|tƒ  ¡ ¡}|  |¡ �nBt !|jd¡�r¦| j "| j|| #d¡¡ t$|jƒt%| j|ƒj&_'�n t|jt(ƒ�rø| j "| j||j)¡ t%| j|ƒ}t*|j+ƒ|j&_+d|jj,› d�|j&_'n®t !|jd¡�r2| j "| j|| #d¡¡ dt%| j|ƒj&_'ntt|t-ƒ�r€| j | j|tƒ  ¡ ¡}|  | .¡ ¡ t%| j|ƒ}t$|jƒ|j&_'n&|�r”|  ||¡ n| j "| j||¡ |t%| j|ƒj&_/d S )NT)Zextract_numpyr   Fz]Cannot store a category dtype in a HDF5 dataset that uses format="fixed". Use format="table".r�  )rÈ   ©Zskipnarõ  r  rÙ  rÚ  údatetime64[r(  r$  r@  )0r=   r¿   rÅ   r©  r&  rU   rß  r&   r±   rÖ  r�  rÍ   r   r®   r‡   ZAtomZ
from_dtypeZcreate_carrayr  r­  râ   rV   Zobject_r   Úinfer_dtypery   r  r  r   r   Zcreate_vlarrayÚ
ObjectAtomr–   ræ  r¬  Úviewr^   rq  rr  r�  r'   Úasi8r›  r¼  Úunitr9   Úto_numpyrŒ  )rÏ   r‘   r£  r  r’   Zempty_arrayrŒ  r,  ÚcaÚinferred_typer  Zvlarrræ   rZ   rZ   r[   rš  W  sp    

ÿ


.ÿ

ÿzGenericFixed.write_array)NN)NN)NN)NN)N)rã   r°  r±  r²  r,   r/   r}  r  r  r{  r³  r~  r�  r‰  rŠ  r´  r¥  ro  rp  r§  r‘  r—  rœ  r˜  r•  r–  r­  rš  rZ   rZ   rZ   r[   ry  9  s2   
1& ÿ ÿ ÿ7
 ÿry  c                      sV   e Zd ZU dZdgZded< edd„ ƒZddddd	œd
d„Zddœ‡ fdd„Z	‡  Z
S )r–  r‹  rf   rD   c              	   C  s.   zt | jjƒfW S  ttfy(   Y d S 0 d S ra   )rt   r¿   ra  rµ   r„   rÓ   rZ   rZ   r[   r  ½  s    zSeriesFixed.shapeNrŠ   r1   rx  c           	      C  s²   |   ||¡ | jd||d�}| jd||d�}zt||| jdd�}W nj ty¬ } zR| jdkr–tdƒr–t|ƒ 	d¡r–t
r–t||| jdtd	tjd
�d�}n‚ W Y d }~n
d }~0 0 |S )Nr˜   rt  ra  F)r˜   rf   r�  rÜ  rÝ  rÞ  rà  rá  )r˜   rf   r�  rß  )rŠ  r—  r‘  r1   rf   rç  rœ   r   r^   r¬  r   r2   rV   rè  )	rÏ   ru   r©   r§   r¨   r˜   ra  r‡  rJ  rZ   rZ   r[   r  Ä  s.    ÿþýüûzSeriesFixed.readr�   rÑ   c                   s<   t ƒ j|fi |¤Ž |  d|j¡ |  d|¡ |j| j_d S )Nr˜   ra  )r  r§  rœ  r˜   rš  rf   rï  rw  r  rZ   r[   r§  â  s    zSeriesFixed.write)NNNN)rã   r°  r±  r\  r{  r³  r´  r  r  r§  rW  rZ   rZ   r  r[   r–  ·  s   

    ûr–  c                      sZ   e Zd ZU ddgZded< eddœdd„ƒZdd	d	d
dœdd„Zddœ‡ fdd„Z‡  Z	S )ÚBlockManagerFixedrZ  Únblocksrh   zShape | NonerÑ   c                 C  s®   z”| j }d}t| jƒD ]8}t| jd|› d�ƒ}t|dd ƒ}|d ur||d 7 }q| jj}t|dd ƒ}|d ur‚t|d|d … ƒ}ng }| |¡ |W S  ty¨   Y d S 0 d S )Nr   ÚblockÚ_itemsr  rk   )	rZ  rY  r¹  rq  r¿   Zblock0_valuesrr   r–   r„   )rÏ   rZ  r  r¤  ræ   r  rZ   rZ   r[   r  î  s"    
zBlockManagerFixed.shapeNrŠ   r+   rx  c                 C  s\  |   ||¡ |  ¡  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ƒ rþt|tjƒrþt|dd�rþ| ttjd�¡}| |¡ q|t|ƒdk�rHt|ddd�}tƒ �r6| ¡ }|j|d	d�}|S t
|d |d d�S )Nr   )NNr0  rt  rº  r»  rR  rk   F©r©   r˜   r�  Tr®  )râ  )r0  r�  )r©   r�  ©r©   r˜   )rŠ  r_  Z_get_block_manager_axisrY  rZ  r—  r–   r¹  r‘  r_  r+   r�  r   rU   rV   rã  r   rQ  r2   rè  rt   r4   r   r�  rd  )rÏ   ru   r©   r§   r¨   Zselect_axisrK  r¤  r  r  Úaxr  ÚdfsÚ	blk_itemsra  ÚdfÚoutrZ   rZ   r[   r  	  s:    ÿ
þ
ýzBlockManagerFixed.readr�   c                   sè   t ƒ j|fi |¤Ž t|jtƒr*| d¡}|j}| ¡ s@| ¡ }|j| j	_t
|jƒD ]0\}}|dkrr|jsrtdƒ‚|  d|› �|¡ qTt|jƒ| j	_t
|jƒD ]D\}}|j |j¡}| jd|› d�|j|d� |  d|› d�|¡ qžd S )Nrº  r   z/Columns index has to be unique for fixed formatr0  rR  )r  r»  )r  r§  rU   Ú_mgrr?   Ú_as_managerZis_consolidatedZconsolidaterZ  rï  r¡  rK  Z	is_uniquer®   rœ  rt   Úblocksr¹  r  r`  Úmgr_locsrš  ra  )rÏ   r£  r½   r€  r¤  r¾  ÚblkrÀ  r  rZ   r[   r§  6  s     

zBlockManagerFixed.write)NNNN)
rã   r°  r±  r{  r³  r´  r  r  r§  rW  rZ   rZ   r  r[   r¸  é  s   
    û-r¸  c                   @  s   e Zd ZdZeZdS )r—  rŒ  N)rã   r°  r±  r\  r+   r_  rZ   rZ   rZ   r[   r—  P  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ddddddddddœ
‡ fdd„Z	e
ddœdd„ƒZddœdd„Zdd œd!d"„Zddœd#d$„Ze
d%dœd&d'„ƒZd(d)d*œd+d,„Ze
d-dœd.d/„ƒZe
d%dœd0d1„ƒZe
d2d3„ ƒZe
d4d5„ ƒZe
d6d7„ ƒZe
d8d9„ ƒZe
d:dœd;d<„ƒZe
d-dœd=d>„ƒZe
d%dœd?d@„ƒZe
dAdœdBdC„ƒZdDdœdEdF„ZdGdH„ ZdIdœdJdK„ZdddLœdMdN„ZddOddPœdQdR„ZddSœdTdU„Z ddœdVdW„Z!ddœdXdY„Z"d‚ddœdZd[„Z#ddœd\d]„Z$e%d^d_„ ƒZ&dƒddd`œdadb„Z'd„dcdcdddeœdfdg„Z(e)d%dhœdidj„ƒZ*dkdl„ Z+d…dmd%dnœdodp„Z,e-dmd%dqœdrds„ƒZ.d†dtdmduœdvdw„Z/dcd%dcdDdxœdydz„Z0d‡dcdcd{œd|d}„Z1dˆddcdcd~œ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
    Z
wide_tabler{   r^   r]  rˆ  rk   zint | list[Hashable]r¢  Trr   rÁ  Nr�   r¤   rJ   r]   zlist[IndexCol] | Nonez list[tuple[AxisInt, Any]] | Nonezlist[DataCol] | Nonezlist | Nonezdict | Noner�   )
rÄ   r¿   r_   rœ   Ú
index_axesr,  Úvalues_axesr›   r…  r`   c                   sP   t ƒ j||||d� |pg | _|p$g | _|p.g | _|p8g | _|	pBi | _|
| _d S )Nr�  )r  rÐ   rÈ  r,  rÉ  r›   r…  r�   )rÏ   rÄ   r¿   r_   rœ   rÈ  r,  rÉ  r›   r…  r�   r  rZ   r[   rÐ   u  s    




zTable.__init__rÑ   c                 C  s   | j  d¡d S )NÚ_r   )rˆ  r«  rÓ   rZ   rZ   r[   Útable_type_shortŠ  s    zTable.table_type_shortc                 C  s¦   |   ¡  t| jƒrd | j¡nd}d|› d�}d}| jrZd dd„ | jD ƒ¡}d|› d�}d d	d„ | jD ƒ¡}| jd
›|› d| j› d| j	› d| j
› d|› d|› d�S )rg  rÆ  r|  z,dc->[r(  rf  c                 S  s   g | ]}t |ƒ‘qS rZ   ©r^   r)  rZ   rZ   r[   rq   –  rø   z"Table.__repr__.<locals>.<listcomp>ri  c                 S  s   g | ]
}|j ‘qS rZ   re   r  rZ   rZ   r[   rq   ™  rø   rj  z (typ->z,nrows->z,ncols->z,indexers->[rk  )r  rt   r›   rÉ  rc  rb  rÈ  rn  rË  r  Úncols)rÏ   Zjdcrf  ÚverZjverZjindex_axesrZ   rZ   r[   rì   Ž  s(    ÿÿþþþÿzTable.__repr__)r  c                 C  s"   | j D ]}||jkr|  S qdS )zreturn the axis for cN)rK  rf   )rÏ   r  rˆ   rZ   rZ   r[   rÛ      s    


zTable.__getitem__c              
   C  sô   |du rdS |j | j kr2td|j › d| j › d�ƒ‚dD ]¸}t| |dƒ}t||dƒ}||kr6t|ƒD ]n\}}|| }||krb|dkr´|j|jkr´td|jd › d	|j› d
|j› d�ƒ‚td|› d|› d|› d�ƒ‚qbtd|› d|› d|› d�ƒ‚q6dS )z"validate against an existing tableNz'incompatible table_type with existing [r  r(  )rÈ  r,  rÉ  rÉ  úCannot serialize the column [r   z%] because its data contents are not [z] but [ú] object dtypezinvalid combination of [z] on appending data [z] vs current table [)rˆ  rµ   rq  r¡  rk  r®   ra  rF  )rÏ   rÎ  r  ÚsvÚovr¤  ÚsaxZoaxrZ   rZ   r[   rJ  §  sJ    ÿÿÿÿþÿÿÿÿÿÿ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)rU   r¢  rr   rÓ   rZ   rZ   r[   Úis_multi_indexÎ  s    zTable.is_multi_indexr‰   z tuple[DataFrame, list[Hashable]])r£  r`   c              
   C  s`   t  |jj¡}z| ¡ }W n. tyH } ztdƒ|‚W Y d}~n
d}~0 0 t|tƒsXJ ‚||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)rG  Zfill_missing_namesr˜   r£  Zreset_indexr®   rU   r+   )rÏ   r£  r¢  Z	reset_objrJ  rZ   rZ   r[   Úvalidate_multiindexÓ  s    ÿþzTable.validate_multiindexrh   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 r+  )rô  r  ©rm   r¤  rZ   rZ   r[   rq   ç  rø   z(Table.nrows_expected.<locals>.<listcomp>)rV   r©  rÈ  rÓ   rZ   rZ   r[   Únrows_expectedä  s    zTable.nrows_expectedc                 C  s
   d| j v S )zhas this table been createdr{   r¨  rÓ   rZ   rZ   r[   r¥  é  s    zTable.is_existsc                 C  s   t | jdd ƒS ©Nr{   ©rq  r¿   rÓ   rZ   rZ   r[   rq  î  s    zTable.storablec                 C  s   | j S )z,return the table group (this is my storable))rq  rÓ   rZ   rZ   r[   r{   ò  s    zTable.tablec                 C  s   | j jS ra   )r{   rß  rÓ   rZ   rZ   r[   rß  ÷  s    zTable.dtypec                 C  s   | j jS ra   rð  rÓ   rZ   rZ   r[   rñ  û  s    zTable.descriptionzitertools.chain[IndexCol]c                 C  s   t  | j| j¡S ra   )r7  r8  rÈ  rÉ  rÓ   rZ   rZ   r[   rK  ÿ  s    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 ra   )rt   ra  r  rZ   rZ   r[   rR    rø   zTable.ncols.<locals>.<genexpr>)ÚsumrÉ  rÓ   rZ   rZ   r[   rÍ    s    zTable.ncolsc                 C  s   dS r  rZ   rÓ   rZ   rZ   r[   Úis_transposed  s    zTable.is_transposedz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 r+  re  r  rZ   rZ   r[   rq     rø   z*Table.data_orientation.<locals>.<listcomp>c                 S  s   g | ]}t |jƒ‘qS rZ   )rh   r0  r  rZ   rZ   r[   rq     rø   )rs   r7  r8  r,  rÈ  rÓ   rZ   rZ   r[   Údata_orientation  s    þÿzTable.data_orientationz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   rk   c                 S  s   g | ]}|j |f‘qS rZ   ©r¾  r  rZ   rZ   r[   rq     rø   z$Table.queryables.<locals>.<listcomp>c                   s   g | ]\}}ˆ | d f‘qS ra   rZ   )rm   r0  ra  )Ú
axis_namesrZ   r[   rq     rø   c                   s&   g | ]}|j tˆ jƒv r|j|f‘qS rZ   )rf   rX  r›   r¾  rE  rÓ   rZ   r[   rq     s   )rÈ  r,  rÉ  rM  )rÏ   Zd1Zd2Zd3rZ   )rß  rÏ   r[   Ú
queryables  s    

ÿzTable.queryablesc                 C  s   dd„ | j D ƒS )zreturn a list of my index colsc                 S  s   g | ]}|j |jf‘qS rZ   )r0  r¾  rÖ  rZ   rZ   r[   rq   '  rø   z$Table.index_cols.<locals>.<listcomp>©rÈ  rÓ   rZ   rZ   r[   Ú
index_cols$  s    zTable.index_colsró   c                 C  s   dd„ | j D ƒS )zreturn a list of my values colsc                 S  s   g | ]
}|j ‘qS rZ   rÞ  rÖ  rZ   rZ   r[   rq   +  rø   z%Table.values_cols.<locals>.<listcomp>)rÉ  rÓ   rZ   rZ   r[   Úvalues_cols)  s    zTable.values_colsrÜ   c                 C  s   | j j}|› d|› d�S )z)return the metadata pathname for this keyz/meta/z/metarm  r  rZ   rZ   r[   Ú_get_metadata_path-  s    zTable._get_metadata_pathr×  )r‘   ra  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
        FrK  r{   )r—   r_   rœ   r�   N)rÄ   r£   rä  r1   r_   rœ   r�   )rÏ   r‘   ra  rZ   rZ   r[   rþ  2  s    	
úzTable.write_metadatarØ   c                 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)rq  r¿   rÄ   rº   rä  rÚ   rZ   rZ   r[   r  D  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ï  râ  rã  r,  r›   r�   r_   rœ   r¢  r…  rÓ   rZ   rZ   r[   ro  J  s    





zTable.set_attrsc                 C  s°   t | jddƒpg | _t | jddƒp$g | _t | jddƒp8i | _t | jddƒ| _tt | jddƒƒ| _tt | jddƒƒ| _	t | jd	dƒp„g | _
d
d„ | jD ƒ| _dd„ | jD ƒ| _dS )r‹  r,  Nr›   r…  r�   r_   rœ   r�   r¢  c                 S  s   g | ]}|j r|‘qS rZ   ©r¹  r  rZ   rZ   r[   rq   `  rø   z#Table.get_attrs.<locals>.<listcomp>c                 S  s   g | ]}|j s|‘qS rZ   rå  r  rZ   rZ   r[   rq   a  rø   )rq  rï  r,  r›   r…  r�   rd   r_   r\   rœ   r¢  Ú
indexablesrÈ  rÉ  rÓ   rZ   rZ   r[   rp  W  s    zTable.get_attrsc                 C  s>   |dur:| j r:td dd„ | jD ƒ¡ }tj|ttƒ d� dS )rr  Nrf  c                 S  s   g | ]}t |ƒ‘qS rZ   rÌ  r)  rZ   rZ   r[   rq   g  rø   z*Table.validate_version.<locals>.<listcomp>r  )rc  rw   rÉ  rb  r  r  r   r   )rÏ   ru   r  rZ   rZ   r[   rs  c  s    ýzTable.validate_versionc                 C  sR   |du rdS t |tƒsdS |  ¡ }|D ]&}|dkr4q&||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
        Nra  zmin_itemsize has the key [z%] which is not an axis or data_column)rU   rM  rà  r®   )rÏ   r™   Úqr'  rZ   rZ   r[   Úvalidate_min_itemsizen  s    

ÿzTable.validate_min_itemsizec                   sÔ   g }ˆj ‰ˆjj‰tˆjjƒD ]j\}\}}tˆ|ƒ}ˆ |¡}|durJd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 existNr  rÄ  )rf   r0  rÀ  rk  r¿  r{   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Ä  r  r  )
rf   r¾  ra  rk  rÀ  r¿  r{   rÁ   rÁ  rß  )
rU   r^   r  rX  rq  Ú_maybe_adjust_namerb  r  r  r{   )r¤  r  Úklassr,  Úadj_namera  rß  rk  ÚmdrÁ   r£  )Úbase_posrf  ÚdescrÏ   Útable_attrsrZ   r[   r|   ¦  s0    

özTable.indexables.<locals>.fc                   s   g | ]\}}ˆ ||ƒ‘qS rZ   rZ   )rm   r¤  r  )r|   rZ   r[   rq   Ë  rø   z$Table.indexables.<locals>.<listcomp>)rñ  r{   rï  r¡  râ  rq  r  r¸  r–   rX  r›   rt   r\  rã  )rÏ   Ú_indexablesr¤  r0  rf   r,  rì  rÁ   rÅ  rk  Ú	index_colrZ   )rí  rf  rî  r|   rÏ   rï  r[   ræ  ƒ  s2    


ø

% zTable.indexablesr0  c              	   C  sV  |   ¡ sdS |du rdS |du s(|du r8dd„ | jD ƒ}t|ttfƒsL|g}i }|dur`||d< |durp||d< | j}|D ]Ö}t|j|dƒ}|du�r"|jrò|j	}|j
}	|j}
|durÈ|
|krÈ| ¡  n|
|d< |durê|	|krê| ¡  n|	|d< |j�sP|j d¡�rtd	ƒ‚|jf i |¤Ž qz|| jd
 d v rztd|› d|› d|› d�ƒ‚qzd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  s   g | ]}|j r|j‘qS rZ   )rº  r¾  r  rZ   rZ   r[   rq   ô  rø   z&Table.create_index.<locals>.<listcomp>rj  rk  Ú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   rk   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.)r  rK  rU   rs   rr   r{   rq  rQ  r~  r˜   rj  rk  Zremove_indexrâ   ry  rµ   rl  r,  r„   )rÏ   r©   rj  rk  Úkwr{   r  rU  r˜   Zcur_optlevelZcur_kindrZ   rZ   r[   rl  Ï  sR    


ÿÿþÿzTable.create_indexrŠ   z9list[tuple[np.ndarray, np.ndarray] | tuple[Index, Index]]rx  c           	      C  sZ   t | |||d�}| ¡ }g }| jD ]2}| | 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]]
        r  rM  )
Ú	Selectionrº   rK  r  r…  rì  r�   r_   rœ   r–   )	rÏ   ru   r§   r¨   Ú	selectionra  r·  rˆ   ÚresrZ   rZ   r[   Ú
_read_axes%  s    
üzTable._read_axes©rŒ  c                 C  s   |S )zreturn the data for this objrZ   ©r¡  r£  rŒ  rZ   rZ   r[   Ú
get_objectG  s    zTable.get_objectc                   s²   t |ƒsg S |d \}‰ | j |i ¡}| d¡dkrL|rLtd|› d|› �ƒ‚|du r^tˆ ƒ}n|du rjg }t|tƒr t|ƒ‰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í  rZ   r&  )Úexisting_data_columnsrZ   r[   rq   h  s   þz/Table.validate_data_columns.<locals>.<listcomp>c                   s   g | ]}|ˆ v r|‘qS rZ   rZ   )rm   r  )Úaxis_labelsrZ   r[   rq   p  rø   )
rt   r…  rÙ   r®   rr   rU   rM  rX  r\  rý   )rÏ   r›   r™   r,  r0  r…  rZ   )rü  rû  r[   Úvalidate_data_columnsL  s.    ÿÿ


þÿ	zTable.validate_data_columnsr+   )r£  rJ  c           /        s´  t ˆtƒs,| jj}td|› dtˆƒ› d�ƒ‚ˆ du r:dg‰ ‡fdd„ˆ D ƒ‰ |  ¡ rzd}d	d„ | jD ƒ‰ t| j	ƒ}| j
}nd
}| j}	| jdks’J ‚tˆ ƒ| jd kr¬tdƒ‚g }
|du r¼d}t‡ fdd„dD ƒƒ}ˆj| }t|ƒ}|�rHt|
ƒ}| j| d }tt |¡t |¡ddd��sHtt t|ƒ¡t t|ƒ¡ddd��rH|}|	 |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}|�rÒt|ƒdk�rÒ|d |v �rÒt+}|d }|du �sÒt |t,ƒ�sÒtdƒ‚|�r4|�r4z| j'| }W nD t-t.f�y0 }  z&td|› d| j'› d�ƒ| ‚W Y d} ~ n
d} ~ 0 0 nd}|�pFd|› �}!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=¡ >¡ }(nt |j5t?ƒ�röt,|j5ƒ}'t@|"ƒ\}*}+||#|!t|ƒ|$||%|&|)|'|(|+|*d�},|,  |	¡ | |,¡ |d7 }�qpdd„ |D ƒ}-t| ƒ| jA| j| j| j||
||-|	|d�
}.tB| dƒ�r�| jC|._C|. D|¡ |�r°|�r°|. E| ¡ |.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                   s   g | ]}ˆ   |¡‘qS rZ   )Ú_get_axis_numberr  )r£  rZ   r[   rq   ž  rø   z&Table._create_axes.<locals>.<listcomp>Tc                 S  s   g | ]
}|j ‘qS rZ   rS  r  rZ   rZ   r[   rq   £  rø   Fra  rk   z<currently only support ndim-1 indexers in an AppendableTablerè  c                 3  s   | ]}|ˆ vr|V  qd S ra   rZ   r)  )rK  rZ   r[   rR  »  rø   z%Table._create_axes.<locals>.<genexpr>rÝ  r  r£  râ   rY  zIncompatible appended table [z]with existing table [Zvalues_block_)Úexisting_colr™   r�   r_   rœ   r©   r¼  r  )rf   r¾  ra  r¿  rÀ  rk  r¼  re  rÁ   rÁ  rß  r€  c                 S  s   g | ]}|j r|j‘qS rZ   )rº  rf   )rm   rò  rZ   rZ   r[   rq   K  rø   )
rÄ   r¿   r_   rœ   rÈ  r,  rÉ  r›   r…  r�   r¢  )FrU   r+   r¿   rÂ   rµ   râ   r  rÈ  rr   r›   r�   r…  rZ  rt   r®   rW  rK  r,  r*   rV   r<   r^  r  r£  rã   r–   Z_get_axis_namer™  r_   rœ   r0  rÂ  r  r÷  Ú_reindex_axisrý  rú  r2  Ú_get_blocks_and_itemsrÉ  r¡  r9  r  rX  r^   Ú
IndexErrorrá   Ú_maybe_convert_for_string_atomra  ré  rb  r-  r  rß  rf   rq  r›  r¼  r&   re  rN  rI  rO  r2   r  rÄ   rÖ  r¢  rè  rJ  )/rÏ   rK  r£  rJ  r�   r›   r™   r¿   Útable_existsZnew_infoÚnew_non_index_axesr
  rˆ   Zappend_axisZindexerZ
exist_axisr…  Ú	axis_nameZ	new_indexZnew_index_axesÚjrŒ  rŒ  rÅ  rÀ  Zvaxesr¤  rÇ  Úb_itemsrê  rf   rÿ  rJ  Únew_nameÚdata_convertedrë  r¿  rk  r¼  rÁ   rÁ  re  r€  r   rò  ZdcsZ	new_tablerZ   )rK  r£  r[   Ú_create_axesr  s0    
ÿÿ
ÿ
üü





ÿÿ"ÿÿýø



ô

ö

zTable._create_axes)rŒ  r  c                 C  s�  t | jtƒr|  d¡} dd„ }| j}tt|ƒ}t|jƒ}||ƒ}t|ƒrÒ|d \}	}
t	|
ƒ 
t	|ƒ¡}| j||	d�j}tt|ƒ}t|jƒ}||ƒ}|D ]:}| j|g|	d�j}tt|ƒ}| |j¡ | ||ƒ¡ q–|�rˆdd„ t||ƒD ƒ}g }g }|D ]†}t|jƒ}z&| |¡\}}| |¡ | |¡ W qø ttf�y| } z2d d	d
„ |D ƒ¡}td|› d�ƒ|‚W Y d }~qød }~0 0 qø|}|}||fS )Nrº  c                   s   ‡ fdd„ˆ j D ƒS )Nc                   s   g | ]}ˆ j  |j¡‘qS rZ   )r  r`  rÆ  )rm   rÇ  ©ÚmgrrZ   r[   rq   s  rø   zFTable._get_blocks_and_items.<locals>.get_blk_items.<locals>.<listcomp>)rÅ  r  rZ   r  r[   Úget_blk_itemsr  s    z2Table._get_blocks_and_items.<locals>.get_blk_itemsr   rS  c                 S  s"   i | ]\}}t | ¡ ƒ||f“qS rZ   )rs   Útolist)rm   Úbr  rZ   rZ   r[   rV  ‘  s   ÿz/Table._get_blocks_and_items.<locals>.<dictcomp>rÆ  c                 S  s   g | ]}t |ƒ‘qS rZ   rh  )rm   ÚitemrZ   rZ   r[   rq   ž  rø   z/Table._get_blocks_and_items.<locals>.<listcomp>z+cannot match existing table structure for [z] on appending data)rU   rÃ  r?   rÄ  r   r@   rr   rÅ  rt   r-   r]  rd  r\  r9  rs   ra  r<  r–   r  rá   rÉ  r®   )rŒ  r  r  rÉ  r›   r  r  rÅ  rÀ  r0  rü  Z
new_labelsr  Zby_itemsZ
new_blocksZnew_blk_itemsZear  r  r  rJ  ZjitemsrZ   rZ   r[   r  d  sR    





þ


ÿýzTable._get_blocks_and_itemsrô  )rõ  r`   c                   sª   |durt |ƒ}|durNˆjrNtˆjt ƒs.J ‚ˆjD ]}||vr4| d|¡ q4ˆjD ]$\}}tˆ |||ƒ‰ ‡ ‡fdd„}qT|jdur¦|j ¡ D ]\}}	}
|||
|	ƒ‰ qŽˆ S )zprocess axes filtersNr   c                   sÌ   ˆ j D ]°}ˆ  |¡}ˆ  |¡}|d us*J ‚| |krfˆjrH| tˆjƒ¡}|||ƒ}ˆ j|d�|   S | |v rtt	ˆ | ƒj
ƒ}t|ƒ}tˆ tƒr˜d| }|||ƒ}ˆ j|d�|   S qtd| › d�ƒ‚d S )NrS  rk   zcannot find the field [z] for filtering!)Z_AXIS_ORDERSrþ  Ú	_get_axisrÔ  Úunionr-   r¢  rc  r>   rq  ra  rU   r+   r®   )ÚfieldÚfiltÚopr  Zaxis_numberZaxis_valuesZtakersra  ©r£  rÏ   rZ   r[   Úprocess_filter¹  s"    





z*Table.process_axes.<locals>.process_filter)	rr   rÔ  rU   r¢  Úinsertr,  r   Úfilterr—   )rÏ   r£  rõ  r©   r÷   r0  Úlabelsr  r  r  r  rZ   r  r[   Úprocess_axes¨  s    
 
zTable.process_axes)r”   rÇ   rL  r`   c                 C  s‚   |du rt | jdƒ}d|dœ}dd„ | jD ƒ|d< |rj|du rH| jpFd}tƒ j|||pZ| jd	�}||d
< n| jdur~| j|d
< |S )z:create the description of the table from the axes & valuesNi'  r{   )rf   rL  c                 S  s   i | ]}|j |j“qS rZ   )r¾  r¿  r  rZ   rZ   r[   rV  î  rø   z,Table.create_description.<locals>.<dictcomp>rñ  é	   )r”   r•   rÇ   rÈ   )Úmaxr×  rK  rÊ   r‡   r  rÌ   rÍ   )rÏ   r•   r”   rÇ   rL  rN  rÈ   rZ   rZ   r[   Úcreate_descriptionß  s     	

ý


zTable.create_descriptionrt  c           
      C  s�   |   |¡ |  ¡ sdS t| |||d�}| ¡ }|jdurˆ|j ¡ D ]D\}}}| j|| ¡ | ¡ d d�}	|||	j	|| ¡   |ƒj
 }qBt|ƒS )zf
        select coordinates (row numbers) from a table; return the
        coordinates object
        Fr  Nrk   rt  )rs  r  rô  Úselect_coordsr  r—   r$  r¶  r  Úilocra  r-   )
rÏ   ru   r§   r¨   rõ  Zcoordsr  r  r  r€  rZ   rZ   r[   r  þ  s    

ÿ zTable.read_coordinatesr#  c           
      C  sØ   |   ¡  |  ¡ sdS |dur$tdƒ‚| jD ]˜}||jkr*|jsNtd|› d�ƒ‚t| jj	|ƒ}| 
| j¡ |j|||… | j| j| jd�}t|d |jƒ}t| jj|› d�dƒ}	t||d|	d	�  S q*td|› d
�ƒ‚dS )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 indexablerM  rk   r  )rf   r�  rß  z] not found in the table)rs  r  rµ   rK  rf   rº  r®   rq  r{   rQ  r  r…  rì  r�   r_   rœ   ré  r¼  rï  r1   rá   )
rÏ   r"  ru   r§   r¨   rˆ   r  Z
col_valuesZcvsrß  rZ   rZ   r[   r$    s.    


ÿ
üzTable.read_column)Nr�   NNNNNN)N)NNN)NN)TNNN)N)NNN)NNN)4rã   r°  r±  r²  r\  r]  r³  r¢  r:  rÐ   r´  rË  rì   rÛ   rJ  rÔ  rÕ  r×  r¥  rq  r{   rß  rñ  rK  rÍ  rÛ  rÜ  rà  râ  rã  rä  rþ  r  ro  rp  rs  rè  r   ræ  rl  r÷  rV  rú  rý  r  Ústaticmethodr  r  r  r  r$  rW  rZ   rZ   r  r[   rû   U  sž   
        õ&'



	
L ÿW ÿ"*    ù sC7  ÿ   ûrû   c                   @  s4   e Zd ZdZdZddddœdd„Zd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Š   rt  c                 C  s   t dƒ‚dS )z[
        read the indices and the indexing array, calculate offset rows and return
        z!WORMTable needs to implement readNru  rv  rZ   rZ   r[   r  O  s    
zWORMTable.readr�   rÑ   c                 K  s   t dƒ‚dS )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 writeNru  rw  rZ   rZ   r[   r§  [  s    zWORMTable.write)NNNN)rã   r°  r±  r²  rˆ  r  r§  rZ   rZ   rZ   r[   rž  F  s       ûrž  c                   @  sh   e Zd ZdZdZddddddd	œd
d„Zdddddœdd„Zddddddœdd„Zddddœdd„ZdS )rù  ú(support the new appendable table formatsZ
appendableNFTr‹   rŠ   r�   )r–   r«   rš   r?  r`   c                 C  s¶   |s| j r| j | jd¡ | j||||||d�}|jD ]}| ¡  q6|j s‚|j||||	d�}| ¡  ||d< |jj	|jfi |¤Ž |j
|j_
|jD ]}| ||¡ q’|j||
d� d S )Nr{   )rK  r£  rJ  r™   r�   r›   )r•   r”   rÇ   rL  r?  )rš   )r¥  rÅ   r©  r¿   r  rK  rø  r  ro  Zcreate_tabler…  rï  r   Ú
write_data)rÏ   r£  rK  r–   r•   r”   rÇ   r™   r«   rL  rš   r�   r›   r?  r{   rˆ   ÚoptionsrZ   rZ   r[   r§  j  s4    
ú	

ü

zAppendableTable.write)r«   rš   r`   c                   sÈ  | j j}| j}g }|rT| jD ]6}t|jƒjdd�}t|tj	ƒr| 
|jddd�¡ qt|ƒrˆ|d }|dd… D ]}||@ }qp| ¡ }nd}dd	„ | jD ƒ}	t|	ƒ}
|
dks´J |
ƒ‚d
d	„ | jD ƒ}dd	„ |D ƒ}g }t|ƒD ]2\}}|f| j ||
|   j }| 
| |¡¡ qÞ|du �r d}tjt||ƒ| j d�}|| d }t|ƒD ]x}|| ‰t|d | |ƒ‰ ˆˆ k�rx �qÄ| j|‡ ‡fdd	„|	D ƒ|du�r¦|ˆˆ … nd‡ ‡fdd	„|D ƒd� �qJdS )z`
        we form the data into a 2-d including indexes,values,mask write chunk-by-chunk
        r   rS  Úu1FrK  rk   Nc                 S  s   g | ]
}|j ‘qS rZ   )rô  r  rZ   rZ   r[   rq   À  rø   z.AppendableTable.write_data.<locals>.<listcomp>c                 S  s   g | ]}|  ¡ ‘qS rZ   )rî  r  rZ   rZ   r[   rq   Æ  rø   c              	   S  s,   g | ]$}|  t t |j¡|jd  ¡¡‘qS r«  )Z	transposerV   ZrollÚarangerZ  rE  rZ   rZ   r[   rq   Ç  rø   rµ  rB  c                   s   g | ]}|ˆˆ … ‘qS rZ   rZ   r  ©Zend_iZstart_irZ   r[   rq   Û  rø   c                   s   g | ]}|ˆˆ … ‘qS rZ   rZ   rE  r(  rZ   r[   rq   Ý  rø   )ÚindexesrU  ra  )rß  r£  r×  rÉ  r5   r€  rO  rU   rV   rã  r–   rQ  rt   rO  rÈ  r¡  r  Úreshaper¢  r¶  rY  Úwrite_data_chunk)rÏ   r«   rš   r£  r  Úmasksrˆ   rU  r$  r)  Únindexesra  Úbvaluesr¤  rU  Z	new_shapeÚrowsÚchunksrZ   r(  r[   r$  ¥  sL    




üzAppendableTable.write_datar×  zlist[np.ndarray]znpt.NDArray[np.bool_] | None)r/  r)  rU  ra  r`   c                 C  sä   |D ]}t  |j¡s dS q|d jd }|t|ƒkrFt j|| jd�}| jj}t|ƒ}t|ƒD ]\}	}
|
|||	 < q^t|ƒD ]\}	}||||	|  < q||durÂ| ¡ j	t
dd� }| ¡ sÂ|| }t|ƒrà| j |¡ | j ¡  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   rB  FrK  )rV   r©  r  rt   r¢  rß  r£  r¡  rO  rQ  r‹   rO  r{   r–   r  )rÏ   r/  r)  rU  ra  rU  r  r£  r-  r¤  r
  r$  rZ   rZ   r[   r+  à  s&    z AppendableTable.write_data_chunkrt  c                 C  sf  |d u st |ƒsf|d u r:|d u r:| j}| jj| jdd� n(|d u rH| j}| jj||d�}| j ¡  |S |  ¡ srd S | j}t	| |||d�}| 
¡ }t|dd� ¡ }t |ƒ}	|	�rb| ¡ }
t|
|
dk jƒ}t |ƒsÖdg}|d |	krì| |	¡ |d dk�r| dd¡ | ¡ }t|ƒD ]@}| t||ƒ¡}|j||jd  ||jd  d d� |}�q| j ¡  |	S )	NTrC  rt  FrK  rk   r   rH  )rt   r  rÅ   r©  r¿   r{   Zremove_rowsr  r  rô  r   r1   Zsort_valuesÚdiffrr   r˜   r–   r  r<  Úreversedr`  rY  )rÏ   ru   r§   r¨   r  r{   rõ  ra  Zsorted_seriesÚlnr1  r·   Zpgr   r/  rZ   rZ   r[   rI    sD    

ÿ
zAppendableTable.delete)NFNNNNNNFNNT)F)NNN)	rã   r°  r±  r²  rˆ  r§  r$  r+  rI  rZ   rZ   rZ   r[   rù  d  s$               ò;;,rù  c                   @  s`   e Zd ZU dZdZdZdZeZde	d< e
ddœd	d
„ƒZeddœdd„ƒZddddœdd„ZdS )rœ  r#  r‰  r“  ra  r^  r_  r‹   rÑ   c                 C  s   | j d jdkS )Nr   rk   )rÈ  r0  rÓ   rZ   rZ   r[   rÛ  O  s    z"AppendableFrameTable.is_transposedrø  c                 C  s   |r
|j }|S )zthese are written transposed)r�  rù  rZ   rZ   r[   rú  S  s    zAppendableFrameTable.get_objectNrŠ   rt  c                   s   ˆ   |¡ ˆ  ¡ sd S ˆ j|||d�}tˆ jƒrHˆ j ˆ jd d i ¡ni }‡ fdd„tˆ jƒD ƒ}t|ƒdkstJ ‚|d }|| d }	g }
tˆ jƒD �]\}}|ˆ j	vr¬q–|| \}}| d¡dkrÐt
|ƒ}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�rlt|tjƒ�rl| d|jd f¡}t|tjƒ�rzt|j||dd�}W nt t�y } zZˆ jdk�rîtdƒ�rît|ƒ d¡�rît�rît|j||dtdtjd�d�}n‚ W Y d }~n
d }~0 0 n.t|t
ƒ�r$t|||d�}ntj |g||d�}t!ƒ �rL|j"j#dk�sn|j$|j"k %¡ �snJ |j$|j"fƒ‚|D ]8}tˆ j&j'|› d�d ƒ}|dv �rr||  (|¡||< �qr|
 )|¡ q–t|
ƒdk�rÐ|
d }nt*|
dd�}t+ˆ |||d�}ˆ j,|||d�}|S )Nr  r   c                   s"   g | ]\}}|ˆ j d  u r|‘qS r+  rá  )rm   r¤  r¾  rÓ   rZ   r[   rq   p  rø   z-AppendableFrameTable.read.<locals>.<listcomp>rk   râ   r.   r£  T©Zinplacerf   re   Fr¼  rÜ  rÝ  rÞ  rà  rá  )r©   r˜   r�  rß  r½  rL  r  )r^   rõ  rS  )rõ  r©   )-rs  r  r÷  rt   r,  r…  rÙ   r¡  rK  rÉ  r-   r.   Úfrom_tuplesÚ	set_namesrÛ  rq  r�  rZ  rU   rV   rã  r*  r  r+   rç  rœ   r   r^   r¬  r   r2   rè  Z_from_arraysr   rß  rk  ZdtypesrO  r{   rï  rQ  r–   r4   rô  r  )rÏ   ru   r©   r§   r¨   r‡  r…  ZindsÚindr˜   Úframesr¤  rˆ   Z
index_valsrô  rQ  r£  ra  Zindex_Zcols_rÁ  rJ  r"  rß  rõ  rZ   rÓ   r[   r  Z  sˆ    
ÿý



ÿþýüû"

zAppendableFrameTable.read)NNNN)rã   r°  r±  r²  r\  rˆ  rZ  r+   r_  r³  r´  rÛ  rV  rú  r  rZ   rZ   rZ   r[   rœ  G  s   
    ûrœ  c                      st   e Zd ZdZdZdZdZeZe	ddœdd„ƒZ
edd	œd
d„ƒZdddœ‡ fdd„Zdddddœ‡ fdd„Z‡  ZS )rš  r#  r�  r‘  ra  r‹   rÑ   c                 C  s   dS r  rZ   rÓ   rZ   rZ   r[   rÛ  É  s    z#AppendableSeriesTable.is_transposedrø  c                 C  s   |S ra   rZ   rù  rZ   rZ   r[   rú  Í  s    z AppendableSeriesTable.get_objectNr�   c                   s@   t |tƒs|jpd}| |¡}tƒ jf ||j ¡ dœ|¤Ž dS )ú+we are going to write this as a frame tablera  ©r£  r›   N)rU   r+   rf   Zto_framer  r§  r©   r  )rÏ   r£  r›   r½   rf   r  rZ   r[   r§  Ò  s    


zAppendableSeriesTable.writerŠ   r1   rx  c                   s�   | j }|d urB|rBt| jtƒs"J ‚| jD ]}||vr(| d|¡ q(tƒ j||||d�}|rj|j| jdd� |jd d …df }|j	dkrŒd |_	|S )Nr   r/  Tr4  ra  )
rÔ  rU   r¢  rr   r  r  r  Ú	set_indexr!  rf   )rÏ   ru   r©   r§   r¨   rÔ  r÷   rY   r  rZ   r[   r  Ù  s    

zAppendableSeriesTable.read)N)NNNN)rã   r°  r±  r²  r\  rˆ  rZ  r1   r_  r´  rÛ  rV  rú  r§  r  rW  rZ   rZ   r  r[   rš  Á  s   	    ûrš  c                      s.   e Zd ZdZdZdZddœ‡ fdd„Z‡  ZS )r›  r#  r�  r’  r�   rÑ   c                   sb   |j pd}|  |¡\}| _t| jtƒs*J ‚t| jƒ}| |¡ t|ƒ|_tƒ j	f d|i|¤Ž dS )r9  ra  r£  N)
rf   rÕ  r¢  rU   rr   r–   r-   r©   r  r§  )rÏ   r£  r½   rf   ZnewobjrQ  r  rZ   r[   r§  ù  s    



z AppendableMultiSeriesTable.write)rã   r°  r±  r²  r\  rˆ  r§  rW  rZ   rZ   r  r[   r›  ò  s   r›  c                   @  sp   e Zd ZU dZdZdZdZeZde	d< e
ddœd	d
„ƒZe
dd„ ƒZddœdd„Zedd„ ƒZddœdd„ZdS )r™  z:a table that read/writes the generic pytables table formatr‰  rŠ  ra  zlist[Hashable]r¢  r^   rÑ   c                 C  s   | j S ra   )r\  rÓ   rZ   rZ   r[   rn    s    zGenericTable.pandas_typec                 C  s   t | jdd ƒp| jS rØ  rÙ  rÓ   rZ   rZ   r[   rq    s    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  s   g | ]}|j r|‘qS rZ   rå  r  rZ   rZ   r[   rq     rø   z*GenericTable.get_attrs.<locals>.<listcomp>c                 S  s   g | ]}|j s|‘qS rZ   rå  r  rZ   rZ   r[   rq     rø   c                 S  s   g | ]
}|j ‘qS rZ   re   r  rZ   rZ   r[   rq     rø   )r,  r�   r¢  ræ  rÈ  rÉ  r›   rÓ   rZ   rZ   r[   rp    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ƒsZJ ‚t||ƒ}|  |¡}|durzdnd}t	|||g|| j||d�}	| 
|	¡ qD|S )z0create the indexables from the table descriptionr˜   Nr  r   )rf   r0  r{   rÁ   rÁ  )rf   rÀ  ra  r¿  r{   rÁ   rÁ  )rñ  r  r  r{   r¡  Z_v_namesrU   r^   rq  rZ  r–   )
rÏ   rN  rì  rÁ   rñ  rð  r¤  r÷   r,  rf  rZ   rZ   r[   ræ    s.    
ÿ

ù	zGenericTable.indexablesc                 K  s   t dƒ‚d S )Nz cannot write on an generic tableru  )rÏ   r½   rZ   rZ   r[   r§  C  s    zGenericTable.writeN)rã   r°  r±  r²  r\  rˆ  rZ  r+   r_  r³  r´  rn  rq  rp  r   ræ  r§  rZ   rZ   rZ   r[   r™    s   



#r™  c                      sf   e Zd ZdZdZeZdZe 	d¡Z
eddœdd„ƒZdd
dœ‡ fdd„Zddddœ‡ fdd„Z‡  ZS )r�  za frame with a multi-indexr”  ra  z^level_\d+$r^   rÑ   c                 C  s   dS )NZappendable_multirZ   rÓ   rZ   rZ   r[   rË  O  s    z*AppendableMultiFrameTable.table_type_shortNr�   c                   s|   |d u rg }n|du r |j  ¡ }|  |¡\}| _t| jtƒs@J ‚| jD ]}||vrF| d|¡ qFtƒ jf ||dœ|¤Ž d S )NTr   r:  )	r©   r  rÕ  r¢  rU   rr   r  r  r§  )rÏ   r£  r›   r½   r÷   r  rZ   r[   r§  T  s    

zAppendableMultiFrameTable.writerŠ   rt  c                   sD   t ƒ j||||d�}| ˆ j¡}|j ‡ fdd„|jjD ƒ¡|_|S )Nr/  c                   s    g | ]}ˆ j  |¡rd n|‘qS ra   )Ú
_re_levelsÚsearch)rm   rf   rÓ   rZ   r[   rq   l  rø   z2AppendableMultiFrameTable.read.<locals>.<listcomp>)r  r  r;  r¢  r˜   r6  r£  )rÏ   ru   r©   r§   r¨   rÁ  r  rÓ   r[   r  `  s    ÿzAppendableMultiFrameTable.read)N)NNNN)rã   r°  r±  r²  rˆ  r+   r_  rZ  ÚreÚcompiler<  r´  rË  r§  r  rW  rZ   rZ   r  r[   r�  G  s   
    ûr�  r+   rM   r-   )r£  r0  r  r`   c                 C  s¢   |   |¡}t|ƒ}|d ur"t|ƒ}|d u s4| |¡rB| |¡rB| S t| ¡ ƒ}|d urlt| ¡ ƒj|dd�}| |¡sžtd d ƒg| j }|||< | jt|ƒ } | S )NF)Úsort)	r  r>   ÚequalsÚuniquerb  ÚslicerZ  rc  rs   )r£  r0  r  rÎ  r¾  ZslicerrZ   rZ   r[   r   r  s    

r   r   zstr | tzinfo)r¼  r`   c                 C  s   t  | ¡}|S )z+for a tz-aware type, return an encoded zone)r   Zget_timezone)r¼  ÚzonerZ   rZ   r[   r›  Œ  s    
r›  znp.ndarray | Indexr,   )ra  r¼  r?  r`   c                 C  s   d S ra   rZ   ©ra  r¼  r?  rZ   rZ   r[   ré  ’  s    ré  r×  c                 C  s   d S ra   rZ   rE  rZ   rZ   r[   ré  ™  s    zstr | tzinfo | Noneznp.ndarray | DatetimeIndexc                 C  s’   t | tƒr0| jdu s"| j|ks"J ‚| jdur0| S |dur|t | tƒrJ| j}nd}|  ¡ } t|ƒ}t| |d�} |  d¡ |¡} n|rŽt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
    Nre   rƒ  úM8[ns]rB  )
rU   r,   r¼  rf   rO  r\   r…  r†  rV   rN  )ra  r¼  r?  rf   rZ   rZ   r[   ré  ž  s    


)rf   r˜   r_   rœ   r`   c              
   C  s‚  t | tƒsJ ‚|j}t|ƒ\}}t|ƒ}t |¡}t |j	d¡sTt
|j	ƒsTt|j	ƒrzt| |||t|dd ƒt|dd ƒ|d�S t |tƒrŒtdƒ‚tj|dd�}	t |¡}
|	dkrÞt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 �r2t| ||||d�S t |tjƒ�rL|j	tk�sPJ ‚|dk�sbJ |ƒ‚tƒ  ¡ }t| ||||d�S d S )NÚiur»  r¼  )ra  rk  r¿  r»  r¼  r½  zMultiIndex not supported here!Fr®  r   c                 S  s   g | ]}|  ¡ ‘qS rZ   )Ú	toordinalrE  rZ   rZ   r[   rq   ë  rø   z"_convert_index.<locals>.<listcomp>rB  )r½  rõ  )ÚintegerZfloating)ra  rk  r¿  r½  rÌ  )rU   r^   rf   r  r  rX  r-  r   ræ  rß  r%   r!   r¸  rq  r.   rµ   r°  rV   rN  Zint32r‡   Z	Time32ColÚ_convert_string_arrayrÃ  rö  rã  rÌ  r±  )rf   r˜   r_   rœ   r½  rT  r   rk  r,  r·  ra  rÃ  rZ   rZ   r[   r™  Å  s^    
ÿþý

ù


ÿ

û

ÿ
r™  )rk  r_   rœ   r`   c                 C  sè   |  d¡r,|dkrt| ƒ}qät|  |¡ƒ}n¸|dkr>t| ƒ}n¦|dkr�ztjdd„ | D ƒtd�}W qä tyŒ   tjdd„ | D ƒtd�}Y qä0 nT|dv r¤t | ¡}n@|d	v r¾t| d ||d
�}n&|dkrÖt | d ¡}ntd|› �ƒ‚|S )Nr=  r@  r   c                 S  s   g | ]}t  |¡‘qS rZ   rC  rE  rZ   rZ   r[   rq     rø   z$_unconvert_index.<locals>.<listcomp>rB  c                 S  s   g | ]}t  |¡‘qS rZ   rF  rE  rZ   rZ   r[   rq     rø   )rI  Úfloatr‹   rõ  rM  rÌ  r   zunrecognized index type )	ry  r,   r²  r3   rV   rN  rÌ  r®   rS  )r€  rk  r_   rœ   r˜   rZ   rZ   r[   rª    s*    


 ÿrª  rL   ró   )rf   r.  r©   c                 C  sÌ  t |jtƒr| ¡ }|jtkr"|S ttj|ƒ}|jj}t	j
|dd�}	|	dkrTtdƒ‚|	dkrdtdƒ‚|	dksx|dksx|S t|ƒ}
| ¡ }|||
< |r²|
 ¡ r²t|ƒ|jkr²td	ƒ‚t	j
|dd�}	|	dk�r2t|jd
 ƒD ]X}|| }t	j
|dd�}	|	dkrØt|ƒ|k�r|| nd|› �}td|› d|	› d�ƒ‚qØt|||ƒ |j¡}|j}t |tƒ�rxt| | ¡�pt| d¡�ptd
ƒ}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 columnrz  z>too many timezones in this block, create separate data columnsrõ  rÌ  z8NaN representation is too large for existing column sizer   zNo.rÏ  z2]
because its data contents are not [string] but [rÐ  ra  z|SrK  )rU   rß  r2   rµ  rÌ  r   rV   rã  rf   r   r°  rµ   r5   r�  rP  rt   rÃ  r®   rY  r  rJ  r*  rM  rh   rÙ   r  rû  rQ  )rf   r.  rÿ  r™   r�   r_   rœ   r©   r   r·  rU  r€  r¤  rò  Zerror_column_labelr
  rÃ  ZecirZ   rZ   r[   r  "  sV    

ÿ
 þÿ 

r  )r€  r_   rœ   r`   c                 C  sb   t | ƒr.t|  ¡ d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Ì  )r�  rß  rk   ÚSrB  )rt   r1   rO  r^   ÚencoderR  r*  r  r    r  Ú
libwritersÚmax_len_string_arrayrV   rN  )r€  r_   rœ   ÚensuredrÃ  rZ   rZ   r[   rJ  q  s    ÿþÿrJ  c                 C  s¬   | j }tj|  ¡ td�} t| ƒrŠt t| ƒ¡}d|› �}t	| d t
ƒrrt| dd�jj||dd�}| ¡ } d| j_n| j|dd�jtdd�} |d	u r–d
}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.
    rB  ÚUr   FrK  rÌ  )rœ   rß  TNrè  )r  rV   rN  rO  rÌ  rt   rN  rO  r    rU   rˆ  r1   r^   rX   rµ  ÚflagsZ	writeablerQ  Z!string_array_replace_from_nan_repr*  )r€  r�   r_   rœ   r  rÃ  rß  ZserrZ   rZ   r[   rS  �  s     
ÿ
rS  )ra  rê  r_   rœ   c                 C  s6   t |tƒsJ t|ƒƒ‚t|ƒr2t|||ƒ}|| ƒ} | S ra   )rU   r^   râ   Ú_need_convertÚ_get_converter)ra  rê  r_   rœ   ÚconvrZ   rZ   r[   rå  º  s
    rå  ©rk  r_   rœ   c                   sL   ˆdkrdd„ S dˆv r$‡fdd„S ˆdkr:‡ ‡fdd„S t dˆ› �ƒ‚d S )Nr=  c                 S  s   t j| dd�S )NrF  rB  ©rV   rN  ©r*  rZ   rZ   r[   r¡   Ä  rø   z _get_converter.<locals>.<lambda>c                   s   t j| ˆ d�S )NrB  rW  rX  r#  rZ   r[   r¡   Æ  rø   rõ  c                   s   t | d ˆ ˆd�S )NrM  )rS  rX  r�  rZ   r[   r¡   È  s   ÿzinvalid kind )r®   rV  rZ   )r_   rœ   rk  r[   rT  Â  s    rT  r0  c                 C  s   | dv sd| v rdS dS )N)r=  rõ  r=  TFrZ   r#  rZ   rZ   r[   rS  Ï  s    rS  zSequence[int])rf   rb  r`   c                 C  sl   t |tƒst|ƒdk rtdƒ‚|d dkrh|d dkrh|d dkrht d| ¡}|rh| ¡ 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   rk   r`  ra  zvalues_block_(\d+)Zvalues_)rU   r^   rt   r®   r>  r=  r·   )rf   rb  r$  ÚgrprZ   rZ   r[   ré  Õ  s    $
ré  )Ú	dtype_strr`   c                 C  sÈ   t | ƒ} |  d¡rd}n¬|  d¡r(d}nœ|  d¡r8d}nŒ|  d¡rHd}n||  d¡rX| }nl|  d¡rhd	}n\|  d
¡rxd
}nL|  d¡rˆd}n<|  d¡r˜d}n,| dkr¦d}n| dkr´d}ntd| › d�ƒ‚|S )zA
    Find the "kind" string describing the given dtype name.
    )rõ  rˆ  rõ  rK  rò  )rh   r1  rI  r=  Ú	timedeltar@  r‹   r  r3  rÌ  r^   zcannot interpret dtype of [r(  )r\   ry  r®   )r[  rk  rZ   rZ   r[   r  î  s2    








r  r"  c                 C  sv   t | tƒr| j} t | jtƒr.d| jj› d�}n| jj}| jjdv rTt 	|  
d¡¡} nt | tƒrd| j} t 	| ¡} | |fS )zJ
    Convert the passed data into a storable form and a dtype string.
    r¯  r(  ZmMrÚ  )rU   r6   r'  rß  r'   r´  rf   rk  rV   rN  r²  r/   r³  )r€  r   rZ   rZ   r[   r    s    


r  c                   @  s>   e Zd ZdZdddd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

    Nrû   rŠ   r�   )r{   r§   r¨   r`   c                 C  sV  || _ || _|| _|| _d | _d | _d | _d | _t|ƒ�rt	t
ƒ�È tj|dd�}|dv rüt |¡}|jtjkr®| j| j }}|d u rŠd}|d u rš| j j}t ||¡| | _nNt|jjtjƒrü| jd urÖ|| jk  ¡ sî| jd urö|| jk ¡ röt
dƒ‚|| _W d   ƒ n1 �s0    Y  | jd u �rR|  |¡| _| jd u�rR| j ¡ \| _| _d S )NFr®  )rI  Úbooleanr   z3where must have index locations >= start and < stop)r{   ru   r§   r¨   Ú	conditionr  Ztermsr6  r#   r   r®   r   r°  rV   rN  rß  Zbool_r  r'  Ú
issubclassrâ   rI  rP  ÚgenerateÚevaluate)rÏ   r{   ru   r§   r¨   ÚinferredrZ   rZ   r[   rÐ   6  sD    


ÿÿÿ&zSelection.__init__c              
   C  s‚   |du rdS | j  ¡ }zt||| j jd�W S  ty| } z:d | ¡ ¡}td|› d|› d�ƒ}t|ƒ|‚W Y d}~n
d}~0 0 dS )z'where can be a : dict,list,tuple,stringN)rà  r_   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
                )	r{   rà  r:   r_   Ú	NameErrorrÉ  rý   r   r®   )rÏ   ru   rç  rJ  Zqkeysr  rZ   rZ   r[   r`  c  s    
ÿûÿ	zSelection.generatec                 C  sX   | j dur(| jjj| j  ¡ | j| jd�S | jdurB| jj | j¡S | jjj| j| jd�S )ú(
        generate the selection
        Nrt  )	r^  r{   Z
read_wherer—   r§   r¨   r6  r  r  rÓ   rZ   rZ   r[   rº   z  s    
ÿ
zSelection.selectc                 C  s”   | j | j }}| jj}|du r$d}n|dk r4||7 }|du rB|}n|dk rR||7 }| jdurx| jjj| j ¡ ||dd�S | jdurˆ| jS t 	||¡S )rd  Nr   T)r§   r¨   r@  )
r§   r¨   r{   r  r^  Zget_where_listr—   r6  rV   r'  )rÏ   r§   r¨   r  rZ   rZ   r[   r   †  s"    
ÿ
zSelection.select_coords)NNN)rã   r°  r±  r²  rÐ   r`  rº   r   rZ   rZ   rZ   r[   rô  *  s      û-rô  )rˆ   NNFNTNNNNr�   rT   )	Nr¦   r�   NNNNFN)N)F)F)F)»r²  Ú
__future__r   Ú
contextlibr   r�  rz  r   r   r7  r²   r>  Útextwrapr   Útypingr   r   r	   r
   r   r   r   r  ÚnumpyrV   Zpandas._configr   r   r   r   Zpandas._libsr   r   rN  Zpandas._libs.libr   Zpandas._libs.tslibsr   Zpandas.compatr   Zpandas.compat._optionalr   Zpandas.compat.pickle_compatr   Zpandas.errorsr   r   r   r   r   Zpandas.util._decoratorsr   Zpandas.util._exceptionsr   Zpandas.core.dtypes.commonr    r!   r"   r#   r$   r%   Zpandas.core.dtypes.dtypesr&   r'   r(   r)   Zpandas.core.dtypes.missingr*   rò   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   Zpandas.core.arraysr6   r7   r8   Zpandas.core.arrays.string_r9   Zpandas.core.commonÚcoreÚcommonrG  Z pandas.core.computation.pytablesr:   r;   Zpandas.core.constructionr<   rŽ  r=   Zpandas.core.indexes.apir>   Zpandas.core.internalsr?   r@   Zpandas.io.commonrA   Zpandas.io.formats.printingrB   rC   Úcollections.abcrD   rE   rF   ÚtypesrG   rƒ   rH   rI   rJ   Zpandas._typingrK   rL   rM   rN   rO   rP   rQ   rR   rS   rl  rb   r\   rd   rg   rl   rv   rw   r³  rx   ry   r†  r[  r~   r   Zconfig_prefixZregister_optionZis_boolZis_one_of_factoryr‚   r†   r‡   r¥   r¾   r¸   r¤   r  r¸  r  r  rX  rZ  r[  ry  r–  r¸  r—  rû   rž  rù  rœ  rš  r›  r™  r�  r   r›  ré  r™  rª  r  rJ  rS  rå  rT  rS  ré  r  r  rô  rZ   rZ   rZ   r[   Ú<module>   s>  $	 4(
ü&            ñ,:         ö  #           (p  8   -   2g       x dz1C, ÿ ÿ ÿ'@O*#