a
    é´«jm  ã                   @  s,  d dl mZ d dlmZmZ d dlZd dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ e	r d d	lmZmZmZmZ d d
lmZmZ d dlmZmZmZ edƒZedƒZedƒZedƒZ ddeeee ddœZ!edƒZ"edƒZ#dddee"e#ddœZ$edƒZ%ddddœdd„Z&dddd œd!d"„Z'dHd#d$d%œd&d'„Z(G d(d)„ d)eƒZ)G d*d+„ d+e)ƒZ*G d,d-„ d-e)ƒZ+G d.d/„ d/ƒZ,G d0d1„ d1e,ƒZ-G d2d3„ d3e,ƒZ.G d4d5„ d5eƒZ/G d6d7„ d7e/ƒZ0G d8d9„ d9e0ƒZ1G d:d;„ d;e/ƒZ2G d<d=„ d=e0e2ƒZ3G d>d?„ d?e/ƒZ4G d@dA„ dAe4ƒZ5G dBdC„ dCe4e2ƒZ6ddDdEœdFdG„Z7dS )Ié    )Úannotations)ÚABCÚabstractmethodN)Údedent)ÚTYPE_CHECKING©Ú
get_option)Úformat)Úpprint_thing)ÚIterableÚIteratorÚMappingÚSequence)ÚDtypeÚWriteBuffer)Ú	DataFrameÚIndexÚSeriesa      max_cols : int, optional
        When to switch from the verbose to the truncated output. If the
        DataFrame has more than `max_cols` columns, the truncated output
        is used. By default, the setting in
        ``pandas.options.display.max_info_columns`` is used.aR      show_counts : bool, optional
        Whether to show the non-null counts. By default, this is shown
        only if the DataFrame is smaller than
        ``pandas.options.display.max_info_rows`` and
        ``pandas.options.display.max_info_columns``. A value of True always
        shows the counts, and False never shows the counts.a�      >>> int_values = [1, 2, 3, 4, 5]
    >>> text_values = ['alpha', 'beta', 'gamma', 'delta', 'epsilon']
    >>> float_values = [0.0, 0.25, 0.5, 0.75, 1.0]
    >>> df = pd.DataFrame({"int_col": int_values, "text_col": text_values,
    ...                   "float_col": float_values})
    >>> df
        int_col text_col  float_col
    0        1    alpha       0.00
    1        2     beta       0.25
    2        3    gamma       0.50
    3        4    delta       0.75
    4        5  epsilon       1.00

    Prints information of all columns:

    >>> df.info(verbose=True)
    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 5 entries, 0 to 4
    Data columns (total 3 columns):
     #   Column     Non-Null Count  Dtype
    ---  ------     --------------  -----
     0   int_col    5 non-null      int64
     1   text_col   5 non-null      object
     2   float_col  5 non-null      float64
    dtypes: float64(1), int64(1), object(1)
    memory usage: 248.0+ bytes

    Prints a summary of columns count and its dtypes but not per column
    information:

    >>> df.info(verbose=False)
    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 5 entries, 0 to 4
    Columns: 3 entries, int_col to float_col
    dtypes: float64(1), int64(1), object(1)
    memory usage: 248.0+ bytes

    Pipe output of DataFrame.info to buffer instead of sys.stdout, get
    buffer content and writes to a text file:

    >>> import io
    >>> buffer = io.StringIO()
    >>> df.info(buf=buffer)
    >>> s = buffer.getvalue()
    >>> with open("df_info.txt", "w",
    ...           encoding="utf-8") as f:  # doctest: +SKIP
    ...     f.write(s)
    260

    The `memory_usage` parameter allows deep introspection mode, specially
    useful for big DataFrames and fine-tune memory optimization:

    >>> random_strings_array = np.random.choice(['a', 'b', 'c'], 10 ** 6)
    >>> df = pd.DataFrame({
    ...     'column_1': np.random.choice(['a', 'b', 'c'], 10 ** 6),
    ...     'column_2': np.random.choice(['a', 'b', 'c'], 10 ** 6),
    ...     'column_3': np.random.choice(['a', 'b', 'c'], 10 ** 6)
    ... })
    >>> df.info()
    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 1000000 entries, 0 to 999999
    Data columns (total 3 columns):
     #   Column    Non-Null Count    Dtype
    ---  ------    --------------    -----
     0   column_1  1000000 non-null  object
     1   column_2  1000000 non-null  object
     2   column_3  1000000 non-null  object
    dtypes: object(3)
    memory usage: 22.9+ MB

    >>> df.info(memory_usage='deep')
    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 1000000 entries, 0 to 999999
    Data columns (total 3 columns):
     #   Column    Non-Null Count    Dtype
    ---  ------    --------------    -----
     0   column_1  1000000 non-null  object
     1   column_2  1000000 non-null  object
     2   column_3  1000000 non-null  object
    dtypes: object(3)
    memory usage: 165.9 MBz”    DataFrame.describe: Generate descriptive statistics of DataFrame
        columns.
    DataFrame.memory_usage: Memory usage of DataFrame columns.r   z and columnsÚ )ÚklassZtype_subZmax_cols_subÚshow_counts_subZexamples_subZsee_also_subZversion_added_subaî      >>> int_values = [1, 2, 3, 4, 5]
    >>> text_values = ['alpha', 'beta', 'gamma', 'delta', 'epsilon']
    >>> s = pd.Series(text_values, index=int_values)
    >>> s.info()
    <class 'pandas.core.series.Series'>
    Index: 5 entries, 1 to 5
    Series name: None
    Non-Null Count  Dtype
    --------------  -----
    5 non-null      object
    dtypes: object(1)
    memory usage: 80.0+ bytes

    Prints a summary excluding information about its values:

    >>> s.info(verbose=False)
    <class 'pandas.core.series.Series'>
    Index: 5 entries, 1 to 5
    dtypes: object(1)
    memory usage: 80.0+ bytes

    Pipe output of Series.info to buffer instead of sys.stdout, get
    buffer content and writes to a text file:

    >>> import io
    >>> buffer = io.StringIO()
    >>> s.info(buf=buffer)
    >>> s = buffer.getvalue()
    >>> with open("df_info.txt", "w",
    ...           encoding="utf-8") as f:  # doctest: +SKIP
    ...     f.write(s)
    260

    The `memory_usage` parameter allows deep introspection mode, specially
    useful for big Series and fine-tune memory optimization:

    >>> random_strings_array = np.random.choice(['a', 'b', 'c'], 10 ** 6)
    >>> s = pd.Series(np.random.choice(['a', 'b', 'c'], 10 ** 6))
    >>> s.info()
    <class 'pandas.core.series.Series'>
    RangeIndex: 1000000 entries, 0 to 999999
    Series name: None
    Non-Null Count    Dtype
    --------------    -----
    1000000 non-null  object
    dtypes: object(1)
    memory usage: 7.6+ MB

    >>> s.info(memory_usage='deep')
    <class 'pandas.core.series.Series'>
    RangeIndex: 1000000 entries, 0 to 999999
    Series name: None
    Non-Null Count    Dtype
    --------------    -----
    1000000 non-null  object
    dtypes: object(1)
    memory usage: 55.3 MBzp    Series.describe: Generate descriptive statistics of Series.
    Series.memory_usage: Memory usage of Series.r   z
.. versionadded:: 1.4.0
aÅ  
    Print a concise summary of a {klass}.

    This method prints information about a {klass} including
    the index dtype{type_sub}, non-null values and memory usage.
    {version_added_sub}
    Parameters
    ----------
    verbose : bool, optional
        Whether to print the full summary. By default, the setting in
        ``pandas.options.display.max_info_columns`` is followed.
    buf : writable buffer, defaults to sys.stdout
        Where to send the output. By default, the output is printed to
        sys.stdout. Pass a writable buffer if you need to further process
        the output.
    {max_cols_sub}
    memory_usage : bool, str, optional
        Specifies whether total memory usage of the {klass}
        elements (including the index) should be displayed. By default,
        this follows the ``pandas.options.display.memory_usage`` setting.

        True always show memory usage. False never shows memory usage.
        A value of 'deep' is equivalent to "True with deep introspection".
        Memory usage is shown in human-readable units (base-2
        representation). Without deep introspection a memory estimation is
        made based in column dtype and number of rows assuming values
        consume the same memory amount for corresponding dtypes. With deep
        memory introspection, a real memory usage calculation is performed
        at the cost of computational resources. See the
        :ref:`Frequently Asked Questions <df-memory-usage>` for more
        details.
    {show_counts_sub}

    Returns
    -------
    None
        This method prints a summary of a {klass} and returns None.

    See Also
    --------
    {see_also_sub}

    Examples
    --------
    {examples_sub}
    zstr | DtypeÚintÚstr)ÚsÚspaceÚreturnc                 C  s   t | ƒd|…  |¡S )a»  
    Make string of specified length, padding to the right if necessary.

    Parameters
    ----------
    s : Union[str, Dtype]
        String to be formatted.
    space : int
        Length to force string to be of.

    Returns
    -------
    str
        String coerced to given length.

    Examples
    --------
    >>> pd.io.formats.info._put_str("panda", 6)
    'panda '
    >>> pd.io.formats.info._put_str("panda", 4)
    'pand'
    N)r   Úljust)r   r   © r   úU/var/www/html/laksyashrimp/venv/lib/python3.9/site-packages/pandas/io/formats/info.pyÚ_put_str%  s    r   Úfloat)ÚnumÚsize_qualifierr   c                 C  sB   dD ],}| dk r(| d›|› d|› �  S | d } q| d›|› d�S )a{  
    Return size in human readable format.

    Parameters
    ----------
    num : int
        Size in bytes.
    size_qualifier : str
        Either empty, or '+' (if lower bound).

    Returns
    -------
    str
        Size in human readable format.

    Examples
    --------
    >>> _sizeof_fmt(23028, '')
    '22.5 KB'

    >>> _sizeof_fmt(23028, '+')
    '22.5+ KB'
    )ÚbytesÚKBÚMBÚGBÚTBg      �@z3.1fú z PBr   )r!   r"   Úxr   r   r   Ú_sizeof_fmt?  s
    
r*   úbool | str | Noneú
bool | str)Úmemory_usager   c                 C  s   | du rt dƒ} | S )z5Get memory usage based on inputs and display options.Nzdisplay.memory_usager   )r-   r   r   r   Ú_initialize_memory_usage^  s    r.   c                   @  s¸   e Zd ZU dZded< ded< eeddœdd	„ƒƒZeed
dœdd„ƒƒZeeddœdd„ƒƒZ	eeddœdd„ƒƒZ
eddœdd„ƒZeddœdd„ƒZeddddddœdd„ƒZdS ) Ú	_BaseInfoaj  
    Base class for DataFrameInfo and SeriesInfo.

    Parameters
    ----------
    data : DataFrame or Series
        Either dataframe or series.
    memory_usage : bool or str, optional
        If "deep", introspect the data deeply by interrogating object dtypes
        for system-level memory consumption, and include it in the returned
        values.
    úDataFrame | SeriesÚdatar,   r-   úIterable[Dtype]©r   c                 C  s   dS )z¡
        Dtypes.

        Returns
        -------
        dtypes : sequence
            Dtype of each of the DataFrame's columns (or one series column).
        Nr   ©Úselfr   r   r   Údtypesx  s    z_BaseInfo.dtypesúMapping[str, int]c                 C  s   dS )ú!Mapping dtype - number of counts.Nr   r4   r   r   r   Údtype_counts„  s    z_BaseInfo.dtype_countsúSequence[int]c                 C  s   dS )úBSequence of non-null counts for all columns or column (if series).Nr   r4   r   r   r   Únon_null_counts‰  s    z_BaseInfo.non_null_countsr   c                 C  s   dS )zœ
        Memory usage in bytes.

        Returns
        -------
        memory_usage_bytes : int
            Object's total memory usage in bytes.
        Nr   r4   r   r   r   Úmemory_usage_bytesŽ  s    z_BaseInfo.memory_usage_bytesr   c                 C  s   t | j| jƒ› d�S )z0Memory usage in a form of human readable string.Ú
)r*   r=   r"   r4   r   r   r   Úmemory_usage_stringš  s    z_BaseInfo.memory_usage_stringc                 C  s2   d}| j r.| j dkr.d| jv s*| jj ¡ r.d}|S )Nr   ÚdeepÚobjectú+)r-   r9   r1   ÚindexZ_is_memory_usage_qualified)r5   r"   r   r   r   r"   Ÿ  s    
ÿ
þz_BaseInfo.size_qualifierúWriteBuffer[str] | Noneú
int | Noneúbool | NoneÚNone©ÚbufÚmax_colsÚverboseÚshow_countsr   c                C  s   d S ©Nr   )r5   rI   rJ   rK   rL   r   r   r   Úrender®  s    	z_BaseInfo.renderN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__Úpropertyr   r6   r9   r<   r=   r?   r"   rN   r   r   r   r   r/   g  s*   


r/   c                   @  s¦   e Zd ZdZd!ddddœdd„Zed	d
œdd„ƒZedd
œdd„ƒZedd
œdd„ƒZedd
œdd„ƒZ	edd
œdd„ƒZ
edd
œdd„ƒZddddddœdd „ZdS )"ÚDataFrameInfoz0
    Class storing dataframe-specific info.
    Nr   r+   rG   ©r1   r-   r   c                 C  s   || _ t|ƒ| _d S rM   ©r1   r.   r-   ©r5   r1   r-   r   r   r   Ú__init__¿  s    zDataFrameInfo.__init__r7   r3   c                 C  s
   t | jƒS rM   )Ú_get_dataframe_dtype_countsr1   r4   r   r   r   r9   Ç  s    zDataFrameInfo.dtype_countsr2   c                 C  s   | j jS )z
        Dtypes.

        Returns
        -------
        dtypes
            Dtype of each of the DataFrame's columns.
        ©r1   r6   r4   r   r   r   r6   Ë  s    
zDataFrameInfo.dtypesr   c                 C  s   | j jS )zz
        Column names.

        Returns
        -------
        ids : Index
            DataFrame's column names.
        )r1   Úcolumnsr4   r   r   r   Úids×  s    
zDataFrameInfo.idsr   c                 C  s
   t | jƒS ©z#Number of columns to be summarized.)Úlenr]   r4   r   r   r   Ú	col_countã  s    zDataFrameInfo.col_countr:   c                 C  s
   | j  ¡ S )r;   ©r1   Úcountr4   r   r   r   r<   è  s    zDataFrameInfo.non_null_countsc                 C  s   | j dk}| jj d|d� ¡ S )Nr@   T©rC   r@   )r-   r1   Úsum©r5   r@   r   r   r   r=   í  s    
z DataFrameInfo.memory_usage_bytesrD   rE   rF   rH   c                C  s   t | |||d�}| |¡ d S )N)ÚinforJ   rK   rL   )Ú_DataFrameInfoPrinterÚ	to_buffer©r5   rI   rJ   rK   rL   Úprinterr   r   r   rN   ò  s    üzDataFrameInfo.render)N)rO   rP   rQ   rR   rY   rT   r9   r6   r]   r`   r<   r=   rN   r   r   r   r   rU   º  s     ýrU   c                   @  sŽ   e Zd ZdZdddddœdd„Zddddd	œd
dddddœdd„Zeddœdd„ƒZeddœdd„ƒZeddœdd„ƒZ	eddœdd„ƒZ
dS )Ú
SeriesInfoz-
    Class storing series-specific info.
    Nr   r+   rG   rV   c                 C  s   || _ t|ƒ| _d S rM   rW   rX   r   r   r   rY     s    zSeriesInfo.__init__)rI   rJ   rK   rL   rD   rE   rF   rH   c                C  s,   |d urt dƒ‚t| ||d�}| |¡ d S )NzIArgument `max_cols` can only be passed in DataFrame.info, not Series.info)rf   rK   rL   )Ú
ValueErrorÚ_SeriesInfoPrinterrh   ri   r   r   r   rN     s    ÿýzSeriesInfo.renderr:   r3   c                 C  s   | j  ¡ gS rM   ra   r4   r   r   r   r<   $  s    zSeriesInfo.non_null_countsr2   c                 C  s
   | j jgS rM   r[   r4   r   r   r   r6   (  s    zSeriesInfo.dtypesr7   c                 C  s   ddl m} t|| jƒƒS )Nr   )r   )Zpandas.core.framer   rZ   r1   )r5   r   r   r   r   r9   ,  s    zSeriesInfo.dtype_countsr   c                 C  s   | j dk}| jj d|d�S )z“Memory usage in bytes.

        Returns
        -------
        memory_usage_bytes : int
            Object's total memory usage in bytes.
        r@   Trc   )r-   r1   re   r   r   r   r=   2  s    	
zSeriesInfo.memory_usage_bytes)N)rO   rP   rQ   rR   rY   rN   rT   r<   r6   r9   r=   r   r   r   r   rk     s     ýúrk   c                   @  s4   e Zd ZdZddddœdd„Zedd	œd
d„ƒZdS )Ú_InfoPrinterAbstractz6
    Class for printing dataframe or series info.
    NrD   rG   )rI   r   c                 C  s.   |   ¡ }| ¡ }|du rtj}t ||¡ dS )z Save dataframe info into buffer.N)Ú_create_table_builderÚ	get_linesÚsysÚstdoutÚfmtZbuffer_put_lines)r5   rI   Ztable_builderÚlinesr   r   r   rh   D  s
    z_InfoPrinterAbstract.to_bufferÚ_TableBuilderAbstractr3   c                 C  s   dS )z!Create instance of table builder.Nr   r4   r   r   r   ro   L  s    z*_InfoPrinterAbstract._create_table_builder)N)rO   rP   rQ   rR   rh   r   ro   r   r   r   r   rn   ?  s   rn   c                   @  sž   e Zd ZdZdddddddœdd	„Zed
dœdd„ƒZe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d„Zddœdd„ZdS )rg   a{  
    Class for printing dataframe info.

    Parameters
    ----------
    info : DataFrameInfo
        Instance of DataFrameInfo.
    max_cols : int, optional
        When to switch from the verbose to the truncated output.
    verbose : bool, optional
        Whether to print the full summary.
    show_counts : bool, optional
        Whether to show the non-null counts.
    NrU   rE   rF   rG   )rf   rJ   rK   rL   r   c                 C  s0   || _ |j| _|| _|  |¡| _|  |¡| _d S rM   )rf   r1   rK   Ú_initialize_max_colsrJ   Ú_initialize_show_countsrL   )r5   rf   rJ   rK   rL   r   r   r   rY   a  s
    z_DataFrameInfoPrinter.__init__r   r3   c                 C  s   t dt| jƒd ƒS )z"Maximum info rows to be displayed.zdisplay.max_info_rowsé   )r   r_   r1   r4   r   r   r   Úmax_rowsn  s    z_DataFrameInfoPrinter.max_rowsÚboolc                 C  s   t | j| jkƒS )zDCheck if number of columns to be summarized does not exceed maximum.)rz   r`   rJ   r4   r   r   r   Úexceeds_info_colss  s    z'_DataFrameInfoPrinter.exceeds_info_colsc                 C  s   t t| jƒ| jkƒS )zACheck if number of rows to be summarized does not exceed maximum.)rz   r_   r1   ry   r4   r   r   r   Úexceeds_info_rowsx  s    z'_DataFrameInfoPrinter.exceeds_info_rowsc                 C  s   | j jS r^   ©rf   r`   r4   r   r   r   r`   }  s    z_DataFrameInfoPrinter.col_count)rJ   r   c                 C  s   |d u rt d| jd ƒS |S )Nzdisplay.max_info_columnsrx   )r   r`   )r5   rJ   r   r   r   rv   ‚  s    z*_DataFrameInfoPrinter._initialize_max_cols©rL   r   c                 C  s$   |d u rt | j o| j ƒS |S d S rM   )rz   r{   r|   ©r5   rL   r   r   r   rw   ‡  s    z-_DataFrameInfoPrinter._initialize_show_countsÚ_DataFrameTableBuilderc                 C  sR   | j rt| j| jd�S | j du r,t| jd�S | jr>t| jd�S t| j| jd�S dS )z[
        Create instance of table builder based on verbosity and display settings.
        ©rf   Úwith_countsF©rf   N)rK   Ú_DataFrameTableBuilderVerboserf   rL   Ú _DataFrameTableBuilderNonVerboser{   r4   r   r   r   ro   �  s    þ
þz+_DataFrameInfoPrinter._create_table_builder)NNN)rO   rP   rQ   rR   rY   rT   ry   r{   r|   r`   rv   rw   ro   r   r   r   r   rg   Q  s       ûrg   c                   @  sD   e Zd ZdZddddddœdd„Zd	d
œdd„Zdddœdd„ZdS )rm   a  Class for printing series info.

    Parameters
    ----------
    info : SeriesInfo
        Instance of SeriesInfo.
    verbose : bool, optional
        Whether to print the full summary.
    show_counts : bool, optional
        Whether to show the non-null counts.
    Nrk   rF   rG   )rf   rK   rL   r   c                 C  s$   || _ |j| _|| _|  |¡| _d S rM   )rf   r1   rK   rw   rL   )r5   rf   rK   rL   r   r   r   rY   ®  s    z_SeriesInfoPrinter.__init__Ú_SeriesTableBuilderr3   c                 C  s0   | j s| j du r t| j| jd�S t| jd�S dS )zF
        Create instance of table builder based on verbosity.
        Nr�   rƒ   )rK   Ú_SeriesTableBuilderVerboserf   rL   Ú_SeriesTableBuilderNonVerboser4   r   r   r   ro   ¹  s    þz(_SeriesInfoPrinter._create_table_builderrz   r~   c                 C  s   |d u rdS |S d S )NTr   r   r   r   r   rw   Å  s    z*_SeriesInfoPrinter._initialize_show_counts)NN)rO   rP   rQ   rR   rY   ro   rw   r   r   r   r   rm   ¡  s     ürm   c                   @  sÊ   e Zd ZU dZded< ded< eddœdd„ƒZed	dœd
d„ƒZeddœdd„ƒZ	eddœdd„ƒZ
eddœdd„ƒZe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"S )#ru   z*
    Abstract builder for info table.
    ú	list[str]Ú_linesr/   rf   r3   c                 C  s   dS )z-Product in a form of list of lines (strings).Nr   r4   r   r   r   rp   Ô  s    z_TableBuilderAbstract.get_linesr0   c                 C  s   | j jS rM   ©rf   r1   r4   r   r   r   r1   Ø  s    z_TableBuilderAbstract.datar2   c                 C  s   | j jS )z*Dtypes of each of the DataFrame's columns.)rf   r6   r4   r   r   r   r6   Ü  s    z_TableBuilderAbstract.dtypesr7   c                 C  s   | j jS )r8   )rf   r9   r4   r   r   r   r9   á  s    z"_TableBuilderAbstract.dtype_countsrz   c                 C  s   t | jjƒS )z Whether to display memory usage.)rz   rf   r-   r4   r   r   r   Údisplay_memory_usageæ  s    z*_TableBuilderAbstract.display_memory_usager   c                 C  s   | j jS )z/Memory usage string with proper size qualifier.)rf   r?   r4   r   r   r   r?   ë  s    z)_TableBuilderAbstract.memory_usage_stringr:   c                 C  s   | j jS rM   )rf   r<   r4   r   r   r   r<   ð  s    z%_TableBuilderAbstract.non_null_countsrG   c                 C  s   | j  tt| jƒƒ¡ dS )z>Add line with string representation of dataframe to the table.N)rŠ   Úappendr   Útyper1   r4   r   r   r   Úadd_object_type_lineô  s    z*_TableBuilderAbstract.add_object_type_linec                 C  s   | j  | jj ¡ ¡ dS )z,Add line with range of indices to the table.N)rŠ   r�   r1   rC   Ú_summaryr4   r   r   r   Úadd_index_range_lineø  s    z*_TableBuilderAbstract.add_index_range_linec                 C  s4   dd„ t | j ¡ ƒD ƒ}| j dd |¡› �¡ dS )z2Add summary line with dtypes present in dataframe.c                 S  s"   g | ]\}}|› d |d›d�‘qS )ú(Údú)r   )Ú.0ÚkeyÚvalr   r   r   Ú
<listcomp>þ  s   z9_TableBuilderAbstract.add_dtypes_line.<locals>.<listcomp>zdtypes: z, N)Úsortedr9   ÚitemsrŠ   r�   Újoin)r5   Zcollected_dtypesr   r   r   Úadd_dtypes_lineü  s    ÿz%_TableBuilderAbstract.add_dtypes_lineN)rO   rP   rQ   rR   rS   r   rp   rT   r1   r6   r9   rŒ   r?   r<   r�   r‘   rœ   r   r   r   r   ru   Ì  s(   
ru   c                   @  s’   e Zd ZdZdddœdd„Zddœd	d
„Zddœdd„Zeddœdd„ƒZe	ddœdd„ƒZ
e	ddœdd„ƒZe	ddœdd„ƒZddœdd„ZdS )r€   z�
    Abstract builder for dataframe info table.

    Parameters
    ----------
    info : DataFrameInfo.
        Instance of DataFrameInfo.
    rU   rG   ©rf   r   c                C  s
   || _ d S rM   rƒ   ©r5   rf   r   r   r   rY     s    z_DataFrameTableBuilder.__init__r‰   r3   c                 C  s(   g | _ | jdkr|  ¡  n|  ¡  | j S )Nr   )rŠ   r`   Ú_fill_empty_infoÚ_fill_non_empty_infor4   r   r   r   rp     s
    

z _DataFrameTableBuilder.get_linesc                 C  s0   |   ¡  |  ¡  | j dt| jƒj› d�¡ dS )z;Add lines to the info table, pertaining to empty dataframe.zEmpty r>   N)r�   r‘   rŠ   r�   rŽ   r1   rO   r4   r   r   r   rŸ     s    z'_DataFrameTableBuilder._fill_empty_infoc                 C  s   dS ©z?Add lines to the info table, pertaining to non-empty dataframe.Nr   r4   r   r   r   r      s    z+_DataFrameTableBuilder._fill_non_empty_infor   c                 C  s   | j jS )z
DataFrame.r‹   r4   r   r   r   r1   #  s    z_DataFrameTableBuilder.datar   c                 C  s   | j jS )zDataframe columns.)rf   r]   r4   r   r   r   r]   (  s    z_DataFrameTableBuilder.idsr   c                 C  s   | j jS )z-Number of dataframe columns to be summarized.r}   r4   r   r   r   r`   -  s    z _DataFrameTableBuilder.col_countc                 C  s   | j  d| j› �¡ dS ©z!Add line containing memory usage.zmemory usage: N©rŠ   r�   r?   r4   r   r   r   Úadd_memory_usage_line2  s    z,_DataFrameTableBuilder.add_memory_usage_lineN)rO   rP   rQ   rR   rY   rp   rŸ   r   r    rT   r1   r]   r`   r¤   r   r   r   r   r€     s   	r€   c                   @  s,   e Zd ZdZddœdd„Zddœdd„ZdS )	r…   z>
    Dataframe info table builder for non-verbose output.
    rG   r3   c                 C  s2   |   ¡  |  ¡  |  ¡  |  ¡  | jr.|  ¡  dS r¡   )r�   r‘   Úadd_columns_summary_linerœ   rŒ   r¤   r4   r   r   r   r    <  s    z5_DataFrameTableBuilderNonVerbose._fill_non_empty_infoc                 C  s   | j  | jjdd�¡ d S )NÚColumns©Úname)rŠ   r�   r]   r�   r4   r   r   r   r¥   E  s    z9_DataFrameTableBuilderNonVerbose.add_columns_summary_lineN)rO   rP   rQ   rR   r    r¥   r   r   r   r   r…   7  s   	r…   c                   @  sò   e Zd ZU dZdZded< ded< ded< d	ed
< ee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e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%„Zd#dœd&d'„Zd(S ))Ú_TableBuilderVerboseMixinz(
    Mixin for verbose info output.
    z  r   ÚSPACINGzSequence[Sequence[str]]Ústrrowsr:   Úgross_column_widthsrz   r‚   úSequence[str]r3   c                 C  s   dS )ú.Headers names of the columns in verbose table.Nr   r4   r   r   r   ÚheadersS  s    z!_TableBuilderVerboseMixin.headersc                 C  s   dd„ | j D ƒS )z'Widths of header columns (only titles).c                 S  s   g | ]}t |ƒ‘qS r   ©r_   ©r•   Úcolr   r   r   r˜   [  ó    zB_TableBuilderVerboseMixin.header_column_widths.<locals>.<listcomp>)r¯   r4   r   r   r   Úheader_column_widthsX  s    z._TableBuilderVerboseMixin.header_column_widthsc                 C  s   |   ¡ }dd„ t| j|ƒD ƒS )zAGet widths of columns containing both headers and actual content.c                 S  s   g | ]}t |Ž ‘qS r   ©Úmax)r•   Úwidthsr   r   r   r˜   `  s   ÿzF_TableBuilderVerboseMixin._get_gross_column_widths.<locals>.<listcomp>)Ú_get_body_column_widthsÚzipr´   )r5   Zbody_column_widthsr   r   r   Ú_get_gross_column_widths]  s    
þz2_TableBuilderVerboseMixin._get_gross_column_widthsc                 C  s   t t| jŽ ƒ}dd„ |D ƒS )z$Get widths of table content columns.c                 S  s   g | ]}t d d„ |D ƒƒ‘qS )c                 s  s   | ]}t |ƒV  qd S rM   r°   )r•   r)   r   r   r   Ú	<genexpr>h  r³   zO_TableBuilderVerboseMixin._get_body_column_widths.<locals>.<listcomp>.<genexpr>rµ   r±   r   r   r   r˜   h  r³   zE_TableBuilderVerboseMixin._get_body_column_widths.<locals>.<listcomp>)Úlistr¹   r«   )r5   Zstrcolsr   r   r   r¸   e  s    z1_TableBuilderVerboseMixin._get_body_column_widthsúIterator[Sequence[str]]c                 C  s   | j r|  ¡ S |  ¡ S dS )z„
        Generator function yielding rows content.

        Each element represents a row comprising a sequence of strings.
        N)r‚   Ú_gen_rows_with_countsÚ_gen_rows_without_countsr4   r   r   r   Ú	_gen_rowsj  s    z#_TableBuilderVerboseMixin._gen_rowsc                 C  s   dS ©z=Iterator with string representation of body data with counts.Nr   r4   r   r   r   r¾   u  s    z/_TableBuilderVerboseMixin._gen_rows_with_countsc                 C  s   dS ©z@Iterator with string representation of body data without counts.Nr   r4   r   r   r   r¿   y  s    z2_TableBuilderVerboseMixin._gen_rows_without_countsrG   c                 C  s0   | j  dd„ t| j| jƒD ƒ¡}| j |¡ d S )Nc                 S  s   g | ]\}}t ||ƒ‘qS r   ©r   )r•   ÚheaderZ	col_widthr   r   r   r˜     s   ÿz=_TableBuilderVerboseMixin.add_header_line.<locals>.<listcomp>)rª   r›   r¹   r¯   r¬   rŠ   r�   )r5   Zheader_liner   r   r   Úadd_header_line}  s    þÿz)_TableBuilderVerboseMixin.add_header_linec                 C  s0   | j  dd„ t| j| jƒD ƒ¡}| j |¡ d S )Nc                 S  s   g | ]\}}t d | |ƒ‘qS )ú-rÃ   )r•   Zheader_colwidthÚgross_colwidthr   r   r   r˜   ˆ  s   ÿz@_TableBuilderVerboseMixin.add_separator_line.<locals>.<listcomp>)rª   r›   r¹   r´   r¬   rŠ   r�   )r5   Zseparator_liner   r   r   Úadd_separator_line†  s    ÿþÿz,_TableBuilderVerboseMixin.add_separator_linec                 C  s:   | j D ].}| j dd„ t|| jƒD ƒ¡}| j |¡ qd S )Nc                 S  s   g | ]\}}t ||ƒ‘qS r   rÃ   )r•   r²   rÇ   r   r   r   r˜   ”  s   ÿz<_TableBuilderVerboseMixin.add_body_lines.<locals>.<listcomp>)r«   rª   r›   r¹   r¬   rŠ   r�   )r5   ÚrowZ	body_liner   r   r   Úadd_body_lines‘  s    

þÿz(_TableBuilderVerboseMixin.add_body_linesúIterator[str]c                 c  s   | j D ]}|› d�V  qdS )z7Iterator with string representation of non-null counts.z	 non-nullN)r<   )r5   rb   r   r   r   Ú_gen_non_null_counts›  s    
z._TableBuilderVerboseMixin._gen_non_null_countsc                 c  s   | j D ]}t|ƒV  qdS )z5Iterator with string representation of column dtypes.N)r6   r
   )r5   Zdtyper   r   r   Ú_gen_dtypes   s    
z%_TableBuilderVerboseMixin._gen_dtypesN)rO   rP   rQ   rR   rª   rS   rT   r   r¯   r´   rº   r¸   rÀ   r¾   r¿   rÅ   rÈ   rÊ   rÌ   rÍ   r   r   r   r   r©   I  s,   
	
r©   c                   @  sˆ   e Zd ZdZddddœ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„Zddœdd„ZdS )r„   z:
    Dataframe info table builder for verbose output.
    rU   rz   rG   ©rf   r‚   r   c                C  s(   || _ || _t|  ¡ ƒ| _|  ¡ | _d S rM   ©rf   r‚   r¼   rÀ   r«   rº   r¬   ©r5   rf   r‚   r   r   r   rY   «  s    z&_DataFrameTableBuilderVerbose.__init__r3   c                 C  sJ   |   ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  | jrF|  ¡  dS r¡   )	r�   r‘   r¥   rÅ   rÈ   rÊ   rœ   rŒ   r¤   r4   r   r   r   r    ¶  s    z2_DataFrameTableBuilderVerbose._fill_non_empty_infor­   c                 C  s   | j rg d¢S g d¢S )r®   )ú # ÚColumnúNon-Null Countr   )rÑ   rÒ   r   ©r‚   r4   r   r   r   r¯   Â  s    z%_DataFrameTableBuilderVerbose.headersc                 C  s   | j  d| j› d�¡ d S )NzData columns (total z
 columns):)rŠ   r�   r`   r4   r   r   r   r¥   É  s    z6_DataFrameTableBuilderVerbose.add_columns_summary_liner½   c                 c  s"   t |  ¡ |  ¡ |  ¡ ƒE dH  dS rÂ   )r¹   Ú_gen_line_numbersÚ_gen_columnsrÍ   r4   r   r   r   r¿   Ì  s
    ýz6_DataFrameTableBuilderVerbose._gen_rows_without_countsc                 c  s(   t |  ¡ |  ¡ |  ¡ |  ¡ ƒE dH  dS rÁ   )r¹   rÕ   rÖ   rÌ   rÍ   r4   r   r   r   r¾   Ô  s    üz3_DataFrameTableBuilderVerbose._gen_rows_with_countsrË   c                 c  s$   t | jƒD ]\}}d|› �V  q
dS )z6Iterator with string representation of column numbers.r(   N)Ú	enumerater]   )r5   ÚiÚ_r   r   r   rÕ   Ý  s    z/_DataFrameTableBuilderVerbose._gen_line_numbersc                 c  s   | j D ]}t|ƒV  qdS )z4Iterator with string representation of column names.N)r]   r
   )r5   r²   r   r   r   rÖ   â  s    
z*_DataFrameTableBuilderVerbose._gen_columnsN)rO   rP   rQ   rR   rY   r    rT   r¯   r¥   r¿   r¾   rÕ   rÖ   r   r   r   r   r„   ¦  s   	r„   c                   @  s`   e Zd ZdZdddœdd„Zddœd	d
„Zeddœdd„ƒZddœdd„Ze	ddœdd„ƒZ
dS )r†   z‡
    Abstract builder for series info table.

    Parameters
    ----------
    info : SeriesInfo.
        Instance of SeriesInfo.
    rk   rG   r�   c                C  s
   || _ d S rM   rƒ   rž   r   r   r   rY   ò  s    z_SeriesTableBuilder.__init__r‰   r3   c                 C  s   g | _ |  ¡  | j S rM   )rŠ   r    r4   r   r   r   rp   õ  s    z_SeriesTableBuilder.get_linesr   c                 C  s   | j jS )zSeries.r‹   r4   r   r   r   r1   ú  s    z_SeriesTableBuilder.datac                 C  s   | j  d| j› �¡ dS r¢   r£   r4   r   r   r   r¤   ÿ  s    z)_SeriesTableBuilder.add_memory_usage_linec                 C  s   dS ©z<Add lines to the info table, pertaining to non-empty series.Nr   r4   r   r   r   r      s    z(_SeriesTableBuilder._fill_non_empty_infoN)rO   rP   rQ   rR   rY   rp   rT   r1   r¤   r   r    r   r   r   r   r†   è  s   	r†   c                   @  s   e Zd ZdZddœdd„ZdS )rˆ   z;
    Series info table builder for non-verbose output.
    rG   r3   c                 C  s*   |   ¡  |  ¡  |  ¡  | jr&|  ¡  dS rÚ   )r�   r‘   rœ   rŒ   r¤   r4   r   r   r   r      s
    z2_SeriesTableBuilderNonVerbose._fill_non_empty_infoN)rO   rP   rQ   rR   r    r   r   r   r   rˆ     s   rˆ   c                   @  sl   e Zd ZdZdd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„Z	ddœdd„Z
dS )r‡   z7
    Series info table builder for verbose output.
    rk   rz   rG   rÎ   c                C  s(   || _ || _t|  ¡ ƒ| _|  ¡ | _d S rM   rÏ   rÐ   r   r   r   rY     s    z#_SeriesTableBuilderVerbose.__init__r3   c                 C  sJ   |   ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  | jrF|  ¡  dS rÚ   )	r�   r‘   Úadd_series_name_linerÅ   rÈ   rÊ   rœ   rŒ   r¤   r4   r   r   r   r    &  s    z/_SeriesTableBuilderVerbose._fill_non_empty_infoc                 C  s   | j  d| jj› �¡ d S )NzSeries name: )rŠ   r�   r1   r¨   r4   r   r   r   rÛ   2  s    z/_SeriesTableBuilderVerbose.add_series_name_liner­   c                 C  s   | j rddgS dgS )r®   rÓ   r   rÔ   r4   r   r   r   r¯   5  s    z"_SeriesTableBuilderVerbose.headersr½   c                 c  s   |   ¡ E dH  dS rÂ   )rÍ   r4   r   r   r   r¿   <  s    z3_SeriesTableBuilderVerbose._gen_rows_without_countsc                 c  s   t |  ¡ |  ¡ ƒE dH  dS rÁ   )r¹   rÌ   rÍ   r4   r   r   r   r¾   @  s    þz0_SeriesTableBuilderVerbose._gen_rows_with_countsN)rO   rP   rQ   rR   rY   r    rÛ   rT   r¯   r¿   r¾   r   r   r   r   r‡     s   r‡   r7   )Údfr   c                 C  s   | j  ¡  dd„ ¡ ¡ S )zK
    Create mapping between datatypes and their number of occurrences.
    c                 S  s   | j S rM   r§   )r)   r   r   r   Ú<lambda>M  r³   z-_get_dataframe_dtype_counts.<locals>.<lambda>)r6   Zvalue_countsÚgroupbyrd   )rÜ   r   r   r   rZ   H  s    rZ   )N)8Ú
__future__r   Úabcr   r   rq   Útextwrapr   Útypingr   Zpandas._configr   Zpandas.io.formatsr	   rs   Zpandas.io.formats.printingr
   Úcollections.abcr   r   r   r   Zpandas._typingr   r   Zpandasr   r   r   Zframe_max_cols_subr   Zframe_examples_subZframe_see_also_subZframe_sub_kwargsZseries_examples_subZseries_see_also_subZseries_sub_kwargsZINFO_DOCSTRINGr   r*   r.   r/   rU   rk   rn   rg   rm   ru   r€   r…   r©   r„   r†   rˆ   r‡   rZ   r   r   r   r   Ú<module>   s†   ÿ
ÿÿVÿ	ùÿ>ÿùÿ3  ÿ	SI<P+83]B 2