o
    ҷh)                    @  sN  U d 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 ddlmZ dd	lZdd	lZdd
lmZ ddlmZmZmZmZmZmZ ddlm Z  dd	l!Z"ddl#m$Z$m%Z% ddl&m'Z' ddl(m)Z) ddl*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0 ddl1m2Z2 ddl3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 ddl:m;Z;m<Z<m=Z= ddl>m?Z?m@Z@ ddlAmBZBmCZCmDZD ddlEmFZF ddlGmHZH dd	lImJ  mKZL ddlMmNZN ddlOmPZPmQZQmRZRmSZS ddlTmUZU ddlVmWZW ddlXmYZY ddlZm[Z[m\Z\ ddl]m^Z^ er!ddl_m`Z`maZambZbmcZcmdZdmeZemfZfmgZgmhZhmiZimjZj dd lkmlZlmmZm d!Znd"eod#< d$Zpd%Zqd"eod&< G d'd( d(ZrG d)d* d*ZsG d+d, d,ZtG d-d. d.etZudd0d1Zvdd3d4Zwdd5d6ZxG d7d8 d8ZyG d9d: d:Zz				dddAdBZ{e
		dddDdEZ|			F					G	H	I				ddd\d]Z}G d^d_ d_Z~G d`da dae~ZG dbdc dce~ZG ddde dee~ZG dfdg dge~ZddjdkZddndoZdddtduZ	p		dddwdxZ		ddd{d|Zdd~dZG dd deZG dd de~Z	p	ddddZ	G				ddddZddddZdddZ	HddddZdddZG dd dZddddZ	ddddZdddZd	S )z
Internal module for formatting output data in csv, html, xml,
and latex files. This module also applies to display formatting.
    )annotations)	GeneratorHashableIterableMappingSequence)contextmanager)
QUOTE_NONEQUOTE_NONNUMERIC)Decimal)partial)StringION)get_terminal_size)IOTYPE_CHECKINGAnyCallableFinalcast)east_asian_width)
get_option
set_option)lib)NA)NaT	Timedelta	Timestampget_unit_from_dtypeiNaTperiods_per_day)NaTType)is_complex_dtypeis_float
is_integeris_list_likeis_numeric_dtype	is_scalar)CategoricalDtypeDatetimeTZDtypeExtensionDtype)isnanotna)CategoricalDatetimeArrayTimedeltaArray)StringDtype)PandasObject)extract_array)Index
MultiIndexPeriodIndexensure_index)DatetimeIndex)TimedeltaIndex)concat)check_parent_directorystringify_path)printing)	ArrayLikeAxesColspaceArgTypeColspaceTypeCompressionOptionsFilePathFloatFormatTypeFormattersType
IndexLabelStorageOptionsWriteBuffer)	DataFrameSeriesa	  
        Parameters
        ----------
        buf : str, Path or StringIO-like, optional, default None
            Buffer to write to. If None, the output is returned as a string.
        columns : array-like, optional, default None
            The subset of columns to write. Writes all columns by default.
        col_space : %(col_space_type)s, optional
            %(col_space)s.
        header : %(header_type)s, optional
            %(header)s.
        index : bool, optional, default True
            Whether to print index (row) labels.
        na_rep : str, optional, default 'NaN'
            String representation of ``NaN`` to use.
        formatters : list, tuple or dict of one-param. functions, optional
            Formatter functions to apply to columns' elements by position or
            name.
            The result of each function must be a unicode string.
            List/tuple must be of length equal to the number of columns.
        float_format : one-parameter function, optional, default None
            Formatter function to apply to columns' elements if they are
            floats. This function must return a unicode string and will be
            applied only to the non-``NaN`` elements, with ``NaN`` being
            handled by ``na_rep``.

            .. versionchanged:: 1.2.0

        sparsify : bool, optional, default True
            Set to False for a DataFrame with a hierarchical index to print
            every multiindex key at each row.
        index_names : bool, optional, default True
            Prints the names of the indexes.
        justify : str, default None
            How to justify the column labels. If None uses the option from
            the print configuration (controlled by set_option), 'right' out
            of the box. Valid values are

            * left
            * right
            * center
            * justify
            * justify-all
            * start
            * end
            * inherit
            * match-parent
            * initial
            * unset.
        max_rows : int, optional
            Maximum number of rows to display in the console.
        max_cols : int, optional
            Maximum number of columns to display in the console.
        show_dimensions : bool, default False
            Display DataFrame dimensions (number of rows by number of columns).
        decimal : str, default '.'
            Character recognized as decimal separator, e.g. ',' in Europe.
    r   common_docstring)leftrightcenterjustifyzjustify-allstartendinheritzmatch-parentinitialunsetz
        Returns
        -------
        str or None
            If buf is None, returns the result as a string. Otherwise returns
            None.
    return_docstringc                   @  s>   e Zd Z				ddddZdddZdddZdddZdS )CategoricalFormatterNTNaNcategoricalr,   bufIO[str] | Nonelengthboolna_repstrfooterreturnNonec                 C  s8   || _ |d ur	|ntd| _|| _|| _|| _t| _d S N )rV   r   rW   r[   rY   r]   r
   quoting)selfrV   rW   rY   r[   r]    rd   K/var/www/html/venv/lib/python3.10/site-packages/pandas/io/formats/format.py__init__   s   
zCategoricalFormatter.__init__c                 C  sP   d}| j r|r|d7 }|dt| j 7 }| j }|r |d7 }||7 }t|S )Nra   , Length: 
)rY   lenrV   _repr_categories_infor\   )rc   r]   
level_inford   rd   re   _get_footer   s   
z CategoricalFormatter._get_footer	list[str]c                 C  s   t | j d d | j| jdS )N)float_formatr[   rb   )format_arrayrV   _internal_get_valuesr[   rb   rc   rd   rd   re   _get_formatted_values   s   z*CategoricalFormatter._get_formatted_valuesc                 C  s|   | j }t|dkr| jr|  S dS |  }dd |D }d|}d| d g}| jr7|  }|r7|| td|S )	Nr   ra   c                 S  s   g | ]}|  qS rd   )strip.0ird   rd   re   
<listcomp>       z2CategoricalFormatter.to_string.<locals>.<listcomp>rg   []ri   )rV   rj   r]   rm   rs   joinappendr\   )rc   rV   
fmt_valuesvaluesresultr]   rd   rd   re   	to_string   s   

zCategoricalFormatter.to_string)NTrU   T)rV   r,   rW   rX   rY   rZ   r[   r\   r]   rZ   r^   r_   r^   r\   r^   rn   )__name__
__module____qualname__rf   rm   rs   r   rd   rd   rd   re   rT      s    

	rT   c                   @  s^   e Zd Z										d'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 )-SeriesFormatterNTrU   FseriesrH   rW   rX   rY   
bool | strheaderrZ   indexr[   r\   namero   
str | Nonedtypemax_rows
int | Nonemin_rowsr^   r_   c                 C  st   || _ |d ur	|nt | _|| _|| _|| _|| _|| _|
| _|| _	|d u r*t
d}|| _|	| _t | _|   d S )Ndisplay.float_format)r   r   rW   r   r[   r   rY   r   r   r   r   ro   r   get_adjustmentadj_chk_truncate)rc   r   rW   rY   r   r   r[   r   ro   r   r   r   rd   rd   re   rf   	  s   zSeriesFormatter.__init__c                 C  s   |  | j }| j}|ot| j|k}| j}|rItt|}|r"t||}|dkr0|}|jd | }n|d }t|jd | |j| d  f}|| _	nd | _	|| _
|| _d S )N      )r   r   rj   r   r   intminilocr8   
tr_row_num	tr_seriesis_truncated_vertically)rc   r   r   r   r   row_numrd   rd   re   r   )  s$   

"
zSeriesFormatter._chk_truncatec                 C  s>  | j j}d}t| j jdd d ur&t| j jtttfsJ |d| j jj 7 }| jdurC|d urC|r5|d7 }t	j
|dd}|d| 7 }| jd	u sP| jd
kr`| jr`|rV|d7 }|dt| j  7 }| jdur| jd urt| jjdd }|r|rz|d7 }|dt	
| 7 }t| jjtr| jj }|r|d7 }||7 }t|S )Nra   freqzFreq: Frg   	ri   )escape_charszName: Ttruncaterh   r   zdtype: ri   )r   r   getattrr   
isinstancer6   r4   r7   freqstrr;   pprint_thingrY   r   rj   r   r   r'   _valuesrk   r\   )rc   r   r]   series_name
dtype_namerl   rd   rd   re   rm   D  s:   
zSeriesFormatter._get_footertuple[list[str], bool]c                 C  sX   | j j}t|trtdd |jD }|jdd}||fS |jd u}|jdd}||fS )Nc                 s  s    | ]}|V  qd S Nrd   rv   r   rd   rd   re   	<genexpr>q  s    z7SeriesFormatter._get_formatted_index.<locals>.<genexpr>T)names)r   )r   r   r   r3   anyr   formatr   )rc   r   have_header	fmt_indexrd   rd   re   _get_formatted_indexm  s   

z$SeriesFormatter._get_formatted_indexrn   c                 C  s   t | jjd | j| j| jdS )N)ro   r[   leading_space)rp   r   r   ro   r[   r   rr   rd   rd   re   rs   x  s   z%SeriesFormatter._get_formatted_valuesc                 C  s,  | j }|  }t|dkrt| jj d| dS |  \}}|  }| jr_d}| j	}t
t|}| j||d  }|dkrAd}	nd}	| jj|	g|dd	d }	||| |	 ||d d
 | jrs| jjdg|dd  |gR  }
n| jd|}
| jr|r|d d |
 }
|r|
d| 7 }
td
|
S )Nr   z([], )r      ...z..rL   modera   ri   )r   rm   rj   typer   r   r   rs   r   r   r   r   r   rM   insertr   adjoinr   r\   r|   )rc   r   r]   r   r   r~   n_header_rowsr   widthdot_strr   rd   rd   re   r     s2   
"
zSeriesFormatter.to_string)
NTTTrU   FNTNN)r   rH   rW   rX   rY   r   r   rZ   r   rZ   r[   r\   r   rZ   ro   r   r   rZ   r   r   r   r   r^   r_   r^   r_   r   )r^   r   r   )	r   r   r   rf   r   rm   r   rs   r   rd   rd   rd   re   r     s"    
 

)
	r   c                   @  s6   e Zd ZdddZddd	ZddddZdddZdS )TextAdjustmentr^   r_   c                 C  s   t d| _d S )Nzdisplay.encoding)r   encodingrr   rd   rd   re   rf     s   zTextAdjustment.__init__textr\   r   c                 C  s   t |S r   rj   rc   r   rd   rd   re   rj     s   zTextAdjustment.lenrK   textsr   max_lenr   rn   c                 C  s   t j|||dS )Nr   )r;   rM   rc   r   r   r   rd   rd   re   rM        zTextAdjustment.justifyspacec                 O  s"   t j|g|R | j| jd|S )N)strlenjustfunc)r;   r   rj   rM   )rc   r   listskwargsrd   rd   re   r     s   zTextAdjustment.adjoinNr   r   r\   r^   r   rK   )r   r   r   r   r   r\   r^   rn   )r   r   r^   r\   )r   r   r   rf   rj   rM   r   rd   rd   rd   re   r     s
    

r   c                      s6   e Zd Zd fddZddd	Z	
ddddZ  ZS )EastAsianTextAdjustmentr^   r_   c                   s6   t    tdrd| _nd| _dddddd| _d S )Nz!display.unicode.ambiguous_as_wider   r   )NaNWFH)superrf   r   ambiguous_width_EAW_MAPrr   	__class__rd   re   rf     s
   
z EastAsianTextAdjustment.__init__r   r\   r   c                   s(   t |ts	t|S t fdd|D S )zN
        Calculate display width considering unicode East Asian Width
        c                 3  s$    | ]} j t| jV  qd S r   )r   getr   r   )rv   crr   rd   re   r     s    
z.EastAsianTextAdjustment.len.<locals>.<genexpr>)r   r\   rj   sumr   rd   rr   re   rj     s
   
zEastAsianTextAdjustment.lenrK   r   Iterable[str]r   r   rn   c                   sT   fdd |dkr fdd|D S |dkr! fdd|D S  fdd|D S )	Nc                   s     |  t |  S r   r   )t)r   rc   rd   re   _get_pad     z1EastAsianTextAdjustment.justify.<locals>._get_padrJ   c                      g | ]	}|  |qS rd   )ljustrv   xr   rd   re   rx         z3EastAsianTextAdjustment.justify.<locals>.<listcomp>rL   c                   r   rd   )rL   r   r   rd   re   rx     r   c                   r   rd   )rjustr   r   rd   re   rx     r   rd   r   rd   )r   r   rc   re   rM     s   zEastAsianTextAdjustment.justifyr   r   r   )r   r   r   r   r   r\   r^   rn   )r   r   r   rf   rj   rM   __classcell__rd   rd   r   re   r     s
    
r   r^   c                  C  s   t d} | r	t S t S )Nz display.unicode.east_asian_width)r   r   r   )use_east_asian_widthrd   rd   re   r     s   r   dict[str, Any]c                  C  sL   ddl m}  tdr|  \}}nd}tdtdtdtdtd	|d
S )a  Get the parameters used to repr(dataFrame) calls using DataFrame.to_string.

    Supplying these parameters to DataFrame.to_string is equivalent to calling
    ``repr(DataFrame)``. This is useful if you want to adjust the repr output.

    .. versionadded:: 1.4.0

    Example
    -------
    >>> import pandas as pd
    >>>
    >>> df = pd.DataFrame([[1, 2], [3, 4]])
    >>> repr_params = pd.io.formats.format.get_dataframe_repr_params()
    >>> repr(df) == df.to_string(**repr_params)
    True
    r   )consolezdisplay.expand_frame_reprNdisplay.max_rowsdisplay.min_rowszdisplay.max_columnsdisplay.max_colwidthdisplay.show_dimensions)r   r   max_colsmax_colwidthshow_dimensions
line_width)pandas.io.formatsr   r   get_console_size)r   r   _rd   rd   re   get_dataframe_repr_params  s   r   c                  C  sN   t  \} }tddkr|ntd}tddkr|ntd}dd||tddS )a  Get the parameters used to repr(Series) calls using Series.to_string.

    Supplying these parameters to Series.to_string is equivalent to calling
    ``repr(series)``. This is useful if you want to adjust the series repr output.

    .. versionadded:: 1.4.0

    Example
    -------
    >>> import pandas as pd
    >>>
    >>> ser = pd.Series([1, 2, 3, 4])
    >>> repr_params = pd.io.formats.format.get_series_repr_params()
    >>> repr(ser) == ser.to_string(**repr_params)
    True
    r   r   r   Tr   )r   r   r   r   rY   )r   r   )r   heightr   r   rd   rd   re   get_series_repr_params  s   
r   c                   @  s  e Zd ZdZer
endZeee 7 Z																	dtdud(d)Zdvd+d,Zedwd-d.Z	edwd/d0Z
edwd1d2Zedwd3d4Zedxd5d6Zedwd7d8Zedwd9d:Zedwd;d<Zedwd=d>Zedyd@dAZdzdBdCZd{dEdFZd|dGdHZd}dJdKZd~dMdNZddOdPZddQdRZddSdTZdwdUdVZdwdWdXZdwdYdZZdyd[d\Zdd]d^Zdd_d`Z ddadbZ!dvdcddZ"ddgdhZ#ddkdlZ$ddmdnZ%ddodpZ&ddrdsZ'dS )DataFrameFormatterz;Class for processing dataframe formatting options and data.ra   NTrU   F.framerG   columnsAxes | None	col_spaceColspaceArgType | Noner   bool | list[str]r   rZ   r[   r\   
formattersFormattersType | NonerM   r   ro   FloatFormatType | Nonesparsifybool | Noneindex_namesr   r   r   r   r   r   decimal	bold_rowsescaper^   r_   c                 C  s   || _ | || _| || _|| _|| _|| _| || _	| 
|| _|	| _| |
| _|| _|| _|| _|| _|| _|| _|| _|| _|  | _|  | _| j | _|   t | _d S r   )r   _initialize_columnsr  _initialize_colspacer  r   r   r[   _initialize_formattersr  _initialize_justifyrM   ro   _initialize_sparsifyr	  show_index_namesr  r  r  r   r   r   r   _calc_max_cols_fittedmax_cols_fitted_calc_max_rows_fittedmax_rows_fittedtr_framer   r   r   )rc   r   r  r  r   r   r[   r  rM   ro   r	  r  r   r   r   r   r  r  r  rd   rd   re   rf   4  s.   

zDataFrameFormatter.__init__list[list[str]]c                 C  s*   |   }| jr| | j}|d| |S )zP
        Render a DataFrame to a list of columns (as lists of strings).
        r   )_get_strcols_without_indexr   r   r  r   )rc   strcols	str_indexrd   rd   re   get_strcolsc  s
   zDataFrameFormatter.get_strcolsc                 C  s   | j du p| j dko| jS )NTr   )r   is_truncatedrr   rd   rd   re   should_show_dimensionso  s   
z)DataFrameFormatter.should_show_dimensionsc                 C  s   t | jp| jS r   )rZ   is_truncated_horizontallyr   rr   rd   rd   re   r  u  s   zDataFrameFormatter.is_truncatedc                 C     t | jot| j| jkS r   )rZ   r  rj   r  rr   rd   rd   re   r!  y     z,DataFrameFormatter.is_truncated_horizontallyc                 C  r"  r   )rZ   r  rj   r   rr   rd   rd   re   r   }  r#  z*DataFrameFormatter.is_truncated_verticallyc                 C  s    dt | j dt | jj dS )Nz

[z rows x z	 columns])rj   r   r  rr   rd   rd   re   dimensions_info  s    z"DataFrameFormatter.dimensions_infoc                 C     t | jjS r   )
_has_namesr   r   rr   rd   rd   re   has_index_names     z"DataFrameFormatter.has_index_namesc                 C  r%  r   )r&  r   r  rr   rd   rd   re   has_column_names  r(  z#DataFrameFormatter.has_column_namesc                 C     t | j| j| jfS r   )allr'  r   r  rr   rd   rd   re   show_row_idx_names     z%DataFrameFormatter.show_row_idx_namesc                 C  r*  r   )r+  r)  r  r   rr   rd   rd   re   show_col_idx_names  r-  z%DataFrameFormatter.show_col_idx_namesr   c                 C  s   t | jpt| jt| jS r   )r   r   rj   r   rr   rd   rd   re   max_rows_displayed  s   z%DataFrameFormatter.max_rows_displayedc                 C     |d u rt dS |S )Nzdisplay.multi_sparser   )rc   r	  rd   rd   re   r    s   z'DataFrameFormatter._initialize_sparsifyrC   c                 C  sP   |d u ri S t | jjt |kst|tr|S tdt | dt | jj d)NzFormatters length(+) should match DataFrame number of columns(r   )rj   r   r  r   dict
ValueError)rc   r  rd   rd   re   r    s   
z)DataFrameFormatter._initialize_formattersc                 C  r0  )Nzdisplay.colheader_justifyr1  )rc   rM   rd   rd   re   r    s   z&DataFrameFormatter._initialize_justifyr2   c                 C  s(   |d urt |}| j| | _|S | jjS r   )r5   r   r  )rc   r  colsrd   rd   re   r    s
   z&DataFrameFormatter._initialize_columnsr?   c                   s    d u ri }|S t  ttfr#d i}| fdd| jjD  |S t  trD  D ]}|| jjvr?|dkr?td| q, }|S t	| jjt	 kr_tdt	  dt	| jj dt
t| jj }|S )Nra   c                   s   i | ]}| qS rd   rd   )rv   columnr  rd   re   
<dictcomp>      z;DataFrameFormatter._initialize_colspace.<locals>.<dictcomp>z,Col_space is defined for an unknown column: zCol_space length(r2  r   )r   r   r\   updater   r  r   keysr4  rj   r3  zip)rc   r  r   r6  rd   r7  re   r    s0   

z'DataFrameFormatter._initialize_colspacec                 C  s,   |   s| jS t \}}| |r|S | jS )z%Number of columns fitting the screen.)_is_in_terminalr   r   _is_screen_narrow)rc   r   r   rd   rd   re   r    s   

z(DataFrameFormatter._calc_max_cols_fittedc                 C  sP   |   r t \}}| jdkr||   S | |r|}n| j}n| j}| |S )z,Number of rows with data fitting the screen.r   )r=  r   r   _get_number_of_auxiliary_rows_is_screen_short_adjust_max_rows)rc   r   r   r   rd   rd   re   r    s   



z(DataFrameFormatter._calc_max_rows_fittedc                 C  s(   |rt | j|kr| jrt| j|}|S )zAdjust max_rows using display logic.

        See description here:
        https://pandas.pydata.org/docs/dev/user_guide/options.html#frequently-used-options

        GH #37359
        )rj   r   r   r   )rc   r   rd   rd   re   rA    s   z#DataFrameFormatter._adjust_max_rowsc                 C  s   t | jdkp
| jdkS )z/Check if the output is to be shown in terminal.r   )rZ   r   r   rr   rd   rd   re   r=    s   z"DataFrameFormatter._is_in_terminalc                 C  s   t | jdkot| jj|kS Nr   )rZ   r   rj   r   r  )rc   	max_widthrd   rd   re   r>    s   z$DataFrameFormatter._is_screen_narrowc                 C  s   t | jdkot| j|kS rB  )rZ   r   rj   r   )rc   
max_heightrd   rd   re   r@    s   z#DataFrameFormatter._is_screen_shortc                 C  s:   d}d}|| }| j r|t| j 7 }| jr|d7 }|S )z?Get number of rows occupied by prompt, dots and dimension info.r   )r   rj   r$  
splitlinesr   )rc   dot_row
prompt_rownum_rowsrd   rd   re   r?    s   z0DataFrameFormatter._get_number_of_auxiliary_rowsc                 C  s$   | j r|   | jr|   dS dS )zY
        Check whether the frame should be truncated. If so, slice the frame up.
        N)r!  _truncate_horizontallyr   _truncate_verticallyrr   rd   rd   re   r     s
   zDataFrameFormatter.truncatec                 C  s   | j dusJ | j d }|dkrM| jjddd|f }| jjdd| df }t||fdd| _t| jttfrLg | jd| | j| d | _ntt	| j
}| jjddd|f | _|| _dS )zRemove columns, which are not to be displayed and adjust formatters.

        Attributes affected:
            - tr_frame
            - formatters
            - tr_col_num
        Nr   r   axis)r  r  r   r8   r   r  listtupler   r   r   
tr_col_num)rc   col_numrJ   rK   rd   rd   re   rI    s    

z)DataFrameFormatter._truncate_horizontallyc                 C  s   | j dusJ | j d }|dkr1| jjd|ddf }| jj| dddf }t||f| _ntt| j}| jjd|ddf | _|| _dS )zRemove rows, which are not to be displayed.

        Attributes affected:
            - tr_frame
            - tr_row_num
        Nr   r   )r  r  r   r8   r   r   r   r   )rc   r   headtailrd   rd   re   rJ  9  s   

z'DataFrameFormatter._truncate_verticallyc           
   	     s  g }t  js1 js1t jD ]\}} |}t| jt j	|d j
d}|| q|S t  jrcttt  j _t jt jkrZtdt j dt j ddd  jD }n  j} jrv|D ]}|d qnt jD ]N\}}|| }tt j	|dg fd	d
|D R  } |}t| j| j
d}tg  fdd
|D |R  }	 j
j||	 jd}|||  q{|S )Nr   )stringsrM   minimumr   zWriting z cols but got z aliasesc                 S  s   g | ]}|gqS rd   rd   )rv   labelrd   rd   re   rx   b  r9  zADataFrameFormatter._get_strcols_without_index.<locals>.<listcomp>ra   c                 3      | ]	} j |V  qd S r   r   rj   r   rr   rd   re   r   m      z@DataFrameFormatter._get_strcols_without_index.<locals>.<genexpr>)rT  r   c                 3  rV  r   rW  r   rr   rd   re   r   t  rX  r   )r$   r   	enumerater  
format_col_make_fixed_widthrM   r   r  r   r   r}   r   rM  r\   rj   r  r4  _get_formatted_column_labelsr,  max)
rc   r  rw   r   r~   str_columnsr   cheaderheader_colwidthr   rd   rr   re   r  K  sP   


 z-DataFrameFormatter._get_strcols_without_indexrw   rn   c              	   C  sL   | j }| |}t|jd d |f j|| j| j| j|j	| | j
| jdS )N)ro   r[   r   r  r   )r  _get_formatterrp   r   r   ro   r[   r  r   r  r  r   )rc   rw   r   	formatterrd   rd   re   rZ  z  s   
zDataFrameFormatter.format_col	str | intCallable | Nonec                 C  sZ   t | jttfrt|rtt|}| j| S d S t|r&|| jvr&| j| }| j|d S r   )	r   r  rM  rN  r#   r   r   r  r   )rc   rw   rd   rd   re   ra    s   


z!DataFrameFormatter._get_formatterc                   s   ddl m} |j}t|tr_|jddd}tt| }jj	j
}tdd |jD tt|tt|  fddttfd	d|D  }jrTt|rT||}d
d t| D }|S | }jj	}tt|tt|  fddt|D }|S )Nr   )sparsify_labelsF)r	  r   c                 s  s    | ]}|j V  qd S r   )is_floating)rv   levelrd   rd   re   r     s    zBDataFrameFormatter._get_formatted_column_labels.<locals>.<genexpr>c                   s"   |j vr |  rsd| S |S )N )r  )r   y)need_leadsprestrict_formattingrc   rd   re   space_format  s   
zEDataFrameFormatter._get_formatted_column_labels.<locals>.space_formatc                 3  s$    | ]  fd d D V  qdS )c                   s   g | ]} |qS rd   rd   )rv   ri  )rl  r   rd   re   rx         zMDataFrameFormatter._get_formatted_column_labels.<locals>.<genexpr>.<listcomp>Nrd   )rv   )rl  r   re   r     s   " c                 S     g | ]}t |qS rd   )rM  r   rd   rd   re   rx     ry   zCDataFrameFormatter._get_formatted_column_labels.<locals>.<listcomp>c                   s0   g | ]\}} |s | rd | n|gqS )rh  )ra  )rv   rw   r   )rj  rc   rd   re   rx     s    )pandas.core.indexes.multire  r  r   r3   r   rM  r<  r   dtypesr   r   levelsr3  mapr%   r	  rj   rY  )rc   r   re  r  fmt_columnsrq  r^  rd   )rj  rk  rc   rl  re   r\    s.   

	
z/DataFrameFormatter._get_formatted_column_labelsc                   s   dd j  D  |j}|j}d}t|tr&|jjdj	|d}n	|jj	|dg} fdd|D }j
jd	g|R  d
}jrSdd  D }ndg|j }jr`|| S |S )Nc                 S  s   i | ]
\}}|t t|qS rd   )r   r   )rv   kvrd   rd   re   r8    s    z;DataFrameFormatter._get_formatted_index.<locals>.<dictcomp>	__index__F)r	  r   r   rb  )r   rb  c              
     s.   g | ]}t tt|d  ddjdqS )rJ   ra   r   )rM   rT  r   )rN  r[  rM  r   r   r   r  rc   rd   re   rx     s    z;DataFrameFormatter._get_formatted_index.<locals>.<listcomp>r   ri   c                 S  ro  rd   r\   r   rd   rd   re   rx     ry   ra   )r  itemsr   r  ra  r   r3   r   r	  r,  r   r   splitr.  _get_column_name_listnlevelsr   )rc   r   r   r  fmtr   adjoined
col_headerrd   rx  re   r     s,   

	z'DataFrameFormatter._get_formatted_indexlist[Hashable]c                 C  sN   g }| j j}t|tr|dd |jD  |S ||jd u r!dn|j |S )Nc                 s  s     | ]}|d u r
dn|V  qd S r`   rd   r   rd   rd   re   r     s    z;DataFrameFormatter._get_column_name_list.<locals>.<genexpr>ra   )r   r  r   r3   extendr   r}   r   )rc   r   r  rd   rd   re   r|    s   
z(DataFrameFormatter._get_column_name_list)NNTTrU   NNNNTNNNFr   FT)&r   rG   r  r  r  r  r   r  r   rZ   r[   r\   r  r  rM   r   ro   r  r	  r
  r  rZ   r   r   r   r   r   r   r   r   r  r\   r  rZ   r  rZ   r^   r_   )r^   r  r^   rZ   r   )r^   r   )r	  r
  r^   rZ   )r  r  r^   rC   )rM   r   r^   r\   )r  r  r^   r2   )r  r  r^   r?   )r^   r   )r   r   r^   r   r   )rw   r   r^   rn   )rw   rc  r^   rd  )r   rG   r^   r  )r   rG   r^   rn   )r^   r  )(r   r   r   __doc__rI   rS   rf   r  propertyr   r  r!  r   r$  r'  r)  r,  r.  r/  r  r  r  r  r  r  r  rA  r=  r>  r@  r?  r   rI  rJ  r  rZ  ra  r\  r   r|  rd   rd   rd   re   r   .  s    
/

















/


)(r   c                   @  sr   e Zd ZdZd9ddZ									d:d;ddZ			d<d=ddZ													 		!	d>d?d7d8ZdS )@DataFrameRendereraJ  Class for creating dataframe output in multiple formats.

    Called in pandas.core.generic.NDFrame:
        - to_csv
        - to_latex

    Called in pandas.core.frame.DataFrame:
        - to_html
        - to_string

    Parameters
    ----------
    fmt : DataFrameFormatter
        Formatter with the formatting options.
    r~  r   r^   r_   c                 C  s
   || _ d S r   )r~  )rc   r~  rd   rd   re   rf     s   
zDataFrameRenderer.__init__NFrW   "FilePath | WriteBuffer[str] | Noner   r   classesstr | list | tuple | NonenotebookrZ   borderint | bool | Nonetable_idrender_linksc                 C  sF   ddl m}m}	 |r|	n|}
|
| j||||d}| }t|||dS )uJ  
        Render a DataFrame to a html table.

        Parameters
        ----------
        buf : str, path object, file-like object, or None, default None
            String, path object (implementing ``os.PathLike[str]``), or file-like
            object implementing a string ``write()`` function. If None, the result is
            returned as a string.
        encoding : str, default “utf-8”
            Set character encoding.
        classes : str or list-like
            classes to include in the `class` attribute of the opening
            ``<table>`` tag, in addition to the default "dataframe".
        notebook : {True, False}, optional, default False
            Whether the generated HTML is for IPython Notebook.
        border : int
            A ``border=border`` attribute is included in the opening
            ``<table>`` tag. Default ``pd.options.display.html.border``.
        table_id : str, optional
            A css id is included in the opening `<table>` tag if specified.
        render_links : bool, default False
            Convert URLs to HTML links.
        r   )HTMLFormatterNotebookFormatter)r  r  r  r  rW   r   )pandas.io.formats.htmlr  r  r~  r   save_to_buffer)rc   rW   r   r  r  r  r  r  r  r  Klasshtml_formatterstringrd   rd   re   to_html  s   "zDataFrameRenderer.to_htmlr   r   c                 C  s0   ddl m} || j|d}| }t|||dS )u%  
        Render a DataFrame to a console-friendly tabular output.

        Parameters
        ----------
        buf : str, path object, file-like object, or None, default None
            String, path object (implementing ``os.PathLike[str]``), or file-like
            object implementing a string ``write()`` function. If None, the result is
            returned as a string.
        encoding: str, default “utf-8”
            Set character encoding.
        line_width : int, optional
            Width to wrap a line in characters.
        r   )StringFormatter)r   r  )pandas.io.formats.stringr  r~  r   r  )rc   rW   r   r   r  string_formatterr  rd   rd   re   r   5  s   zDataFrameRenderer.to_string,winfer"Tstrictpath_or_buf7FilePath | WriteBuffer[bytes] | WriteBuffer[str] | Nonesepr\   r  Sequence[Hashable] | Noneindex_labelIndexLabel | Noner   compressionr@   rb   	quotecharlineterminator	chunksizedate_formatdoublequote
escapecharerrorsstorage_optionsStorageOptions | Nonec                 C  s   ddl m} |du rd}t }nd}|di d|d|
d|d	|d
|d|d|d|d|d|d|d|	d|d|d|d|d| j}|  |rbt|tsXJ | }|  |S dS )z;
        Render dataframe as comma-separated file.
        r   )CSVFormatterNTFr  r  r  r   r  r  rb   r5  r  r   r  r  r  r  r  r  rb  rd   )pandas.io.formats.csvsr  r   r~  saver   getvalueclose)rc   r  r   r  r  r  r   r  rb   r  r  r  r  r  r  r  r  r  created_buffercsv_formattercontentrd   rd   re   to_csvO  s^   	
zDataFrameRenderer.to_csv)r~  r   r^   r_   )NNNFNNF)rW   r  r   r   r  r  r  rZ   r  r  r  r   r  rZ   r^   r   )NNN)rW   r  r   r   r   r   r^   r   )NNr  NNr  r  Nr  NNNTNr  N)"r  r  r   r   r  r\   r  r  r  r  r   r\   r  r@   rb   r   r  r\   r  r   r  r   r  r   r  rZ   r  r   r  r\   r  r  r^   r   )r   r   r   r  rf   r  r   r  rd   rd   rd   re   r    s@    
5r  r  r\   rW   r  r   r   c                 C  s\   t ||d}||  |du r| W  d   S 	 W d   dS 1 s'w   Y  dS )zQ
    Perform serialization. Write to buf or return as string if buf is None.
    )r   N)
get_bufferwriter  )r  rW   r   frd   rd   re   r    s   
$r  IGenerator[WriteBuffer[str], None, None] | Generator[StringIO, None, None]c                 c  s    | dur
t | } nt } |du rd}n	t| tstdt| dr'| V  dS t| trPtt|  t| d|dd}|V  W d   dS 1 sIw   Y  dS td)	z
    Context manager to open, yield and close buffer for filenames or Path-like
    objects, otherwise yield buf unchanged.
    Nzutf-8z1buf is not a file name and encoding is specified.r  r  ra   )r   newlinez1buf is not a file name and it has no write method)	r:   r   r   r\   r4  hasattrr9   open	TypeError)rW   r   r  rd   rd   re   r    s    




"r  rU   rK   r   Tr   r   rb  rd  ro   r  r[   digitsr   r   str | int | NonerM   r  r   r
  rb   fallback_formatterrn   c                 C  s   t | jdr
t}n2t| jtrt}n)t | jdrt}nt| jtr&t	}nt | jdr0t
}nt | jdr:t}nt}|du rBd}|du rJtd}|du rRtd}|| |||||||||	|
d	}| S )
a{  
    Format an array for printing.

    Parameters
    ----------
    values
    formatter
    float_format
    na_rep
    digits
    space
    justify
    decimal
    leading_space : bool, optional, default True
        Whether the array should be formatted with a leading space.
        When an array as a column of a Series or DataFrame, we do want
        the leading space to pad between columns.

        When formatting an Index subclass
        (e.g. IntervalIndex._format_native_types), we don't want the
        leading space since it should be left-aligned.
    fallback_formatter

    Returns
    -------
    List[str]
    MmfciuN   r   display.precision)
r  r[   ro   rb  r   rM   r  r   rb   r  )r   is_np_dtyper   Datetime64Formatterr   r(   Datetime64TZFormatterTimedelta64Formatterr)   ExtensionArrayFormatterFloatArrayFormatterIntArrayFormatterGenericArrayFormatterr   
get_result)r   rb  ro   r[   r  r   rM   r  r   rb   r  	fmt_klassfmt_objrd   rd   re   rp     sB   )rp   c                   @  sB   e Zd Z											d&d'dd Zd(d"d#Zd(d$d%ZdS ))r     NrU   r  rK   r   Tr   r   r  r   rb  rd  r[   r\   r   rc  ro   r  rM   r  rb   r   fixed_widthrZ   r   r
  r  r^   r_   c                 C  sL   || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	|| _
|| _d S r   )r   r  r[   r   rb  ro   rM   r  rb   r  r   r  )rc   r   r  rb  r[   r   ro   rM   r  rb   r  r   r  rd   rd   re   rf     s   
zGenericArrayFormatter.__init__rn   c                 C  s   |   }t|| jS r   )_format_stringsr[  rM   )rc   r~   rd   rd   re   r  0  s   z GenericArrayFormatter.get_resultc                   s|  j d u rtd}|d u rtdfdd}nj }jd ur$j njd ur-j njd uo6jtk}ttjd|d  fdd}t	j
d	d
}t|tjsWtdt|t}|tjt|ttdt|jd@ }j}|d u r{| }g }t|D ]:\}	}
||	 rjd ur|r|d||
  q||	 r|||
 q|du rd}nd}||j||
d q|S )Nr   r  c                   s   t | d ddS )Nz .dr  )_trim_zeros_single_floatrn  )	precisionrd   re   <lambda>9  s    z7GenericArrayFormatter._format_strings.<locals>.<lambda>r   )r   quote_stringsc              	     s   j d ur;t| r;t| r;z | d u rW dS | tu rttW S | tu s't| r*W dS W j S  tt	fy:   Y j S w t
| trDt| S t
| trMt| S t | S )Nr_   r   )r[   r&   r*   r   r\   r   npisnatr  r4  r   r0   r/   reprrn  )rb  rc   rd   re   _formatK  s&   


z6GenericArrayFormatter._format_strings.<locals>._formatTextract_numpyz<ExtensionArray formatting should use ExtensionArrayFormatterr   rK  rh  Fz{v}z {v}rv  )ro   r   rb  r  rb   r	   r   r;   r   r1   r   r   r  ndarrayr  r   	map_inferr"   r+  r+   rN  rangerj   shaper   r   rY  r}   r   )rc   ro   r  r  valsinferredis_float_typer   r~   rw   rv  tplrd   )rb  r  rc   re   r  4  sT   


 z%GenericArrayFormatter._format_strings)r  NrU   r  NrK   r   NTTN)r   r   r  r   rb  rd  r[   r\   r   rc  ro   r  rM   r\   r  r\   rb   r   r  rZ   r   r
  r  rd  r^   r_   r   )r   r   r   rf   r  r  rd   rd   rd   re   r    s    
r  c                      sB   e Zd Zd fddZ		ddddZdddZdddZ  ZS )r  r^   r_   c                   sT   t  j|i | | jd ur$| jd u r&d| _t| jr(| j| _d | _d S d S d S d S NF)r   rf   ro   rb  r  callable)rc   argsr   r   rd   re   rf     s   

zFloatArrayFormatter.__init__Nro   r  	thresholdfloat | Noner   c                   sl   du rj rfdd nfdd jdkr$ fddn du r,S fdd	}|S )
z;Returns a function to be applied on each value to format itNc                   s$    d usJ t | r | dS jS )Nvalue)r+   r[   r  )ro   rc   rd   re   base_formatter  s   
z<FloatArrayFormatter._value_formatter.<locals>.base_formatterc                   s   t | rt| S  jS r   )r+   r\   r[   r  rr   rd   re   r    r   r   c                   s    |  djdS )Nr   r   )replacer  r  )r  rc   rd   re   decimal_formatter  s   z?FloatArrayFormatter._value_formatter.<locals>.decimal_formatterc                   s*   t | rt| kr | S  dS jS )Ng        )r+   absr[   r  )r  rc   r  rd   re   rb    s
   z7FloatArrayFormatter._value_formatter.<locals>.formatter)ro   r  )rc   ro   r  rb  rd   )r  r  ro   rc   r  re   _value_formatter  s   
	z$FloatArrayFormatter._value_formatter
np.ndarrayc           
        sT  ddddd	d
 j durjj jS jr tdnd fdd}jdu rJjrFjdu r;d}nd}t|jj	d}n
j}nfdd}||}jsY|S t
|dkrptdd |D }|j	d k}nd}tj}|dk }|dj	  k |dk@  }	|	s|r|rjdu rd}nd}t|jj	d}||}|S )z
        Returns the float values converted into strings using
        the parameters given at initialisation, as a numpy array
        r   r<   rb  r   r[   r\   c                   s<   t | }t fddt|  | D | j}|S )Nc                   s    g | ]\}}|s |nqS rd   rd   )rv   valr  rb  r[   rd   re   rx     s    zWFloatArrayFormatter.get_result_as_array.<locals>.format_with_na_rep.<locals>.<listcomp>)r*   r  arrayr<  ravelreshaper  )r   rb  r[   mask	formattedrd   r  re   format_with_na_rep  s   zCFloatArrayFormatter.get_result_as_array.<locals>.format_with_na_repc                 S  s   t |  }t |  }t|t|}}g }t|  ||||D ]R\}}	}
}}|s6|s6||| q#|sF|||	 d| d q#|sj||
 }|dr^|| | d q#|| d| d q#|| d| d q#t 	|
| jS )N+j-)r  realr  imagr*   r<  r}   rt   
startswithr  r  r  )r   rb  r[   real_valuesimag_values	real_mask	imag_maskformatted_lstr  real_valimag_valre_isnaim_isnaimag_formattedrd   rd   re   format_complex_with_na_rep  s,   
zKFloatArrayFormatter.get_result_as_array.<locals>.format_complex_with_na_repNzdisplay.chop_thresholdc                   s    | }jdkrdj nj}j}t|}|r# |||}n|||}jrB|r5t|j}nt|j}t	j
|ddS |S )NrJ   rh  objectr   )r  rM   r[   r   r!   r  _trim_zeros_complexr  _trim_zeros_floatr  asarray)ro   rb  r[   r   
is_complexr   r  r   rc   r  rd   re   format_values_with  s   zCFloatArrayFormatter.get_result_as_array.<locals>.format_values_withTz{value: .{digits:d}f}z{value:.{digits:d}f})r  c                   s
    j |  S r   )ro   r  rr   rd   re   r  &  s   
 z9FloatArrayFormatter.get_result_as_array.<locals>.<lambda>r   c                 s      | ]}t |V  qd S r   r   r   rd   rd   re   r   2      z:FloatArrayFormatter.get_result_as_array.<locals>.<genexpr>   Fg    .A
   z{value: .{digits:d}e}z{value:.{digits:d}e})r   r<   rb  r   r[   r\   )rb  r   r[   r  r   ro   r   r   r   r  rj   r]  r  r  r   )
rc   r  fmt_strro   formatted_valuesmaxlentoo_longabs_valshas_large_valueshas_small_valuesrd   r  re   get_result_as_array  sB   







z'FloatArrayFormatter.get_result_as_arrayrn   c                 C  s   t |  S r   )rM  r%  rr   rd   rd   re   r  H  s   z#FloatArrayFormatter._format_stringsr   NN)ro   r  r  r  r^   r   )r^   r  r   )r   r   r   rf   r  r%  r  r   rd   rd   r   re   r    s    
8 r  c                   @     e Zd ZdddZdS )r  r^   rn   c                   s>   | j du r
dd }ndd }| jp|  fdd| jD }|S )NFc                 S     | dj | dS )Nr  rn  r   rn  rd   rd   re   r  O      z3IntArrayFormatter._format_strings.<locals>.<lambda>c                 S  r(  )Nz drn  r)  rn  rd   rd   re   r  Q  r*  c                      g | ]} |qS rd   rd   r   rb  rd   re   rx   S  ry   z5IntArrayFormatter._format_strings.<locals>.<listcomp>)r   rb  r   )rc   formatter_strr~   rd   r,  re   r  M  s   


z!IntArrayFormatter._format_stringsNr   r   r   r   r  rd   rd   rd   re   r  L      r  c                      s.   e Zd Z		dd fd
dZdddZ  ZS )r  r   Nr   3np.ndarray | Series | DatetimeIndex | DatetimeArraynat_repr\   r  r_   r^   c                   $   t  j|fi | || _|| _d S r   )r   rf   r1  r  )rc   r   r1  r  r   r   rd   re   rf   X     
zDatetime64Formatter.__init__rn   c                   sZ    j }t|tst|} jdurt jr fdd|D S |jj j jd}|	 S )z&we by definition have DO NOT have a TZNc                   s   g | ]}  |qS rd   r,  r   rr   rd   re   rx   k  rm  z7Datetime64Formatter._format_strings.<locals>.<listcomp>)r[   r  )
r   r   r6   rb  r  _data_format_native_typesr1  r  tolist)rc   r   r~   rd   rr   re   r  c  s   
z#Datetime64Formatter._format_stringsr   N)r   r0  r1  r\   r  r_   r^   r_   r   r   r   r   rf   r  r   rd   rd   r   re   r  W  
    r  c                   @  r'  )r  r^   rn   c                 C  s|   t | jdd}| j}d }|d u r|jdd}t|tr | }nt|}t	||| j
| j| j| j| j| j| j| j|d}|S )NTr  )boxed)	ro   r[   r  r   rM   r  r   rb   r  )r1   r   rb  
_formatterr   r,   rq   r  r  rp   ro   r[   r  r   rM   r  r   rb   )rc   r   rb  r  r  r~   rd   rd   re   r  t  s,   


z'ExtensionArrayFormatter._format_stringsNr   r.  rd   rd   rd   re   r  s  r/  r  percentilesnp.ndarray | Sequence[float]c                 C  s@  t | } t| rt | dkrt | dkstdd|  } |  t}t || }t |r=|t	}dd |D S t 
| }|d dkrL|d nd}|d dk rZd|d  nd}t t t t j|||d	t }td|}t j| td
}| |  tt	||< | |  |t	|| < dd |D S )a  
    Outputs rounded and formatted percentiles.

    Parameters
    ----------
    percentiles : list-like, containing floats from interval [0,1]

    Returns
    -------
    formatted : list of strings

    Notes
    -----
    Rounding precision is chosen so that: (1) if any two elements of
    ``percentiles`` differ, they remain different after rounding
    (2) no entry is *rounded* to 0% or 100%.
    Any non-integer is always rounded to at least 1 decimal place.

    Examples
    --------
    Keeps all entries different after rounding:

    >>> format_percentiles([0.01999, 0.02001, 0.5, 0.666666, 0.9999])
    ['1.999%', '2.001%', '50%', '66.667%', '99.99%']

    No element is rounded to 0% or 100% (unless already equal to it).
    Duplicates are allowed:

    >>> format_percentiles([0, 0.5, 0.02001, 0.5, 0.666666, 0.9999])
    ['0%', '50%', '2.0%', '50%', '66.67%', '99.99%']
    r   r   z/percentiles should all be in the interval [0,1]d   c                 S     g | ]}|d  qS %rd   ru   rd   rd   re   rx     ry   z&format_percentiles.<locals>.<listcomp>N)to_beginto_endr  c                 S  r?  r@  rd   ru   rd   rd   re   rx     ry   )r  r  r%   r+  r4  roundastyper   iscloser\   uniquefloorlog10r   ediff1dr]  
empty_liker  )r<  percentiles_round_typeint_idxoutunique_pctsrC  rD  precrd   rd   re   format_percentiles  s6   
"



rR  2np.ndarray | DatetimeArray | Index | DatetimeIndexrZ   c                 C  s~   t | ts	|  } t | ttfst| } | jd urdS | j}|tk}t| j	}t
|}t||| dk dk}|r=dS dS )NFr   T)r   r2   r  r-   r6   tzasi8r   r   r   r   r  logical_andr   )r   
values_intconsider_valuesresoppd	even_daysrd   rd   re   is_dates_only  s   


r\  r   r   NaTType | Timestampr1  c                 C  s   | t u r|S t| S r   )r   r\   )r   r1  rd   rd   re   _format_datetime64  s   r^  r  c                 C  s"   t | tr|S |r| |S | jS r   )r   r    strftime
_date_repr)r   r1  r  rd   rd   re   _format_datetime64_dateonly  s
   

ra  is_dates_only_r   c                   s   | r	 fddS fddS )z]Return a formatter callable taking a datetime64 as input and providing
    a string as outputc                   s   t |  dS )N)r1  r  )ra  rn  r  r1  rd   re   r    s    z'get_format_datetime64.<locals>.<lambda>c                   s   t |  dS )Nr1  )r^  rn  rd  rd   re   r    s    rd   )rb  r1  r  rd   rc  re   get_format_datetime64  s   re  *np.ndarray | DatetimeArray | DatetimeIndexc                 C  s6   t | tjr| jdkr|  } t| }|r|pdS |S )z6given values and a date_format, return a string formatr   z%Y-%m-%d)r   r  r  ndimr  r\  )r   r  idord   rd   re   !get_format_datetime64_from_values  s   ri  c                   @  r'  )r  r^   rn   c                   s@   t | j}| jt}| jpt|| jd  fdd|D }|S )zwe by definition have a TZ)r  c                   r+  rd   rd   r   r,  rd   re   rx   .  ry   z9Datetime64TZFormatter._format_strings.<locals>.<listcomp>)r\  r   rF  r  rb  re  r  )rc   rh  r   r~   rd   r,  re   r  '  s   
z%Datetime64TZFormatter._format_stringsNr   r.  rd   rd   rd   re   r  &  r/  r  c                      s.   e Zd Z		dd fddZdddZ  ZS )r  r   Fr   np.ndarray | TimedeltaIndexr1  r\   boxrZ   r^   r_   c                   r2  r   )r   rf   r1  rk  )rc   r   r1  rk  r   r   rd   re   rf   4  r3  zTimedelta64Formatter.__init__rn   c                   s.   | j pt| j| j| jd  fdd| jD S )N)r1  rk  c                   r+  rd   rd   r   r,  rd   re   rx   C  ry   z8Timedelta64Formatter._format_strings.<locals>.<listcomp>)rb  get_format_timedelta64r   r1  rk  rr   rd   r,  re   r  ?  s   z$Timedelta64Formatter._format_stringsr   F)r   rj  r1  r\   rk  rZ   r^   r_   r   r8  rd   rd   r   re   r  3  r9  r  F,np.ndarray | TimedeltaIndex | TimedeltaArraystr | floatrk  c           
        s^   |  tj}|tk}d}|| dk}t||}| dk}|r#dnd fdd}	|	S )z
    Return a formatter function for a range of timedeltas.
    These will all have the same format argument

    If box, then show the return in quotes
    l     "R: r   Nlongc                   sN   | d u st | rt| rS t| tst| } | jd} r%d| d}|S )Nr)  ')r&   r*   r   r   
_repr_base)r   r   rk  r   r1  rd   re   r;  e  s   
z*get_format_timedelta64.<locals>._formatter)viewr  int64r   rV  r   )
r   r1  rk  rW  rX  one_day_nanosnot_midnightbothr[  r;  rd   rs  re   rl  F  s   rl  rS  rT  r   TextAdjustment | Nonec                   s   t | dks
|dkr| S |d u rt  n| t fdd| D |d ur*t|tdd ur8kr8d fd	d
fdd| D }  j| |d}|S )Nr   r+  c                 3  s    | ]}  |V  qd S r   r   r   )
adjustmentrd   re   r         z$_make_fixed_width.<locals>.<genexpr>r   r   r\   r^   c                   s6   d urdk  | k@ r| d d  d } | S )Nr   r   r   rn  )rz  conf_maxr   rd   re   just  s   z_make_fixed_width.<locals>.justc                   r+  rd   rd   r   )r}  rd   re   rx     ry   z%_make_fixed_width.<locals>.<listcomp>r   )r   r\   r^   r\   )rj   r   r]  r   rM   )rS  rM   rT  r   r   rd   )rz  r|  r}  r   re   r[  u  s   
r[  str_complexesr  c           	        s   g g }}| D ] }t d|}|d|dd  |d|dd  qt| }t|| |}t|dkr;g S tdd |D d	   fd
dt|d| ||d D }|S )z
    Separates the real and imaginary parts from the complex number, and
    executes the _trim_zeros_float method on each of those.
    z([j+-])ra   Nr   c                 s  r  r   r   )rv   partrd   rd   re   r     r  z&_trim_zeros_complex.<locals>.<genexpr>r   c                   s6   g | ]\}}||d   |dd d   d qS )r   r   N>r  rd   )rv   real_ptimag_ptpadded_lengthrd   re   rx     s    z'_trim_zeros_complex.<locals>.<listcomp>)rer{  r}   r|   rj   r  r]  r<  )	r~  r  	real_part	imag_partr   trimmednpadded_partspaddedrd   r  re   r    s   

r  	str_floatc                 C  s    |  d} | dr| d7 } | S )zX
    Trims trailing zeros after a decimal point,
    leaving just one if necessary.
    0r   )rstripendswith)r  rd   rd   re   r    s   

r  
str_floatsnp.ndarray | list[str]c                   sl   | }t d  ddfdddfd	d
}||r*fdd|D }||s fdd|D }|S )z
    Trims the maximum number of trailing zeros equally from
    all numbers containing decimals, leaving just one if
    necessary.
    z^\s*[\+-]?[0-9]+\z[0-9]*$r^   rZ   c                   s   t  | d uS r   )r  matchrn  )number_regexrd   re   is_number_with_decimal  r   z1_trim_zeros_float.<locals>.is_number_with_decimalr   r  c                   s0    fdd| D }t |dkotdd |D S )z
        Determine if an array of strings should be trimmed.

        Returns True if all numbers containing decimals (defined by the
        above regular expression) within the array end in a zero, otherwise
        returns False.
        c                   s   g | ]} |r|qS rd   rd   r   r  rd   re   rx     s    z:_trim_zeros_float.<locals>.should_trim.<locals>.<listcomp>r   c                 s  s    | ]}| d V  qdS )r  Nr  r   rd   rd   re   r     r{  z9_trim_zeros_float.<locals>.should_trim.<locals>.<genexpr>)rj   r+  )r   numbersr  rd   re   should_trim  s   z&_trim_zeros_float.<locals>.should_trimc                   s$   g | ]} |r|d d n|qS )NrB  rd   r   r  rd   re   rx     s   $ z%_trim_zeros_float.<locals>.<listcomp>c                   s*   g | ]}|r|  r|d  n|qS )r  r  r   )r  r  rd   re   rx     s    Nr  )r   r  r^   rZ   )r  compile)r  r  r  r  r   rd   )r  r  r  re   r    s   r  r   r2   c                 C  s    t | trtj| j S | jd uS r   )r   r3   comany_not_noner   r   )r   rd   rd   re   r&    s   

r&  c                   @  s   e Zd ZdZi dddddddd	d
dddddddddddddddddddddd d!d"d#Z	%d3d4d,d-Zd5d1d2Zd$S )6EngFormatterzl
    Formats float values according to engineering format.

    Based on matplotlib.ticker.EngFormatter
    iri  iziair  ipir  iur  r   ra   r   ru  r  r  	   Gr  T   P   E   Z   YNFaccuracyr   use_eng_prefixrZ   r^   r_   c                 C  s   || _ || _d S r   r  r  )rc   r  r  rd   rd   re   rf     s   
zEngFormatter.__init__numfloatr\   c           
      C  s  t t|}t |rdS t |rdS d}|dk rd}| }|dkr3t tt| d d }nt d}|t	| j
 }|	t| j
 }t|}| jrX| j
| }n|dk rdd| d}nd	|d}|| d
|  }| jdu rzd}nd| jdd}|j||d}	|	S )a  
        Formats a number in engineering notation, appending a letter
        representing the power of 1000 of the original number. Some examples:
        >>> format_eng = EngFormatter(accuracy=0, use_eng_prefix=True)
        >>> format_eng(0)
        ' 0'
        >>> format_eng = EngFormatter(accuracy=1, use_eng_prefix=True)
        >>> format_eng(1_000_000)
        ' 1.0M'
        >>> format_eng = EngFormatter(accuracy=2, use_eng_prefix=False)
        >>> format_eng("-1e-6")
        '-1.00E-06'

        @param num: the value to represent
        @type num: either a numeric value or a string that can be converted to
                   a numeric value (as per decimal.Decimal constructor)

        @return: engineering formatted string
        rU   infr   r   rB  r   zE-02dzE+r  Nz{mant: g}{prefix}z{mant: .r  z
f}{prefix})mantprefix)r   r\   is_nanis_infiniter   mathrI  rJ  r   r]  ENG_PREFIXESr;  r  r  r   )
rc   r  dnumsignpow10	int_pow10r  r  
format_strr  rd   rd   re   __call__  s4   

 
zEngFormatter.__call__r  )r  r   r  rZ   r^   r_   )r  r  r^   r\   )r   r   r   r  r  rf   r  rd   rd   rd   re   r    sP    	
r  r   r  r   r  r_   c                 C  s   t dt| | dS )a  
    Format float representation in DataFrame with SI notation.

    Parameters
    ----------
    accuracy : int, default 3
        Number of decimal digits after the floating point.
    use_eng_prefix : bool, default False
        Whether to represent a value with SI prefixes.

    Returns
    -------
    None

    Examples
    --------
    >>> df = pd.DataFrame([1e-9, 1e-3, 1, 1e3, 1e6])
    >>> df
                  0
    0  1.000000e-09
    1  1.000000e-03
    2  1.000000e+00
    3  1.000000e+03
    4  1.000000e+06

    >>> pd.set_eng_float_format(accuracy=1)
    >>> df
             0
    0  1.0E-09
    1  1.0E-03
    2  1.0E+00
    3  1.0E+03
    4  1.0E+06

    >>> pd.set_eng_float_format(use_eng_prefix=True)
    >>> df
            0
    0  1.000n
    1  1.000m
    2   1.000
    3  1.000k
    4  1.000M

    >>> pd.set_eng_float_format(accuracy=1, use_eng_prefix=True)
    >>> df
          0
    0  1.0n
    1  1.0m
    2   1.0
    3  1.0k
    4  1.0M

    >>> pd.set_option("display.float_format", None)  # unset option
    r   N)r   r  r  rd   rd   re   set_eng_float_formatO  s   7r  ra   rr  sentinelbool | object | strlist[dict[int, int]]c           	      C  s   t | dkrg S dgt | d  }g }| D ]1}d}i }t|D ]\}}|| r,||kr,qd||< || ||< |}qt || ||< || q|S )a  
    For each index in each level the function returns lengths of indexes.

    Parameters
    ----------
    levels : list of lists
        List of values on for level.
    sentinel : string, optional
        Value which states that no new index starts on there.

    Returns
    -------
    Returns list of maps. For each level returns map of indexes (key is index
    in row and value is length of index).
    r   TF)rj   rY  r}   )	rr  r  controlr   rg  
last_indexlengthsrw   keyrd   rd   re   get_level_lengths  s    r  WriteBuffer[str]linesc                 C  s4   t dd |D rdd |D }| d| dS )z
    Appends lines to a buffer.

    Parameters
    ----------
    buf
        The buffer to write to
    lines
        The lines to append.
    c                 s  s    | ]}t |tV  qd S r   )r   r\   r   rd   rd   re   r     r{  z#buffer_put_lines.<locals>.<genexpr>c                 S  ro  rd   ry  r   rd   rd   re   rx     ry   z$buffer_put_lines.<locals>.<listcomp>ri   N)r   r  r|   )rW   r  rd   rd   re   buffer_put_lines  s   r  )r^   r   )r^   r   r&  )r  r\   rW   r  r   r   r^   r   r   )rW   r  r   r   r^   r  )	NrU   NNrK   r   TNN)r   r   rb  rd  ro   r  r[   r\   r  r   r   r  rM   r\   r  r\   r   r
  rb   r   r  rd  r^   rn   )r<  r=  r^   rn   )r   rS  r^   rZ   )r   )r   r]  r1  r\   r^   r\   r7  )r   r]  r1  r\   r  r   r^   r\   )rb  rZ   r1  r\   r  r   r^   r   )r   rf  r  r   r^   r   rm  )r   rn  r1  ro  rk  rZ   r^   r   )rK   NN)
rS  rn   rM   r\   rT  r   r   ry  r^   rn   )r   )r~  r  r  r\   r^   rn   )r  r\   r^   r\   )r  r  r  r\   r^   rn   )r   r2   r^   rZ   )r   F)r  r   r  rZ   r^   r_   )ra   )rr  r   r  r  r^   r  )rW   r  r  rn   r^   r_   )r  
__future__r   collections.abcr   r   r   r   r   
contextlibr   csvr	   r
   r  r   	functoolsr   ior   r  r  shutilr   typingr   r   r   r   r   r   unicodedatar   numpyr  pandas._config.configr   r   pandas._libsr   pandas._libs.missingr   pandas._libs.tslibsr   r   r   r   r   r   pandas._libs.tslibs.nattyper    pandas.core.dtypes.commonr!   r"   r#   r$   r%   r&   pandas.core.dtypes.dtypesr'   r(   r)   pandas.core.dtypes.missingr*   r+   pandas.core.arraysr,   r-   r.   pandas.core.arrays.string_r/   pandas.core.baser0   pandas.core.commoncorecommonr  pandas.core.constructionr1   pandas.core.indexes.apir2   r3   r4   r5   pandas.core.indexes.datetimesr6   pandas.core.indexes.timedeltasr7   pandas.core.reshape.concatr8   pandas.io.commonr9   r:   r   r;   pandas._typingr<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   pandasrG   rH   rI   __annotations___VALID_JUSTIFY_PARAMETERSrS   rT   r   r   r   r   r   r   r   r  r  r  rp   r  r  r  r  r  rR  r\  r^  ra  re  ri  r  r  rl  r[  r  r  r  r&  r  r  r  r  rd   rd   rd   re   <module>   s       4;	@ !
'

!&   C  (Rp J

E
1"
!
$`;+