o
    Û­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	rPd 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%dKdd „Z&dLd$d%„Z'	dMdNd)d*„Z(G d+d,„ d,eƒZ)G d-d.„ d.e)ƒZ*G d/d0„ d0e)ƒZ+G d1d2„ d2ƒZ,G d3d4„ d4e,ƒZ-G d5d6„ d6e,ƒZ.G d7d8„ d8eƒZ/G d9d:„ d:e/ƒZ0G d;d<„ d<e0ƒZ1G d=d>„ d>e/ƒZ2G d?d@„ d@e0e2ƒZ3G dAdB„ dBe/ƒZ4G dCdD„ dDe4ƒZ5G dEdF„ dFe4e2ƒZ6dOdIdJ„Z7dS )Pé    )Ú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Ú )ÚklassÚtype_subÚmax_cols_subÚshow_counts_subÚexamples_subÚsee_also_subÚ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}
    Úsústr | DtypeÚspaceÚintÚreturnÚstrc                 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#   úS/var/www/html/CropPilot/venv/lib/python3.10/site-packages/pandas/io/formats/info.pyÚ_put_str%  s   r%   ÚnumÚfloatÚsize_qualifierc                 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
   
r0   Úmemory_usageúbool | str | Noneú
bool | strc                 C  s   | du rt dƒ} | S )z5Get memory usage based on inputs and display options.Nzdisplay.memory_usager   )r1   r#   r#   r$   Ú_initialize_memory_usage^  s   r4   c                   @  s”   e Zd ZU dZded< ded< eed#dd	„ƒƒZeed$dd„ƒƒZeed%dd„ƒƒZ	eed&dd„ƒƒZ
ed'dd„ƒZed'dd„ƒZe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Údatar3   r1   r    úIterable[Dtype]c                 C  ó   dS )z¡
        Dtypes.

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

        Returns
        -------
        memory_usage_bytes : int
            Object's total memory usage in bytes.
        Nr#   r:   r#   r#   r$   Úmemory_usage_bytesŽ  r=   z_BaseInfo.memory_usage_bytesr!   c                 C  s   t | j| jƒ› d�S )z0Memory usage in a form of human readable string.Ú
)r0   rD   r(   r:   r#   r#   r$   Úmemory_usage_stringš  ó   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ú+)r1   r@   r7   ÚindexÚ_is_memory_usage_qualified)r;   r(   r#   r#   r$   r(   Ÿ  s   


ÿz_BaseInfo.size_qualifierÚbufúWriteBuffer[str] | NoneÚmax_colsú
int | NoneÚverboseúbool | NoneÚshow_countsÚNonec                C  s   d S ©Nr#   )r;   rM   rO   rQ   rS   r#   r#   r$   Úrender®  s   	z_BaseInfo.renderN©r    r8   ©r    r>   ©r    rA   ©r    r   ©r    r!   ©
rM   rN   rO   rP   rQ   rR   rS   rR   r    rT   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__Úpropertyr   r<   r@   rC   rD   rF   r(   rV   r#   r#   r#   r$   r5   g  s,   
 

r5   c                   @  s|   e Zd ZdZ	d%d&d	d
„Zed'dd„ƒZed(dd„ƒZed)dd„ƒZed*dd„ƒZ	ed+dd„ƒZ
ed*dd„ƒZd,d#d$„ZdS )-ÚDataFrameInfoz0
    Class storing dataframe-specific info.
    Nr7   r   r1   r2   r    rT   c                 C  ó   || _ t|ƒ| _d S rU   ©r7   r4   r1   ©r;   r7   r1   r#   r#   r$   Ú__init__¿  ó   zDataFrameInfo.__init__r>   c                 C  ó
   t | jƒS rU   )Ú_get_dataframe_dtype_countsr7   r:   r#   r#   r$   r@   Ç  ó   
zDataFrameInfo.dtype_countsr8   c                 C  ó   | j jS )z
        Dtypes.

        Returns
        -------
        dtypes
            Dtype of each of the DataFrame's columns.
        ©r7   r<   r:   r#   r#   r$   r<   Ë  ó   
zDataFrameInfo.dtypesr   c                 C  rl   )zz
        Column names.

        Returns
        -------
        ids : Index
            DataFrame's column names.
        )r7   Úcolumnsr:   r#   r#   r$   Úids×  rn   zDataFrameInfo.idsr   c                 C  ri   ©z#Number of columns to be summarized.)Úlenrp   r:   r#   r#   r$   Ú	col_countã  ó   
zDataFrameInfo.col_countrA   c                 C  s
   | j  ¡ S )rB   ©r7   Úcountr:   r#   r#   r$   rC   è  rt   zDataFrameInfo.non_null_countsc                 C  s   | j dk}| jj d|d� ¡ S )NrH   T©rK   rH   )r1   r7   Úsum©r;   rH   r#   r#   r$   rD   í  s   
z DataFrameInfo.memory_usage_bytesrM   rN   rO   rP   rQ   rR   rS   c                C  s   t | |||d�}| |¡ d S )N)ÚinforO   rQ   rS   )Ú_DataFrameInfoPrinterÚ	to_buffer©r;   rM   rO   rQ   rS   Úprinterr#   r#   r$   rV   ò  s   üzDataFrameInfo.renderrU   )r7   r   r1   r2   r    rT   rX   rW   ©r    r   rZ   rY   r\   )r]   r^   r_   r`   rg   rb   r@   r<   rp   rs   rC   rD   rV   r#   r#   r#   r$   rc   º  s"    ýrc   c                   @  sl   e Zd ZdZ	d!d"d	d
„Zdddddœd#dd„Zed$dd„ƒZed%dd„ƒZed&dd„ƒZ	ed'dd „ƒZ
dS )(Ú
SeriesInfoz-
    Class storing series-specific info.
    Nr7   r   r1   r2   r    rT   c                 C  rd   rU   re   rf   r#   r#   r$   rg     rh   zSeriesInfo.__init__)rM   rO   rQ   rS   rM   rN   rO   rP   rQ   rR   rS   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)rz   rQ   rS   )Ú
ValueErrorÚ_SeriesInfoPrinterr|   r}   r#   r#   r$   rV     s   ÿýzSeriesInfo.renderrA   c                 C  s   | j  ¡ gS rU   ru   r:   r#   r#   r$   rC   $  s   zSeriesInfo.non_null_countsr8   c                 C  s
   | j jgS rU   rm   r:   r#   r#   r$   r<   (  rk   zSeriesInfo.dtypesr>   c                 C  s   ddl m} t|| jƒƒS )Nr   )r   )Úpandas.core.framer   rj   r7   )r;   r   r#   r#   r$   r@   ,  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.
        rH   Trw   )r1   r7   ry   r#   r#   r$   rD   2  s   
	zSeriesInfo.memory_usage_bytesrU   )r7   r   r1   r2   r    rT   r\   rY   rW   rX   rZ   )r]   r^   r_   r`   rg   rV   rb   rC   r<   r@   rD   r#   r#   r#   r$   r€     s"    ýúr€   c                   @  s*   e Zd ZdZdddd„Zedd
d„ƒZdS )Ú_InfoPrinterAbstractz6
    Class for printing dataframe or series info.
    NrM   rN   r    rT   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ÚfmtÚbuffer_put_lines)r;   rM   Útable_builderÚlinesr#   r#   r$   r|   D  s
   z_InfoPrinterAbstract.to_bufferÚ_TableBuilderAbstractc                 C  r9   )z!Create instance of table builder.Nr#   r:   r#   r#   r$   r…   L  r=   z*_InfoPrinterAbstract._create_table_builderrU   )rM   rN   r    rT   )r    r�   )r]   r^   r_   r`   r|   r   r…   r#   r#   r#   r$   r„   ?  s
    r„   c                   @  sx   e Zd ZdZ			dd dd„Zed!dd„ƒZed"dd„ƒZed"dd„ƒZed!dd„ƒZ	d#dd„Z
d$dd„Zd%dd„ZdS )&r{   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.
    Nrz   rc   rO   rP   rQ   rR   rS   r    rT   c                 C  s0   || _ |j| _|| _|  |¡| _|  |¡| _d S rU   )rz   r7   rQ   Ú_initialize_max_colsrO   Ú_initialize_show_countsrS   )r;   rz   rO   rQ   rS   r#   r#   r$   rg   a  s
   z_DataFrameInfoPrinter.__init__r   c                 C  s   t dt| jƒd ƒS )z"Maximum info rows to be displayed.zdisplay.max_info_rowsé   )r   rr   r7   r:   r#   r#   r$   Úmax_rowsn  rG   z_DataFrameInfoPrinter.max_rowsÚboolc                 C  s   t | j| jkƒS )zDCheck if number of columns to be summarized does not exceed maximum.)r’   rs   rO   r:   r#   r#   r$   Úexceeds_info_colss  ó   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.)r’   rr   r7   r‘   r:   r#   r#   r$   Úexceeds_info_rowsx  rG   z'_DataFrameInfoPrinter.exceeds_info_rowsc                 C  rl   rq   ©rz   rs   r:   r#   r#   r$   rs   }  ó   z_DataFrameInfoPrinter.col_countc                 C  s   |d u rt d| jd ƒS |S )Nzdisplay.max_info_columnsr�   )r   rs   )r;   rO   r#   r#   r$   rŽ   ‚  s   z*_DataFrameInfoPrinter._initialize_max_colsc                 C  s    |d u rt | j o| j ƒS |S rU   )r’   r“   r•   ©r;   rS   r#   r#   r$   r�   ‡  s   z-_DataFrameInfoPrinter._initialize_show_countsÚ_DataFrameTableBuilderc                 C  sN   | 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 )z[
        Create instance of table builder based on verbosity and display settings.
        ©rz   Úwith_countsF©rz   )rQ   Ú_DataFrameTableBuilderVerboserz   rS   Ú _DataFrameTableBuilderNonVerboser“   r:   r#   r#   r$   r…   �  s   þ
þz+_DataFrameInfoPrinter._create_table_builder)NNN)
rz   rc   rO   rP   rQ   rR   rS   rR   r    rT   rZ   ©r    r’   )rO   rP   r    r   ©rS   rR   r    r’   )r    r™   )r]   r^   r_   r`   rg   rb   r‘   r“   r•   rs   rŽ   r�   r…   r#   r#   r#   r$   r{   Q  s"    û

r{   c                   @  s4   e Zd ZdZ		ddd
d„Zddd„Zddd„ZdS )r‚   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.
    Nrz   r€   rQ   rR   rS   r    rT   c                 C  s$   || _ |j| _|| _|  |¡| _d S rU   )rz   r7   rQ   r�   rS   )r;   rz   rQ   rS   r#   r#   r$   rg   ®  s   z_SeriesInfoPrinter.__init__Ú_SeriesTableBuilderc                 C  s,   | j s| j du rt| j| jd�S t| jd�S )zF
        Create instance of table builder based on verbosity.
        Nrš   rœ   )rQ   Ú_SeriesTableBuilderVerboserz   rS   Ú_SeriesTableBuilderNonVerboser:   r#   r#   r$   r…   ¹  s   þz(_SeriesInfoPrinter._create_table_builderr’   c                 C  s   |d u rdS |S )NTr#   r˜   r#   r#   r$   r�   Å  s   z*_SeriesInfoPrinter._initialize_show_counts)NN)rz   r€   rQ   rR   rS   rR   r    rT   )r    r¡   r    )r]   r^   r_   r`   rg   r…   r�   r#   r#   r#   r$   r‚   ¡  s    ü
r‚   c                   @  s¢   e Zd ZU dZded< ded< ed#dd„ƒZed$d
d„ƒZed%dd„ƒZ	ed&dd„ƒZ
ed'dd„ƒZed(dd„ƒZed)dd„ƒZd*dd„Zd*dd„Zd*d d!„Zd"S )+r�   z*
    Abstract builder for info table.
    ú	list[str]Ú_linesr5   rz   r    c                 C  r9   )z-Product in a form of list of lines (strings).Nr#   r:   r#   r#   r$   r†   Ô  r=   z_TableBuilderAbstract.get_linesr6   c                 C  rl   rU   ©rz   r7   r:   r#   r#   r$   r7   Ø  ó   z_TableBuilderAbstract.datar8   c                 C  rl   )z*Dtypes of each of the DataFrame's columns.)rz   r<   r:   r#   r#   r$   r<   Ü  r—   z_TableBuilderAbstract.dtypesr>   c                 C  rl   )r?   )rz   r@   r:   r#   r#   r$   r@   á  r—   z"_TableBuilderAbstract.dtype_countsr’   c                 C  s   t | jjƒS )z Whether to display memory usage.)r’   rz   r1   r:   r#   r#   r$   Údisplay_memory_usageæ  s   z*_TableBuilderAbstract.display_memory_usager!   c                 C  rl   )z/Memory usage string with proper size qualifier.)rz   rF   r:   r#   r#   r$   rF   ë  r—   z)_TableBuilderAbstract.memory_usage_stringrA   c                 C  rl   rU   )rz   rC   r:   r#   r#   r$   rC   ð  r§   z%_TableBuilderAbstract.non_null_countsrT   c                 C  s   | j  tt| jƒƒ¡ dS )z>Add line with string representation of dataframe to the table.N)r¥   Úappendr!   Útyper7   r:   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©   r7   rK   Ú_summaryr:   r#   r#   r$   Úadd_index_range_lineø  ó   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)Úsortedr@   Úitemsr¥   r©   Újoin)r;   Úcollected_dtypesr#   r#   r$   Úadd_dtypes_lineü  s   ÿz%_TableBuilderAbstract.add_dtypes_lineN©r    r¤   )r    r6   rW   rX   rŸ   r[   rY   ©r    rT   )r]   r^   r_   r`   ra   r   r†   rb   r7   r<   r@   r¨   rF   rC   r«   r­   rº   r#   r#   r#   r$   r�   Ì  s*   
 

r�   c                   @  sp   e Zd ZdZddd„Zdd	d
„Zddd„Zeddd„ƒZe	ddd„ƒZ
e	ddd„ƒZe	d dd„ƒZddd„ZdS )!r™   z�
    Abstract builder for dataframe info table.

    Parameters
    ----------
    info : DataFrameInfo.
        Instance of DataFrameInfo.
    rz   rc   r    rT   c                C  ó
   || _ d S rU   rœ   ©r;   rz   r#   r#   r$   rg     ó   
z_DataFrameTableBuilder.__init__r¤   c                 C  s,   g | _ | jdkr|  ¡  | j S |  ¡  | j S )Nr   )r¥   rs   Ú_fill_empty_infoÚ_fill_non_empty_infor:   r#   r#   r$   r†     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 rE   N)r«   r­   r¥   r©   rª   r7   r]   r:   r#   r#   r$   rÀ     s    z'_DataFrameTableBuilder._fill_empty_infoc                 C  r9   ©z?Add lines to the info table, pertaining to non-empty dataframe.Nr#   r:   r#   r#   r$   rÁ     r=   z+_DataFrameTableBuilder._fill_non_empty_infor   c                 C  rl   )z
DataFrame.r¦   r:   r#   r#   r$   r7   #  r—   z_DataFrameTableBuilder.datar   c                 C  rl   )zDataframe columns.)rz   rp   r:   r#   r#   r$   rp   (  r—   z_DataFrameTableBuilder.idsr   c                 C  rl   )z-Number of dataframe columns to be summarized.r–   r:   r#   r#   r$   rs   -  r—   z _DataFrameTableBuilder.col_countc                 C  ó   | j  d| j› �¡ dS ©z!Add line containing memory usage.zmemory usage: N©r¥   r©   rF   r:   r#   r#   r$   Úadd_memory_usage_line2  r®   z,_DataFrameTableBuilder.add_memory_usage_lineN)rz   rc   r    rT   r»   r¼   )r    r   r   rZ   )r]   r^   r_   r`   rg   r†   rÀ   r   rÁ   rb   r7   rp   rs   rÆ   r#   r#   r#   r$   r™     s    
	

r™   c                   @  s$   e Zd ZdZd	dd„Zd	dd„ZdS )
rž   z>
    Dataframe info table builder for non-verbose output.
    r    rT   c                 C  s6   |   ¡  |  ¡  |  ¡  |  ¡  | jr|  ¡  dS dS rÂ   )r«   r­   Úadd_columns_summary_linerº   r¨   rÆ   r:   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©   rp   r¬   r:   r#   r#   r$   rÇ   E  ó   z9_DataFrameTableBuilderNonVerbose.add_columns_summary_lineNr¼   )r]   r^   r_   r`   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„ƒƒZed*dd„ƒZ	d*dd„Z
d*dd„Zd+dd„Zed+dd„ƒZed+dd„ƒZd,dd„Zd,dd „Zd,d!d"„Zd-d$d%„Zd-d&d'„Zd(S ).Ú_TableBuilderVerboseMixinz(
    Mixin for verbose info output.
    z  r!   ÚSPACINGzSequence[Sequence[str]]ÚstrrowsrA   Úgross_column_widthsr’   r›   r    úSequence[str]c                 C  r9   )ú.Headers names of the columns in verbose table.Nr#   r:   r#   r#   r$   ÚheadersS  r=   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#   ©rr   ©r²   Úcolr#   r#   r$   rµ   [  s    zB_TableBuilderVerboseMixin.header_column_widths.<locals>.<listcomp>)rÒ   r:   r#   r#   r$   Úheader_column_widthsX  r”   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Ö   )r;   Ú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 rU   rÓ   )r²   r/   r#   r#   r$   Ú	<genexpr>h  s   € zO_TableBuilderVerboseMixin._get_body_column_widths.<locals>.<listcomp>.<genexpr>r×   rÔ   r#   r#   r$   rµ   h  s    zE_TableBuilderVerboseMixin._get_body_column_widths.<locals>.<listcomp>)ÚlistrÛ   rÎ   )r;   Ústrcolsr#   r#   r$   rÚ   e  s   z1_TableBuilderVerboseMixin._get_body_column_widthsúIterator[Sequence[str]]c                 C  s   | j r|  ¡ S |  ¡ S )z„
        Generator function yielding rows content.

        Each element represents a row comprising a sequence of strings.
        )r›   Ú_gen_rows_with_countsÚ_gen_rows_without_countsr:   r#   r#   r$   Ú	_gen_rowsj  s   z#_TableBuilderVerboseMixin._gen_rowsc                 C  r9   ©z=Iterator with string representation of body data with counts.Nr#   r:   r#   r#   r$   râ   u  r=   z/_TableBuilderVerboseMixin._gen_rows_with_countsc                 C  r9   ©z@Iterator with string representation of body data without counts.Nr#   r:   r#   r#   r$   rã   y  r=   z2_TableBuilderVerboseMixin._gen_rows_without_countsrT   c                 C  ó0   | j  dd„ t| j| jƒD ƒ¡}| j |¡ d S )Nc                 S  ó   g | ]	\}}t ||ƒ‘qS r#   ©r%   )r²   ÚheaderÚ	col_widthr#   r#   r$   rµ     ó    ÿÿz=_TableBuilderVerboseMixin.add_header_line.<locals>.<listcomp>)rÍ   r¸   rÛ   rÒ   rÏ   r¥   r©   )r;   Úheader_liner#   r#   r$   Úadd_header_line}  s   þÿz)_TableBuilderVerboseMixin.add_header_linec                 C  rç   )Nc                 S  s   g | ]\}}t d | |ƒ‘qS )ú-ré   )r²   Úheader_colwidthÚgross_colwidthr#   r#   r$   rµ   ˆ  s    ÿÿz@_TableBuilderVerboseMixin.add_separator_line.<locals>.<listcomp>)rÍ   r¸   rÛ   rÖ   rÏ   r¥   r©   )r;   Ú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  rè   r#   ré   )r²   rÕ   rñ   r#   r#   r$   rµ   ”  rì   z<_TableBuilderVerboseMixin.add_body_lines.<locals>.<listcomp>)rÎ   rÍ   r¸   rÛ   rÏ   r¥   r©   )r;   ÚrowÚ	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)rC   )r;   rv   r#   r#   r$   Ú_gen_non_null_counts›  s   €
ÿz._TableBuilderVerboseMixin._gen_non_null_countsc                 c  ó   � | j D ]}t|ƒV  qdS )z5Iterator with string representation of column dtypes.N)r<   r
   )r;   Údtyper#   r#   r$   Ú_gen_dtypes   ó   €
ÿz%_TableBuilderVerboseMixin._gen_dtypesN©r    rÐ   rY   ©r    rá   r¼   ©r    r÷   )r]   r^   r_   r`   rÍ   ra   rb   r   rÒ   rÖ   rÝ   rÚ   rä   râ   rã   rî   ró   rö   rø   rû   r#   r#   r#   r$   rÌ   I  s.   
 




	


rÌ   c                   @  sd   e Zd ZdZddd	„Zdd
d„Zeddd„ƒZddd„Zddd„Z	ddd„Z
d dd„Zd dd„ZdS )!r�   z:
    Dataframe info table builder for verbose output.
    rz   rc   r›   r’   r    rT   c                C  ó(   || _ || _t|  ¡ ƒ| _|  ¡ | _d S rU   ©rz   r›   rß   rä   rÎ   rÝ   rÏ   ©r;   rz   r›   r#   r#   r$   rg   «  ó   z&_DataFrameTableBuilderVerbose.__init__c                 C  óN   |   ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  |  ¡  | jr%|  ¡  dS dS rÂ   )	r«   r­   rÇ   rî   ró   rö   rº   r¨   rÆ   r:   r#   r#   r$   rÁ   ¶  ó   ÿ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›   r:   r#   r#   r$   rÒ   Â  s   z%_DataFrameTableBuilderVerbose.headersc                 C  s   | j  d| j› d�¡ d S )NzData columns (total z
 columns):)r¥   r©   rs   r:   r#   r#   r$   rÇ   É  rË   z6_DataFrameTableBuilderVerbose.add_columns_summary_linerá   c                 c  s$   � t |  ¡ |  ¡ |  ¡ ƒE dH  dS ræ   )rÛ   Ú_gen_line_numbersÚ_gen_columnsrû   r:   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û   r:   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)Ú	enumeraterp   )r;   ÚiÚ_r#   r#   r$   r
  Ý  s   €ÿz/_DataFrameTableBuilderVerbose._gen_line_numbersc                 c  rù   )z4Iterator with string representation of column names.N)rp   r
   )r;   rÕ   r#   r#   r$   r  â  rü   z*_DataFrameTableBuilderVerbose._gen_columnsN)rz   rc   r›   r’   r    rT   r¼   rý   rþ   rÿ   )r]   r^   r_   r`   rg   rÁ   rb   rÒ   rÇ   rã   râ   r
  r  r#   r#   r#   r$   r�   ¦  s    





	r�   c                   @  sJ   e Zd ZdZddd„Zdd	d
„Zeddd„ƒZddd„Ze	ddd„ƒZ
dS )r¡   z‡
    Abstract builder for series info table.

    Parameters
    ----------
    info : SeriesInfo.
        Instance of SeriesInfo.
    rz   r€   r    rT   c                C  r½   rU   rœ   r¾   r#   r#   r$   rg   ò  r¿   z_SeriesTableBuilder.__init__r¤   c                 C  s   g | _ |  ¡  | j S rU   )r¥   rÁ   r:   r#   r#   r$   r†   õ  s   z_SeriesTableBuilder.get_linesr   c                 C  rl   )zSeries.r¦   r:   r#   r#   r$   r7   ú  r—   z_SeriesTableBuilder.datac                 C  rÃ   rÄ   rÅ   r:   r#   r#   r$   rÆ   ÿ  r®   z)_SeriesTableBuilder.add_memory_usage_linec                 C  r9   ©z<Add lines to the info table, pertaining to non-empty series.Nr#   r:   r#   r#   r$   rÁ     r=   z(_SeriesTableBuilder._fill_non_empty_infoN)rz   r€   r    rT   r»   )r    r   r¼   )r]   r^   r_   r`   rg   r†   rb   r7   rÆ   r   rÁ   r#   r#   r#   r$   r¡   è  s    
	

r¡   c                   @  s   e Zd ZdZddd„ZdS )r£   z;
    Series info table builder for non-verbose output.
    r    rT   c                 C  s.   |   ¡  |  ¡  |  ¡  | jr|  ¡  dS dS r  )r«   r­   rº   r¨   rÆ   r:   r#   r#   r$   rÁ     s   ÿz2_SeriesTableBuilderNonVerbose._fill_non_empty_infoNr¼   )r]   r^   r_   r`   rÁ   r#   r#   r#   r$   r£     s    r£   c                   @  sP   e Zd ZdZddd	„Zdd
d„Zddd„Zeddd„ƒZddd„Z	ddd„Z
dS )r¢   z7
    Series info table builder for verbose output.
    rz   r€   r›   r’   r    rT   c                C  r   rU   r  r  r#   r#   r$   rg     r  z#_SeriesTableBuilderVerbose.__init__c                 C  r  r  )	r«   r­   Úadd_series_name_linerî   ró   rö   rº   r¨   rÆ   r:   r#   r#   r$   rÁ   &  r  z/_SeriesTableBuilderVerbose._fill_non_empty_infoc                 C  s   | j  d| jj› �¡ d S )NzSeries name: )r¥   r©   r7   rÊ   r:   r#   r#   r$   r  2  rË   z/_SeriesTableBuilderVerbose.add_series_name_linerÐ   c                 C  s   | j rddgS dgS )rÑ   r  r   r	  r:   r#   r#   r$   rÒ   5  s   z"_SeriesTableBuilderVerbose.headersrá   c                 c  s   � |   ¡ E dH  dS ræ   )rû   r:   r#   r#   r$   rã   <  s   €z3_SeriesTableBuilderVerbose._gen_rows_without_countsc                 c  s   � t |  ¡ |  ¡ ƒE dH  dS rå   )rÛ   rø   rû   r:   r#   r#   r$   râ   @  s
   €þz0_SeriesTableBuilderVerbose._gen_rows_with_countsN)rz   r€   r›   r’   r    rT   r¼   rý   rþ   )r]   r^   r_   r`   rg   rÁ   r  rb   rÒ   rã   râ   r#   r#   r#   r$   r¢     s    



r¢   Údfr>   c                 C  s   | j  ¡  dd„ ¡ ¡ S )zK
    Create mapping between datatypes and their number of occurrences.
    c                 S  s   | j S rU   rÉ   )r/   r#   r#   r$   Ú<lambda>M  s    z-_get_dataframe_dtype_counts.<locals>.<lambda>)r<   Úvalue_countsÚgroupbyrx   )r  r#   r#   r$   rj   H  s   rj   )r   r   r   r   r    r!   )r&   r'   r(   r!   r    r!   rU   )r1   r2   r    r3   )r  r   r    r>   )8Ú
__future__r   Úabcr   r   r‡   Útextwrapr   Útypingr   Úpandas._configr   Úpandas.io.formatsr	   r‰   Úpandas.io.formats.printingr
   Úcollections.abcr   r   r   r   Úpandas._typingr   r   Úpandasr   r   r   Úframe_max_cols_subr   Úframe_examples_subÚframe_see_also_subÚframe_sub_kwargsÚseries_examples_subÚseries_see_also_subÚseries_sub_kwargsÚINFO_DOCSTRINGr%   r0   r4   r5   rc   r€   r„   r{   r‚   r�   r™   rž   rÌ   r�   r¡   r£   r¢   rj   r#   r#   r#   r$   Ú<module>   sˆ    ÿ
ÿÿVÿ	ùÿ>ÿùÿ
3
 ÿ	SI<P+83]B 2