a
    Sic                  	   @  s0  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	m
Z
mZmZmZ d dlmZ d dlmZmZ d dlmZ d d	lmZ e	rd d
lmZmZmZ edZedZedZedZedZ ddeeeee ddZ!edZ"edZ#ddded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IterableIteratorMappingSequence
get_option)DtypeWriteBuffer)format)pprint_thing)	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.zd
    null_counts : bool, optional
        .. deprecated:: 1.2.0
            Use show_counts instead.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_subnull_counts_subZexamples_sub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'>
    Int64Index: 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'>
    Int64Index: 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}{null_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   R/var/www/html/django/DPS/env/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_fmtG  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_usagef  s    r0   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    dtypes  s    zBaseInfo.dtypesMapping[str, int]c                 C  s   dS )!Mapping dtype - number of counts.Nr   r6   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   r6   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   r6   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$   r6   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/   r;   r3   index_is_memory_usage_qualified)r7   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   )r7   rL   rM   rN   rO   r   r   r    render  s    	zBaseInfo.renderN)__name__
__module____qualname____doc____annotations__propertyr   r8   r;   r>   r?   rA   r$   rQ   r   r   r   r    r1   o  s*   


r1   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-   rJ   r3   r/   r   c                 C  s   || _ t|| _d S rP   r3   r0   r/   r7   r3   r/   r   r   r    __init__  s    zDataFrameInfo.__init__r9   r5   c                 C  s
   t | jS rP   )_get_dataframe_dtype_countsr3   r6   r   r   r    r;     s    zDataFrameInfo.dtype_countsr4   c                 C  s   | j jS )z
        Dtypes.

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

        Returns
        -------
        ids : Index
            DataFrame's column names.
        )r3   columnsr6   r   r   r    ids  s    
zDataFrameInfo.idsr   c                 C  s
   t | jS z#Number of columns to be summarized.)lenr`   r6   r   r   r    	col_count  s    zDataFrameInfo.col_countr<   c                 C  s
   | j  S )r=   r3   countr6   r   r   r    r>     s    zDataFrameInfo.non_null_countsc                 C  s(   | j dkrd}nd}| jj d|d S )NrB   TFrE   rB   )r/   r3   sumr7   rB   r   r   r    r?     s    
z DataFrameInfo.memory_usage_bytesrG   rH   rI   rK   c                C  s   t | |||d}|| d S )N)inforM   rN   rO   )DataFrameInfoPrinter	to_bufferr7   rL   rM   rN   rO   printerr   r   r    rQ     s    zDataFrameInfo.render)N)rR   rS   rT   rU   r\   rW   r;   r8   r`   rc   r>   r?   rQ   r   r   r   r    rX     s     rX   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-   rJ   rY   c                 C  s   || _ t|| _d S rP   rZ   r[   r   r   r    r\     s    zSeriesInfo.__init__)rL   rM   rN   rO   rG   rH   rI   rK   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)ri   rN   rO   )
ValueErrorSeriesInfoPrinterrk   rl   r   r   r    rQ     s    zSeriesInfo.renderr<   r5   c                 C  s   | j  gS rP   rd   r6   r   r   r    r>   /  s    zSeriesInfo.non_null_countsr4   c                 C  s
   | j jgS rP   r^   r6   r   r   r    r8   3  s    zSeriesInfo.dtypesr9   c                 C  s   ddl m} t|| jS )Nr   )r   )pandas.core.framer   r]   r3   )r7   r   r   r   r    r;   7  s    zSeriesInfo.dtype_countsr   c                 C  s$   | j dkrd}nd}| jj d|dS )zMemory usage in bytes.

        Returns
        -------
        memory_usage_bytes : int
            Object's total memory usage in bytes.
        rB   TFrf   )r/   r3   rh   r   r   r    r?   =  s    	
zSeriesInfo.memory_usage_bytes)N)rR   rS   rT   rU   r\   rQ   rW   r>   r8   r;   r?   r   r   r   r    rn     s     rn   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.
    NrG   rJ   )rL   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fmtbuffer_put_lines)r7   rL   Ztable_builderlinesr   r   r    rk   R  s
    zInfoPrinterAbstract.to_bufferTableBuilderAbstractr5   c                 C  s   dS )z!Create instance of table builder.Nr   r6   r   r   r    rs   Z  s    z)InfoPrinterAbstract._create_table_builder)N)rR   rS   rT   rU   rk   r   rs   r   r   r   r    rr   M  s   rr   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 )rj   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.
    NrX   rH   rI   rJ   )ri   rM   rN   rO   r   c                 C  s0   || _ |j| _|| _| || _| || _d S rP   )ri   r3   rN   _initialize_max_colsrM   _initialize_show_countsrO   )r7   ri   rM   rN   rO   r   r   r    r\   o  s
    zDataFrameInfoPrinter.__init__r   r5   c                 C  s   t dt| jd S )z"Maximum info rows to be displayed.zdisplay.max_info_rows   )r   rb   r3   r6   r   r   r    max_rows|  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.)r   rc   rM   r6   r   r   r    exceeds_info_cols  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.)r   rb   r3   r~   r6   r   r   r    exceeds_info_rows  s    z&DataFrameInfoPrinter.exceeds_info_rowsc                 C  s   | j jS ra   ri   rc   r6   r   r   r    rc     s    zDataFrameInfoPrinter.col_count)rM   r   c                 C  s   |d u rt d| jd S |S )Nzdisplay.max_info_columnsr}   )r   rc   )r7   rM   r   r   r    r{     s    z)DataFrameInfoPrinter._initialize_max_colsrO   r   c                 C  s$   |d u rt | j o| j S |S d S rP   )r   r   r   r7   rO   r   r   r    r|     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.
        ri   with_countsFri   N)rN   DataFrameTableBuilderVerboseri   rO   DataFrameTableBuilderNonVerboser   r6   r   r   r    rs     s    
z*DataFrameInfoPrinter._create_table_builder)NNN)rR   rS   rT   rU   r\   rW   r~   r   r   rc   r{   r|   rs   r   r   r   r    rj   _  s       rj   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 )rp   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.
    Nrn   rI   rJ   )ri   rN   rO   r   c                 C  s$   || _ |j| _|| _| || _d S rP   )ri   r3   rN   r|   rO   )r7   ri   rN   rO   r   r   r    r\     s    zSeriesInfoPrinter.__init__SeriesTableBuilderr5   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   )rN   SeriesTableBuilderVerboseri   rO   SeriesTableBuilderNonVerboser6   r   r   r    rs     s    z'SeriesInfoPrinter._create_table_builderr   r   c                 C  s   |d u rdS |S d S )NTr   r   r   r   r    r|     s    z)SeriesInfoPrinter._initialize_show_counts)NN)rR   rS   rT   rU   r\   rs   r|   r   r   r   r    rp     s     rp   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 )#rz   z*
    Abstract builder for info table.
    	list[str]_linesr1   ri   r5   c                 C  s   dS )z-Product in a form of list of lines (strings).Nr   r6   r   r   r    rt     s    zTableBuilderAbstract.get_linesr2   c                 C  s   | j jS rP   ri   r3   r6   r   r   r    r3     s    zTableBuilderAbstract.datar4   c                 C  s   | j jS )z*Dtypes of each of the DataFrame's columns.)ri   r8   r6   r   r   r    r8     s    zTableBuilderAbstract.dtypesr9   c                 C  s   | j jS )r:   )ri   r;   r6   r   r   r    r;     s    z!TableBuilderAbstract.dtype_countsr   c                 C  s   t | jjS )z Whether to display memory usage.)r   ri   r/   r6   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.)ri   rA   r6   r   r   r    rA     s    z(TableBuilderAbstract.memory_usage_stringr<   c                 C  s   | j jS rP   )ri   r>   r6   r   r   r    r>     s    z$TableBuilderAbstract.non_null_countsrJ   c                 C  s   | j tt| j dS )z>Add line with string representation of dataframe to the table.N)r   appendr   typer3   r6   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   r3   rE   _summaryr6   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   z8TableBuilderAbstract.add_dtypes_line.<locals>.<listcomp>zdtypes: z, N)sortedr;   itemsr   r   join)r7   Zcollected_dtypesr   r   r    add_dtypes_line  s    z$TableBuilderAbstract.add_dtypes_lineN)rR   rS   rT   rU   rV   r   rt   rW   r3   r8   r;   r   rA   r>   r   r   r   r   r   r   r    rz     s(   
rz   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.
    rX   rJ   ri   r   c                C  s
   || _ d S rP   r   r7   ri   r   r   r    r\     s    zDataFrameTableBuilder.__init__r   r5   c                 C  s(   g | _ | jdkr|   n|   | j S )Nr   )r   rc   _fill_empty_info_fill_non_empty_infor6   r   r   r    rt      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   r3   rR   r6   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   r6   r   r   r    r   .  s    z*DataFrameTableBuilder._fill_non_empty_infor   c                 C  s   | j jS )z
DataFrame.r   r6   r   r   r    r3   2  s    zDataFrameTableBuilder.datar   c                 C  s   | j jS )zDataframe columns.)ri   r`   r6   r   r   r    r`   7  s    zDataFrameTableBuilder.idsr   c                 C  s   | j jS )z-Number of dataframe columns to be summarized.r   r6   r   r   r    rc   <  s    zDataFrameTableBuilder.col_countc                 C  s   | j d| j  dS z!Add line containing memory usage.zmemory usage: Nr   r   rA   r6   r   r   r    add_memory_usage_lineA  s    z+DataFrameTableBuilder.add_memory_usage_lineN)rR   rS   rT   rU   r\   rt   r   r   r   rW   r3   r`   rc   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.
    rJ   r5   c                 C  s2   |    |   |   |   | jr.|   dS r   )r   r   add_columns_summary_liner   r   r   r6   r   r   r    r   K  s    z4DataFrameTableBuilderNonVerbose._fill_non_empty_infoc                 C  s   | j | jjdd d S )NColumnsname)r   r   r`   r   r6   r   r   r    r   T  s    z8DataFrameTableBuilderNonVerbose.add_columns_summary_lineN)rR   rS   rT   rU   r   r   r   r   r   r    r   F  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_widthsr   r   Sequence[str]r5   c                 C  s   dS ).Headers names of the columns in verbose table.Nr   r6   r   r   r    headersb  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   rb   r   colr   r   r    r   j      zATableBuilderVerboseMixin.header_column_widths.<locals>.<listcomp>)r   r6   r   r   r    header_column_widthsg  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   o  s   zETableBuilderVerboseMixin._get_gross_column_widths.<locals>.<listcomp>)_get_body_column_widthszipr   )r7   Zbody_column_widthsr   r   r    _get_gross_column_widthsl  s    
z1TableBuilderVerboseMixin._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 rP   r   )r   r+   r   r   r    	<genexpr>w  r   zNTableBuilderVerboseMixin._get_body_column_widths.<locals>.<listcomp>.<genexpr>r   r   r   r   r    r   w  r   zDTableBuilderVerboseMixin._get_body_column_widths.<locals>.<listcomp>)listr   r   )r7   strcolsr   r   r    r   t  s    z0TableBuilderVerboseMixin._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_countsr6   r   r   r    	_gen_rowsy  s    z"TableBuilderVerboseMixin._gen_rowsc                 C  s   dS z=Iterator with string representation of body data with counts.Nr   r6   r   r   r    r     s    z.TableBuilderVerboseMixin._gen_rows_with_countsc                 C  s   dS z@Iterator with string representation of body data without counts.Nr   r6   r   r   r    r     s    z1TableBuilderVerboseMixin._gen_rows_without_countsrJ   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   )r7   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   header_colwidthgross_colwidthr   r   r    r     s   z?TableBuilderVerboseMixin.add_separator_line.<locals>.<listcomp>)r   r   r   r   r   r   r   )r7   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   )r7   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>   )r7   re   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)r8   r   )r7   dtyper   r   r    _gen_dtypes  s    
z$TableBuilderVerboseMixin._gen_dtypesN)rR   rS   rT   rU   r   rV   rW   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r   X  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.
    rX   r   rJ   ri   r   r   c                C  s(   || _ || _t|  | _|  | _d S rP   ri   r   r   r   r   r   r   r7   ri   r   r   r   r    r\     s    z%DataFrameTableBuilderVerbose.__init__r5   c                 C  sJ   |    |   |   |   |   |   |   | jrF|   dS r   )	r   r   r   r   r   r   r   r   r   r6   r   r   r    r     s    z1DataFrameTableBuilderVerbose._fill_non_empty_infor   c                 C  s   | j rg dS g dS )r   ) # ColumnNon-Null Countr   )r   r   r   r   r6   r   r   r    r     s    z$DataFrameTableBuilderVerbose.headersc                 C  s   | j d| j d d S )NzData columns (total z
 columns):)r   r   rc   r6   r   r   r    r     s    z5DataFrameTableBuilderVerbose.add_columns_summary_liner   c                 c  s"   t |  |  |  E dH  dS r   )r   _gen_line_numbers_gen_columnsr   r6   r   r   r    r     s
    z5DataFrameTableBuilderVerbose._gen_rows_without_countsc                 c  s(   t |  |  |  |  E dH  dS r   )r   r   r   r   r   r6   r   r   r    r     s    z2DataFrameTableBuilderVerbose._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`   )r7   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   )r7   r   r   r   r    r     s    
z)DataFrameTableBuilderVerbose._gen_columnsN)rR   rS   rT   rU   r\   r   rW   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.
    rn   rJ   r   c                C  s
   || _ d S rP   r   r   r   r   r    r\     s    zSeriesTableBuilder.__init__r   r5   c                 C  s   g | _ |   | j S rP   )r   r   r6   r   r   r    rt     s    zSeriesTableBuilder.get_linesr   c                 C  s   | j jS )zSeries.r   r6   r   r   r    r3   	  s    zSeriesTableBuilder.datac                 C  s   | j d| j  dS r   r   r6   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   r6   r   r   r    r     s    z'SeriesTableBuilder._fill_non_empty_infoN)rR   rS   rT   rU   r\   rt   rW   r3   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.
    rJ   r5   c                 C  s*   |    |   |   | jr&|   dS r   )r   r   r   r   r   r6   r   r   r    r     s
    z1SeriesTableBuilderNonVerbose._fill_non_empty_infoN)rR   rS   rT   rU   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.
    rn   r   rJ   r   c                C  s(   || _ || _t|  | _|  | _d S rP   r   r   r   r   r    r\   *  s    z"SeriesTableBuilderVerbose.__init__r5   c                 C  sJ   |    |   |   |   |   |   |   | jrF|   dS r   )	r   r   add_series_name_liner   r   r   r   r   r   r6   r   r   r    r   5  s    z.SeriesTableBuilderVerbose._fill_non_empty_infoc                 C  s   | j d| jj  d S )NzSeries name: )r   r   r3   r   r6   r   r   r    r   A  s    z.SeriesTableBuilderVerbose.add_series_name_liner   c                 C  s   | j rddgS dgS )r   r   r   r   r6   r   r   r    r   D  s    z!SeriesTableBuilderVerbose.headersr   c                 c  s   |   E dH  dS r   )r   r6   r   r   r    r   K  s    z2SeriesTableBuilderVerbose._gen_rows_without_countsc                 c  s   t |  |  E dH  dS r   )r   r   r   r6   r   r   r    r   O  s    z/SeriesTableBuilderVerbose._gen_rows_with_countsN)rR   rS   rT   rU   r\   r   r   rW   r   r   r   r   r   r   r    r   %  s   r   r9   )dfr   c                 C  s   | j  dd  S )zK
    Create mapping between datatypes and their number of occurrences.
    c                 S  s   | j S rP   r   )r+   r   r   r    <lambda>\  r   z-_get_dataframe_dtype_counts.<locals>.<lambda>)r8   value_countsgroupbyrg   )r   r   r   r    r]   W  s    r]   )N)8
__future__r   abcr   r   ru   textwrapr   typingr   r   r   r	   r
   pandas._configr   pandas._typingr   r   pandas.io.formatsr   rw   pandas.io.formats.printingr   pandasr   r   r   Zframe_max_cols_subr   r   Zframe_examples_subZframe_see_also_subframe_sub_kwargsZseries_examples_subZseries_see_also_subseries_sub_kwargsINFO_DOCSTRINGr!   r,   r0   r1   rX   rn   rr   rj   rp   rz   r   r   r   r   r   r   r   r]   r   r   r   r    <module>   s   

V	>3  	SL?Q+83]B 2