U
    -e>                    @  s  U d Z ddl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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l3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z> ddl?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZK ddlLmMZM ddlNmOZOmPZP ddlQmRZRmSZSmTZT ddlUmVZV ddlWmXZX ddlYmZ  m[Z\ ddl]m^Z^ ddl_m`Z`maZambZbmcZc ddldmeZe ddlfmgZg ddlhmiZi ddljmkZkmlZl ddlmmnZn erNddlompZpmqZq d Zrd!esd"< d#Ztd$Zud!esd%< G d&d' d'ZvG d(d) d)ZwG d*d+ d+ZxG d,d- d-exZyd+d.d/d0Zzd1d.d2d3Z{d1d.d4d5Z|G d6d7 d7Z}G d8d9 d9Z~dd:d;d<d<d=d>d?Zedd;d<d@dAdBdCZddHdIdJd:dKdLd:d:dMdKdIdNdOdPdQZG dRdS dSZG dTdU dUeZG dVdW dWeZG dXdY dYeZG dZd[ d[eZd\dNd]d^d_Zd`dadbdcddZddfd:d:dgdhdiZddfd:d<d:djdkdlZddad:d<dmdndodpZdqd<d<drdsdtZG dudv dveZG dwdx dxeZddzd{dadmd|d}d~ZddNd:dKddNdddZddd:dNdddZd:d:dddZddd:dNdddZddadddZG dd dZdddaddddZddHdddddZddNddddZdS )z
Internal module for formatting output data in csv, html, xml,
and latex files. This module also applies to display formatting.
    )annotations)contextmanager)
QUOTE_NONEQUOTE_NONNUMERIC)Decimal)partial)StringION)get_terminal_size)IOTYPE_CHECKINGAnyCallableFinal	GeneratorHashableIterableListMappingSequencecast)east_asian_width)
get_option
set_option)lib)NA)NaT	Timedelta	Timestampget_unit_from_dtypeiNaTperiods_per_day)NaTType)	ArrayLikeAxesColspaceArgTypeColspaceTypeCompressionOptionsFilePathFloatFormatTypeFormattersType
IndexLabelStorageOptionsWriteBuffer)is_categorical_dtypeis_complex_dtypeis_datetime64_dtypeis_extension_array_dtypeis_floatis_float_dtype
is_integeris_integer_dtypeis_list_likeis_numeric_dtype	is_scalaris_timedelta64_dtype)DatetimeTZDtype)isnanotna)CategoricalDatetimeArrayTimedeltaArray)StringDtype)PandasObject)extract_array)Index
MultiIndexPeriodIndexensure_index)DatetimeIndex)TimedeltaIndex)concat)check_parent_directorystringify_path)printing)	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 : sequence, 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                   @  sP   e Zd Zdddddddd	d
dZddddZddddZddddZdS )CategoricalFormatterNTNaNr<   IO[str] | NoneboolstrNone)categoricalbuflengthna_repfooterreturnc                 C  s8   || _ |d k	r|ntd| _|| _|| _|| _t| _d S N )r_   r   r`   rb   ra   rc   r   quoting)selfr_   r`   ra   rb   rc    ri   Y/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/pandas/io/formats/format.py__init__   s    zCategoricalFormatter.__init__rd   c                 C  sP   d}| j r*|r|d7 }|dt| j 7 }| j }|r@|d7 }||7 }t|S )Nrf   , Length: 
)ra   lenr_   _repr_categories_infor]   )rh   rc   
level_infori   ri   rj   _get_footer   s    
z CategoricalFormatter._get_footer	list[str]c                 C  s   t | j d d | j| jdS )N)float_formatrb   rg   )format_arrayr_   _internal_get_valuesrb   rg   rh   ri   ri   rj   _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rn|  }|rn|| td|S )	Nr   rf   c                 S  s   g | ]}|  qS ri   )strip.0iri   ri   rj   
<listcomp>   s     z2CategoricalFormatter.to_string.<locals>.<listcomp>rm   []ro   )r_   rp   rc   rs   ry   joinappendr]   )rh   r_   
fmt_valuesvaluesresultrc   ri   ri   rj   	to_string   s    

zCategoricalFormatter.to_string)NTrZ   T)__name__
__module____qualname__rk   rs   ry   r   ri   ri   ri   rj   rY      s       	rY   c                   @  sx   e Zd Zddddddd	dd
dddddddZddddZd	dddZddddZddddZd	dddZdS )SeriesFormatterNTrZ   FrM   r[   
bool | strr\   r]   
str | None
int | Noner^   )seriesr`   ra   headerindexrb   nameru   dtypemax_rowsmin_rowsrd   c                 C  st   || _ |d k	r|nt | _|| _|| _|| _|| _|| _|
| _|| _	|d krTt
d}|| _|	| _t | _|   d S )Ndisplay.float_format)r   r   r`   r   rb   r   ra   r   r   r   r   ru   r   get_adjustmentadj_chk_truncate)rh   r   r`   ra   r   r   rb   r   ru   r   r   r   ri   ri   rj   rk   	  s    zSeriesFormatter.__init__rl   c                 C  s   |  | j }| j}|o t| j|k}| j}|rtt|}|rDt||}|dkr`|}|jd | }n*|d }t|jd | |j| d  f}|| _	nd | _	|| _
|| _d S )N      )r   r   rp   r   r   intminilocrH   
tr_row_num	tr_seriesis_truncated_vertically)rh   r   r   r   r   row_numri   ri   rj   r   )  s$    

"zSeriesFormatter._chk_truncatec                 C  sF  | j j}d}t| j jdd d k	rLt| j jtttfs8t|d| j jj	 7 }| jdk	r|d k	r|rj|d7 }t
j|dd}|d| 7 }| jd	ks| jd
kr| jr|r|d7 }|dt| j  7 }| jdk	r| jd k	rt| jjdd }|r|r|d7 }|dt
| 7 }t| jjr>| jj }|r6|d7 }||7 }t|S )Nrf   freqzFreq: Frm   	ro   )escape_charszName: Ttruncatern   r   zdtype: ro   )r   r   getattrr   
isinstancerF   rD   rG   AssertionErrorZfreqstrrK   pprint_thingra   r   rp   r   r   r-   _valuesrq   r]   )rh   r   rc   Zseries_nameZ
dtype_namerr   ri   ri   rj   rs   D  sB     
zSeriesFormatter._get_footerztuple[list[str], bool]c                 C  sR   | j j}t|tr4tdd |jD }|jdd}n|jd k	}|jdd}||fS )Nc                 s  s   | ]
}|V  qd S Nri   r|   r   ri   ri   rj   	<genexpr>q  s     z7SeriesFormatter._get_formatted_index.<locals>.<genexpr>T)names)r   )r   r   r   rC   anyr   formatr   )rh   r   have_header	fmt_indexri   ri   rj   _get_formatted_indexm  s    

z$SeriesFormatter._get_formatted_indexrt   c                 C  s   t | jjd | j| j| jdS )N)ru   rb   leading_space)rv   r   r   ru   rb   r   rx   ri   ri   rj   ry   x  s    z%SeriesFormatter._get_formatted_valuesc                 C  s.  | j }|  }t|dkr2t| jj d| dS |  \}}|  }| jrd}| j	}t
t|}| j||d  }|dkrd}	nd}	| jj|	g|dd	d }	||| |	 ||d d
 | jr| jjd|dd  |g }
n| jd|}
| jr|r|d d |
 }
|r |
d| 7 }
td
|
S )Nr   z([], )r      ...z..rQ   moderf   ro   )r   )r   rs   rp   typer   r   r   ry   r   r   r   r   r   rR   insertr   adjoinr   r]   r   )rh   r   rc   r   r   r   Zn_header_rowsr   widthZdot_strr   ri   ri   rj   r     s2    
zSeriesFormatter.to_string)
NTTTrZ   FNTNN)	r   r   r   rk   r   rs   r   ry   r   ri   ri   ri   rj   r     s              & )	r   c                   @  sP   e Zd ZddddZddddd	ZddddddddZdddddZdS )TextAdjustmentr^   rl   c                 C  s   t d| _d S )Nzdisplay.encoding)r   encodingrx   ri   ri   rj   rk     s    zTextAdjustment.__init__r]   r   textrd   c                 C  s   t |S r   rp   rh   r   ri   ri   rj   rp     s    zTextAdjustment.lenrP   r   rt   textsmax_lenr   rd   c                 C  s   t j|||dS )Nr   )rK   rR   rh   r   r   r   ri   ri   rj   rR     s    zTextAdjustment.justify)spacerd   c                 O  s    t j|f|| j| jd|S )N)ZstrlenZjustfunc)rK   r   rp   rR   )rh   r   listskwargsri   ri   rj   r     s     zTextAdjustment.adjoinN)rP   )r   r   r   rk   rp   rR   r   ri   ri   ri   rj   r     s   r   c                      sH   e Zd Zdd fddZddddd	ZddddddddZ  ZS )EastAsianTextAdjustmentr^   rl   c                   s6   t    tdrd| _nd| _dddddd| _d S )Nz!display.unicode.ambiguous_as_wider   r   )ZNaNWFH)superrk   r   ambiguous_width_EAW_MAPrx   	__class__ri   rj   rk     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   )r|   crx   ri   rj   r     s    z.EastAsianTextAdjustment.len.<locals>.<genexpr>)r   r]   rp   sumr   ri   rx   rj   rp     s
    
zEastAsianTextAdjustment.lenrP   zIterable[str]rt   r   c                   sX   fdd |dkr( fdd|D S |dkrB fdd|D S  fdd|D S d S )	Nc                   s     |  t |  S r   r   )t)r   rh   ri   rj   _get_pad  s    z1EastAsianTextAdjustment.justify.<locals>._get_padrO   c                   s   g | ]}|  |qS ri   )ljustr|   xr   ri   rj   r~     s     z3EastAsianTextAdjustment.justify.<locals>.<listcomp>rQ   c                   s   g | ]}|  |qS ri   )rQ   r   r   ri   rj   r~     s     c                   s   g | ]}|  |qS ri   )rjustr   r   ri   rj   r~     s     ri   r   ri   )r   r   rh   rj   rR     s    zEastAsianTextAdjustment.justify)rP   )r   r   r   rk   rp   rR   __classcell__ri   ri   r   rj   r     s    r   rl   c                  C  s   t d} | rt S t S d S )Nz display.unicode.east_asian_width)r   r   r   )Zuse_east_asian_widthri   ri   rj   r     s    r   z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_colsZmax_colwidthshow_dimensions
line_width)pandas.io.formatsr   r   Zget_console_size)r   r   _ri   ri   rj   get_dataframe_repr_params  s    r   c                  C  sN   t  \} }tddkr|ntd}tddkr2|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   ra   )r	   r   )r   heightr   r   ri   ri   rj   get_series_repr_params  s    


r   c                   @  sX  e Zd ZdZerendZeee 7 Zdjdd	d
ddddddddddddddd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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/d0Zddd1d2d3Zdd4d5d6d7Zddd8d9d:Zd	d;d<d=d>Zd
d?d@dAdBZdddCdDZdddEdFZdddGdHdIZdddJdKZdddLdMZdddNdOZd.ddPdQZdddRdSZdddTdUZ dddVdWZ!dddXdYZ"d.dZd[d\d]Z#d^d_d[d`daZ$dddbdcddZ%ddZdbdedfZ&dgddhdiZ'dS )kDataFrameFormatterz;Class for processing dataframe formatting options and data.rf   NTrZ   F.rL   Sequence[Hashable] | NonezColspaceArgType | Nonezbool | Sequence[str]r\   r]   zFormattersType | Noner   FloatFormatType | Nonebool | Noner   r   r^   )framecolumns	col_spacer   r   rb   
formattersrR   ru   sparsifyindex_namesr   r   r   r   decimal	bold_rowsescaperd   c                 C  s   || _ | || _| || _|| _|| _|| _| || _	| 
|| _|	| _| |
| _|| _|| _|| _|| _|| _|| _|| _|| _|  | _|  | _| j | _|   t | _d S r   )r   _initialize_columnsr   _initialize_colspacer   r   r   rb   _initialize_formattersr   _initialize_justifyrR   ru   _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   )rh   r   r   r   r   r   rb   r   rR   ru   r   r   r   r   r   r   r   r   r   ri   ri   rj   rk   4  s.    

zDataFrameFormatter.__init__zlist[list[str]]rl   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   )rh   strcolsZ	str_indexri   ri   rj   get_strcolsc  s
    zDataFrameFormatter.get_strcolsc                 C  s   | j dkp| j dko| jS )NTr   )r   is_truncatedrx   ri   ri   rj   should_show_dimensionso  s    
z)DataFrameFormatter.should_show_dimensionsc                 C  s   t | jp| jS r   )r\   is_truncated_horizontallyr   rx   ri   ri   rj   r  u  s    zDataFrameFormatter.is_truncatedc                 C  s   t | jot| j| jkS r   )r\   r  rp   r   rx   ri   ri   rj   r  y  s    z,DataFrameFormatter.is_truncated_horizontallyc                 C  s   t | jot| j| jkS r   )r\   r  rp   r   rx   ri   ri   rj   r   }  s    z*DataFrameFormatter.is_truncated_verticallyc                 C  s    dt | j dt | jj dS )Nz

[z rows x z	 columns])rp   r   r   rx   ri   ri   rj   dimensions_info  s    z"DataFrameFormatter.dimensions_infoc                 C  s   t | jjS r   )
_has_namesr   r   rx   ri   ri   rj   has_index_names  s    z"DataFrameFormatter.has_index_namesc                 C  s   t | jjS r   )r  r   r   rx   ri   ri   rj   has_column_names  s    z#DataFrameFormatter.has_column_namesc                 C  s   t | j| j| jfS r   )allr  r   r  rx   ri   ri   rj   show_row_idx_names  s    z%DataFrameFormatter.show_row_idx_namesc                 C  s   t | j| j| jfS r   )r  r  r  r   rx   ri   ri   rj   show_col_idx_names  s    z%DataFrameFormatter.show_col_idx_namesr   c                 C  s   t | jpt| jt| jS r   )r   r   rp   r   rx   ri   ri   rj   max_rows_displayed  s    z%DataFrameFormatter.max_rows_displayed)r   rd   c                 C  s   |d krt dS |S )Nzdisplay.multi_sparser   )rh   r   ri   ri   rj   r    s    z'DataFrameFormatter._initialize_sparsifyr)   )r   rd   c                 C  sT   |d kri S t | jjt |ks*t|tr.|S tdt | dt | jj dd S )NzFormatters length(+) should match DataFrame number of columns(r   )rp   r   r   r   dict
ValueError)rh   r   ri   ri   rj   r     s    z)DataFrameFormatter._initialize_formatters)rR   rd   c                 C  s   |d krt dS |S d S )Nzdisplay.colheader_justifyr  )rh   rR   ri   ri   rj   r     s    z&DataFrameFormatter._initialize_justifyrB   )r   rd   c                 C  s2   |d k	r&t tt|}| j| | _|S | jjS d S r   )rE   r   r#   r   r   )rh   r   colsri   ri   rj   r     s
    z&DataFrameFormatter._initialize_columnsr%   )r   rd   c                   s    d kri }nt  ttfrBd i}| fdd| jjD  nt  tr  D ]&}|| jjkrT|dkrTtd| qT }nHt	| jjt	 krtdt	  dt	| jj dt
t| jj }|S )Nrf   c                   s   i | ]
}| qS ri   ri   )r|   columnr   ri   rj   
<dictcomp>  s      z;DataFrameFormatter._initialize_colspace.<locals>.<dictcomp>z,Col_space is defined for an unknown column: zCol_space length(r  r   )r   r   r]   updater   r   r   keysr  rp   r  zip)rh   r   r   r  ri   r  rj   r     s$    
z'DataFrameFormatter._initialize_colspacec                 C  s0   |   s| jS t \}}| |r&|S | jS dS )z%Number of columns fitting the screen.N)_is_in_terminalr   r	   _is_screen_narrow)rh   r   r   ri   ri   rj   r    s    

z(DataFrameFormatter._calc_max_cols_fittedc                 C  sP   |   r@t \}}| jdkr(||   S | |r8|}qF| j}n| j}| |S )z,Number of rows with data fitting the screen.r   )r!  r	   r   _get_number_of_auxillary_rows_is_screen_short_adjust_max_rows)rh   r   r   r   ri   ri   rj   r    s    


z(DataFrameFormatter._calc_max_rows_fitted)r   rd   c                 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
        )rp   r   r   r   )rh   r   ri   ri   rj   r%    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   )r\   r   r   rx   ri   ri   rj   r!    s    z"DataFrameFormatter._is_in_terminalc                 C  s   t | jdkot| jj|kS Nr   )r\   r   rp   r   r   )rh   	max_widthri   ri   rj   r"    s    z$DataFrameFormatter._is_screen_narrowc                 C  s   t | jdkot| j|kS r&  )r\   r   rp   r   )rh   
max_heightri   ri   rj   r$    s    z#DataFrameFormatter._is_screen_shortc                 C  s:   d}d}|| }| j r(|t| j 7 }| jr6|d7 }|S )z?Get number of rows occupied by prompt, dots and dimension info.r   )r   rp   r  
splitlinesr   )rh   Zdot_rowZ
prompt_rowZnum_rowsri   ri   rj   r#  	  s    z0DataFrameFormatter._get_number_of_auxillary_rowsc                 C  s    | j r|   | jr|   dS )zY
        Check whether the frame should be truncated. If so, slice the frame up.
        N)r  _truncate_horizontallyr   _truncate_verticallyrx   ri   ri   rj   r     s    zDataFrameFormatter.truncatec                 C  s   | j dk	st| j d }|dkr| jjddd|f }| jjdd| df }t||fdd| _t| jttfr| 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   Zaxis)r  r   r  r   rH   r   r   listtupler   r   r   Z
tr_col_num)rh   Zcol_numrO   rP   ri   ri   rj   r*  !  s    
z)DataFrameFormatter._truncate_horizontallyc                 C  s   | j dk	st| j d }|dkrb| 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  r   rH   r   r   r   r   )rh   r   headtailri   ri   rj   r+  ;  s    
z'DataFrameFormatter._truncate_verticallyc           
   	     s  g }t  jsb jsbt jD ]>\}} |}t| jt j	|d j
d}|| q|S t  jrttt  j _t jt jkrtdt j dt j ddd  jD }n  j} jr|D ]}|d qt jD ]\}}|| }tt j	|df fd	d
|D  } |}t| j| j
d}tt fdd
|D |}	 j
j||	 jd}|||  q|S )Nr   )stringsrR   minimumr   zWriting z cols but got z aliasesc                 S  s   g | ]
}|gqS ri   ri   )r|   labelri   ri   rj   r~   d  s     zADataFrameFormatter._get_strcols_without_index.<locals>.<listcomp>rf   c                 3  s   | ]} j |V  qd S r   r   rp   r   rx   ri   rj   r   o  s     z@DataFrameFormatter._get_strcols_without_index.<locals>.<genexpr>)r2  r   c                 3  s   | ]} j |V  qd S r   r4  r   rx   ri   rj   r   v  s     r   )r5   r   	enumerater  
format_col_make_fixed_widthrR   r   r   r   r   r   r   r   r]   rp   r   r  _get_formatted_column_labelsr  max)
rh   r	  r}   r   r   str_columnsr   ZcheaderZheader_colwidthr   ri   rx   rj   r  M  sR    


   z-DataFrameFormatter._get_strcols_without_indexrt   )r}   rd   c              	   C  sL   | j }| |}t|jd d |f j|| j| j| j|j	| | j
| jdS )N)ru   rb   r   r   r   )r  _get_formatterrv   r   r   ru   rb   r   r   r   r   r   )rh   r}   r   	formatterri   ri   rj   r6  |  s    
zDataFrameFormatter.format_col	str | intCallable | Nonec                 C  s`   t | jttfr2t|r,tt|}| j| S d S n*t|rN|| jkrN| j| }| j|d S d S r   )	r   r   r-  r.  r3   r   r   r   r   )rh   r}   ri   ri   rj   r;    s    


z!DataFrameFormatter._get_formatter)r   rd   c                   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rt|r||}d
d t| D }n<| }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   )Zis_floating)r|   levelri   ri   rj   r     s     zBDataFrameFormatter._get_formatted_column_labels.<locals>.<genexpr>c                   s"   |j kr |  rsd| S |S )N )r   )r   y)need_leadsprestrict_formattingrh   ri   rj   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 ri   ri   )r|   rB  )rE  r   ri   rj   r~     s     zMDataFrameFormatter._get_formatted_column_labels.<locals>.<genexpr>.<listcomp>Nri   )r|   )rE  r   rj   r     s     c                 S  s   g | ]}t |qS ri   )r-  r   ri   ri   rj   r~     s     zCDataFrameFormatter._get_formatted_column_labels.<locals>.<listcomp>c                   s0   g | ](\}} |s& | r&d | n|gqS )rA  )r;  )r|   r}   r   )rC  rh   ri   rj   r~     s   )Zpandas.core.indexes.multir?  r   r   rC   r   r-  r   r   dtypesr   r   levelsr  mapr6   r   rp   r5  )rh   r   r?  r   Zfmt_columnsrG  r:  ri   )rC  rD  rh   rE  rj   r8    s,    

	z/DataFrameFormatter._get_formatted_column_labelsc                   s   dd j  D  |j}|j}d}t|trL|jjdj	|d}n|jj	|dg} fdd|D }j
jd| d
}jrdd  D }ndg|j }jr|| S |S d S )Nc                 S  s   i | ]\}}|t t|qS ri   )r   r   )r|   kvri   ri   rj   r    s      z;DataFrameFormatter._get_formatted_index.<locals>.<dictcomp>	__index__F)r   r   r   r<  )r   r<  c              
     s.   g | ]&}t tt|d  ddjdqS )rO   rf   r   )rR   r2  r   )r.  r7  r-  r   r   r   r   rh   ri   rj   r~     s     
 z;DataFrameFormatter._get_formatted_index.<locals>.<listcomp>r   ro   c                 S  s   g | ]}t |qS ri   r]   r   ri   ri   rj   r~     s     rf   )r   )r   itemsr   r   r;  r   rC   r   r   r  r   r   splitr  _get_column_name_listZnlevelsr   )rh   r   r   r   fmtr   ZadjoinedZ
col_headerri   rM  rj   r     s,    

	z'DataFrameFormatter._get_formatted_indexzlist[Hashable]c                 C  sL   g }| j j}t|tr.|dd |jD  n||jd kr@dn|j |S )Nc                 s  s   | ]}|d krdn|V  qd S re   ri   r   ri   ri   rj   r     s     z;DataFrameFormatter._get_column_name_list.<locals>.<genexpr>rf   )r   r   r   rC   extendr   r   r   )rh   r   r   ri   ri   rj   rQ    s    
z(DataFrameFormatter._get_column_name_list)NNTTrZ   NNNNTNNNFr   FT)(r   r   r   __doc__rN   rX   rk   r
  propertyr  r  r  r   r  r  r  r  r  r  r  r   r   r   r   r  r  r%  r!  r"  r$  r#  r   r*  r+  r  r6  r;  r8  r   rQ  ri   ri   ri   rj   r   .  s~                    4/

/)(r   c                   @  s   e Zd ZdZdddddZd(d	d
dd
dd
ddd
d
d
dddZd)d	d
dddd
dd
dddZd*d	d
dd
dddZd+dd
d d!d"d d#dd d
dd
dd
d d$d
d%d&d'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^   )rR  rd   c                 C  s
   || _ d S r   )rR  )rh   rR  ri   ri   rj   rk     s    zDataFrameRenderer.__init__NF"FilePath | WriteBuffer[str] | Noner   r\   zstr | tuple[str, str] | None)r`   column_format	longtabler   multicolumnmulticolumn_formatmultirowcaptionr3  positionrd   c                 C  s>   ddl m} || j|||||||	|
d	}| }t|||dS )zU
        Render a DataFrame to a LaTeX tabular/longtable environment output.
        r   )LatexFormatter)rY  rX  rZ  r[  r\  r]  r3  r^  r`   r   )Zpandas.io.formats.latexr_  rR  r   save_to_buffer)rh   r`   rX  rY  r   rZ  r[  r\  r]  r3  r^  r_  Zlatex_formatterstringri   ri   rj   to_latex  s    zDataFrameRenderer.to_latexzstr | list | tuple | Nonezint | bool | None)r`   r   classesnotebookbordertable_idrender_linksrd   c                 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)rd  rf  rg  rh  r`  )Zpandas.io.formats.htmlri  rj  rR  r   ra  )rh   r`   r   rd  re  rf  rg  rh  ri  rj  ZKlassZhtml_formatterrb  ri   ri   rj   to_html$  s    "zDataFrameRenderer.to_htmlr   )r`   r   r   rd   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`  )Zpandas.io.formats.stringrl  rR  r   ra  )rh   r`   r   r   rl  Zstring_formatterrb  ri   ri   rj   r   W  s    zDataFrameRenderer.to_string,winfer"Tstrictz7FilePath | WriteBuffer[bytes] | WriteBuffer[str] | Noner]   r   zIndexLabel | Noner&   r+   )path_or_bufr   sepr   index_labelr   compressionrg   	quotecharlineterminator	chunksizedate_formatdoublequote
escapecharerrorsstorage_optionsrd   c                 C  s   ddl m} |dkr d}t }nd}|||
||||||||||	||||| jd}|  |r~t|tsjt| }|  |S dS )z;
        Render dataframe as comma-separated file.
        r   )CSVFormatterNTF)rr  rw  rs  r   r|  ru  rg   r  rt  r   rx  rv  ry  rz  r{  r}  r<  )	Zpandas.io.formats.csvsr~  r   rR  saver   r   getvalueclose)rh   rr  r   rs  r   rt  r   ru  rg   rv  rw  rx  ry  rz  r{  r|  r}  r~  Zcreated_bufferZcsv_formattercontentri   ri   rj   to_csvq  s>    zDataFrameRenderer.to_csv)
NNFNFNFNNN)NNNFNNF)NNN)NNrm  NNrn  ro  Nrp  NNNTNrq  N)	r   r   r   rT  rk   rc  rk  r   r  ri   ri   ri   rj   rV    sT             $"       5                   rV  r]   rW  r   )rb  r`   r   rd   c              
   C  sL   t ||d6}||  |dkr4| W  5 Q R  S W 5 Q R  dS Q R X dS )zQ
    Perform serialization. Write to buf or return as string if buf is None.
    )r   N)
get_bufferwriter  )rb  r`   r   fri   ri   rj   ra    s
    
ra  zIGenerator[WriteBuffer[str], None, None] | Generator[StringIO, None, None])r`   r   rd   c              	   c  s   | dk	rt | } nt } |dkr&d}nt| ts8tdt| drJ| V  nBt| trtt|  t| d|dd}|V  W 5 Q R X ntddS )	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  rn  rf   )r   newlinez1buf is not a file name and it has no write method)	rJ   r   r   r]   r  hasattrrI   open	TypeError)r`   r   r  ri   ri   rj   r    s    



r  rZ   rP   r   Tr   r>  r   r   zstr | int | Noner   rt   )r   r<  ru   rb   digitsr   rR   r   r   rg   fallback_formatterrd   c                 C  s   t | jrt}n`t| jtr"t}nNt| jr2t}n>t| jrBt	}n.t
| jsVt| jr\t}nt| jrlt}nt}|dkr|d}|dkrtd}|dkrt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]
    N   r   display.precision)
r  rb   ru   r<  r   rR   r   r   rg   r  )r/   r   Datetime64Formatterr   r9   Datetime64TZFormatterr8   Timedelta64Formatterr0   ExtensionArrayFormatterr2   r.   FloatArrayFormatterr4   IntArrayFormatterGenericArrayFormatterr   
get_result)r   r<  ru   rb   r  r   rR   r   r   rg   r  Z	fmt_klassZfmt_objri   ri   rj   rv     sB    )



rv   c                   @  sP   e Zd Zddd	d
ddddddddd
ddddZddddZddddZdS )r     NrZ   r  rP   r   Tr   r   r>  r]   r=  r   r   r\   r   r^   )r   r  r<  rb   r   ru   rR   r   rg   fixed_widthr   r  rd   c                 C  sL   || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	|| _
|| _d S r   )r   r  rb   r   r<  ru   rR   r   rg   r  r   r  )rh   r   r  r<  rb   r   ru   rR   r   rg   r  r   r  ri   ri   rj   rk   6  s    zGenericArrayFormatter.__init__rt   rl   c                 C  s   |   }t|| jS r   )_format_stringsr7  rR   )rh   r   ri   ri   rj   r  R  s    z GenericArrayFormatter.get_resultc                   s  j d kr0td}|d kr6tdfdd}nj }jd k	rHj n6jd k	rZj n$jd k	oljtk}ttjd|d  fdd}t	j
d	d
}t|tjstdt|t}|tjt|ttdt|jd@ }j}|d kr| }g }t|D ]\}	}
||	 r jd k	r<|r<|d||
  nD||	 rV|||
 n*|dkrfd}nd}||j||
d q|S )Nr   r  c                   s   t | d ddS )Nz .dr  )_trim_zeros_single_floatrF  )	precisionri   rj   <lambda>[  s   z7GenericArrayFormatter._format_strings.<locals>.<lambda>r   )r   quote_stringsc              	     s   j d k	rvt| rvt| rvz<| d kr*W dS | tkr<ttW S | tksNt| rTW dS W n tt	fk
rn   Y nX j S t
| trt| S t
| trt| S t | S d S )Nr^   r   )rb   r7   r:   r   r]   r   npZisnatr  r  r   r@   r?   reprrF  )r<  rh   ri   rj   _formatm  s     



z6GenericArrayFormatter._format_strings.<locals>._formatTZextract_numpyz<ExtensionArray formatting should use ExtensionArrayFormatterr   r,  rA  Fz{v}z {v}rK  )ru   r   r<  r  rg   r   r   rK   r   rA   r   r   r  ndarrayr  r   Z	map_inferr1   r  r;   r.  rangerp   shaper   r   r5  r   r   )rh   ru   r  r  valsinferredZis_float_typer   r   r}   rK  Ztplri   )r<  r  rh   rj   r  V  sR    


 

z%GenericArrayFormatter._format_strings)r  NrZ   r  NrP   r   NTTN)r   r   r   rk   r  r  ri   ri   ri   rj   r  5  s              (r  c                      sR   e Zd Zdd fddZddddd	d
dZddddZddddZ  ZS )r  r^   rl   c                   sD   t  j|| | jd k	r@| jd kr@d| _t| jr@| j| _d | _d S )NF)r   rk   ru   r<  r  callable)rh   argsr   r   ri   rj   rk     s    
zFloatArrayFormatter.__init__Nr   zfloat | Noner   )ru   	thresholdrd   c                   sl   dkrj r"fdd nfdd jdkrH fddn dkrXS fdd	}|S )
z;Returns a function to be applied on each value to format itNc                   s$    d k	st t| r | dS jS )Nvalue)r   r;   rb   r  )ru   rh   ri   rj   base_formatter  s
    z<FloatArrayFormatter._value_formatter.<locals>.base_formatterc                   s   t | rt| S  jS r   )r;   r]   rb   r  rx   ri   rj   r    s    r   c                   s    |  djdS )Nr   r   )replacer   r  )r  rh   ri   rj   decimal_formatter  s    z?FloatArrayFormatter._value_formatter.<locals>.decimal_formatterc                   s0   t | r&t| kr | S  dS njS d S )Ng        )r;   absrb   r  )r  rh   r  ri   rj   r<    s
    
z7FloatArrayFormatter._value_formatter.<locals>.formatter)ru   r   )rh   ru   r  r<  ri   )r  r  ru   rh   r  rj   _value_formatter  s    
	z$FloatArrayFormatter._value_formatter
np.ndarrayc           
   	     sp  dddddd j dk	r. jj jS jr>tdnd fd	d
}jdkrjrjdkrrd}nd}t|jj	d}qj}nfdd}||}js|S t
|dkrtdd |D }|j	d k}nd}tjdd: tj}|dk }|dj	  k |dk@  }	W 5 Q R X |	s>|rl|rljdkrPd}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   r]   )r   r<  rb   c                   s<   t | }t fddt|  | D | j}|S )Nc                   s    g | ]\}}|s |nqS ri   ri   )r|   valmr<  rb   ri   rj   r~     s   zWFloatArrayFormatter.get_result_as_array.<locals>.format_with_na_rep.<locals>.<listcomp>)r:   r  arrayr   ravelZreshaper  )r   r<  rb   mask	formattedri   r  rj   format_with_na_rep  s    zCFloatArrayFormatter.get_result_as_array.<locals>.format_with_na_repNzdisplay.chop_thresholdc                   sx    | }jdkr"dj }nj}j}t|} |||}jrt|rZt|j}nt|j}t	j
|ddS |S )NrO   rA  objectr   )r  rR   rb   r   r.   r  _trim_zeros_complexr   _trim_zeros_floatr  asarray)ru   r<  rb   r   Z
is_complexr   r  rh   r  ri   rj   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   )ru   r  rx   ri   rj   r  (      z9FloatArrayFormatter.get_result_as_array.<locals>.<lambda>r   c                 s  s   | ]}t |V  qd S r   r   r   ri   ri   rj   r   4  s     z:FloatArrayFormatter.get_result_as_array.<locals>.<genexpr>   Fignoreinvalidg    .A
   z{value: .{digits:d}e}z{value:.{digits:d}e})r<  r   rb   r  r   ru   r   r   r   r  rp   r9  r  errstater  r   )
rh   r  Zfmt_strru   Zformatted_valuesmaxlenZtoo_longZabs_valsZhas_large_valuesZhas_small_valuesri   r  rj   get_result_as_array  sD    




z'FloatArrayFormatter.get_result_as_arrayrt   c                 C  s   t |  S r   )r-  r  rx   ri   ri   rj   r  M  s    z#FloatArrayFormatter._format_strings)NN)r   r   r   rk   r  r  r  r   ri   ri   r   rj   r    s     8cr  c                   @  s   e Zd ZddddZdS )r  rt   rl   c                   s>   | j dkrdd }ndd }| jp$|  fdd| jD }|S )NFc                 S  s   | dj | dS )Nr  rF  r   rF  ri   ri   rj   r  T  r  z3IntArrayFormatter._format_strings.<locals>.<lambda>c                 S  s   | dj | dS )Nz drF  r  rF  ri   ri   rj   r  V  r  c                   s   g | ]} |qS ri   ri   r   r<  ri   rj   r~   X  s     z5IntArrayFormatter._format_strings.<locals>.<listcomp>)r   r<  r   )rh   Zformatter_strr   ri   r  rj   r  R  s    


z!IntArrayFormatter._format_stringsNr   r   r   r  ri   ri   ri   rj   r  Q  s   r  c                      s8   e Zd Zdddddd fddZd	d
ddZ  ZS )r  r   Nz3np.ndarray | Series | DatetimeIndex | DatetimeArrayr]   r^   )r   nat_repry  rd   c                   s    t  j|f| || _|| _d S r   )r   rk   r  ry  )rh   r   r  ry  r   r   ri   rj   rk   ]  s    zDatetime64Formatter.__init__rt   rl   c                   sZ    j }t|tst|} jdk	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 ri   r  r   rx   ri   rj   r~   p  s     z7Datetime64Formatter._format_strings.<locals>.<listcomp>)rb   ry  )
r   r   rF   r<  r  _dataZ_format_native_typesr  ry  tolist)rh   r   r   ri   rx   rj   r  h  s    
 z#Datetime64Formatter._format_strings)r   Nr   r   r   rk   r  r   ri   ri   r   rj   r  \  s     r  c                   @  s   e Zd ZddddZdS )r  rt   rl   c                 C  s|   t | jdd}| j}d }|d kr,|jdd}t|tr@| }n
t|}t	||| j
| j| j| j| j| j| j| j|d}|S )NTr  )Zboxed)	ru   rb   r  r   rR   r   r   rg   r  )rA   r   r<  
_formatterr   r<   rw   r  r  rv   ru   rb   r  r   rR   r   r   rg   )rh   r   r<  r  r  r   ri   ri   rj   r  y  s,    


z'ExtensionArrayFormatter._format_stringsNr  ri   ri   ri   rj   r  x  s   r  znp.ndarray | Sequence[float])percentilesrd   c                 C  sX  t | } t jdd2 t| r<t | dkr<t | dksDtdW 5 Q R X d|  } |  t}t 	|| }t |r|t
}dd |D S t | }|d dkr|d nd	}|d
 dk rd|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  r   r   z/percentiles should all be in the interval [0,1]d   c                 S  s   g | ]}|d  qS %ri   r{   ri   ri   rj   r~     s     z&format_percentiles.<locals>.<listcomp>N)to_beginto_endr  c                 S  s   g | ]}|d  qS r  ri   r{   ri   ri   rj   r~     s     )r  r  r  r6   r  r  roundastyper   iscloser]   uniquefloorlog10r   Zediff1dr9  Z
empty_liker  )r  Zpercentiles_round_typeZint_idxoutZunique_pctsr  r  precri   ri   rj   format_percentiles  s8    "




r  z2np.ndarray | DatetimeArray | Index | DatetimeIndexr\   r   rd   c                 C  s~   t | ts|  } t | ttfs(t| } | jd k	r6dS | j}|tk}t| j	}t
|}t||| dk dk}|rzdS dS )NFr   T)r   rB   r  r=   rF   tzZasi8r   r   r   r    r  logical_andr   )r   
values_intconsider_valuesZresoZppd	even_daysri   ri   rj   is_dates_only  s    


r  r   zNaTType | Timestamp)r   r  rd   c                 C  s   | t kr|S t| S r   )r   r]   )r   r  ri   ri   rj   _format_datetime64  s    r  )r   r  ry  rd   c                 C  s&   t | tr|S |r| |S | jS d S r   )r   r!   strftimeZ
_date_repr)r   r  ry  ri   ri   rj   _format_datetime64_dateonly  s
    

r  r   )is_dates_only_r  ry  rd   c                   s"   | r fddS fddS dS )z]Return a formatter callable taking a datetime64 as input and providing
    a string as outputc                   s   t |  dS )N)r  ry  )r  rF  ry  r  ri   rj   r    s     z'get_format_datetime64.<locals>.<lambda>c                   s   t |  dS )Nr  )r  rF  r  ri   rj   r    r  Nri   )r  r  ry  ri   r  rj   get_format_datetime64  s    r  z*np.ndarray | DatetimeArray | DatetimeIndex)r   ry  rd   c                 C  s6   t | tjr| jdkr|  } t| }|r2|p0dS |S )z6given values and a date_format, return a string formatr   z%Y-%m-%d)r   r  r  ndimr  r  )r   ry  idori   ri   rj   !get_format_datetime64_from_values  s    r  c                   @  s   e Zd ZddddZdS )r  rt   rl   c                   s>   | j t}t|}| jp&t|| jd  fdd|D }|S )zwe by definition have a TZ)ry  c                   s   g | ]} |qS ri   ri   r   r  ri   rj   r~   4  s     z9Datetime64TZFormatter._format_strings.<locals>.<listcomp>)r   r  r  r  r<  r  ry  )rh   r   r  r   ri   r  rj   r  -  s     z%Datetime64TZFormatter._format_stringsNr  ri   ri   ri   rj   r  ,  s   r  c                      s8   e Zd Zdddddd fdd	Zd
dddZ  ZS )r  r   Fznp.ndarray | TimedeltaIndexr]   r\   r^   r   r  boxrd   c                   s    t  j|f| || _|| _d S r   )r   rk   r  r  )rh   r   r  r  r   r   ri   rj   rk   :  s    zTimedelta64Formatter.__init__rt   rl   c                   s.   | j pt| j| j| jd  fdd| jD S )N)r  r  c                   s   g | ]} |qS ri   ri   r   r  ri   rj   r~   I  s     z8Timedelta64Formatter._format_strings.<locals>.<listcomp>)r<  get_format_timedelta64r   r  r  rx   ri   r  rj   r  E  s      z$Timedelta64Formatter._format_strings)r   Fr  ri   ri   r   rj   r  9  s     r  Fz,np.ndarray | TimedeltaIndex | TimedeltaArrayzstr | floatr  c           
        s^   |  tj}|tk}d}|| dk}t||}| dk}|rFd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 kst | rt| rS t| ts.t| } | jd} rJd| d}|S )Nr  ')r7   r:   r   r   Z
_repr_base)r   r   r  r   r  ri   rj   r  k  s    
z*get_format_timedelta64.<locals>._formatter)viewr  Zint64r   r  r   )
r   r  r  r  r  Zone_day_nanosZnot_midnightZbothr  r  ri   r  rj   r  L  s    r  zTextAdjustment | None)r1  rR   r2  r   rd   c                   s   t | dks|dkr| S |d kr(t  n| t fdd| D |d k	rTt|tdd k	rpkrpddd fdd	fd
d| D }  j| |d}|S )Nr   r  c                 3  s   | ]}  |V  qd S r   r   r   )
adjustmentri   rj   r     s     z$_make_fixed_width.<locals>.<genexpr>r   r]   )r   rd   c                   s6   d k	r2dk  | k@ r2| d d  d } | S )Nr   r   r   rF  )r  conf_maxr   ri   rj   just  s    z_make_fixed_width.<locals>.justc                   s   g | ]} |qS ri   ri   r   )r  ri   rj   r~     s     z%_make_fixed_width.<locals>.<listcomp>r   )rp   r   r9  r   rR   )r1  rR   r2  r   r   ri   )r  r  r  r   rj   r7  {  s    
r7  r  )str_complexesr   rd   c                   sD    fdd| D }dd |D }t |fddt||D }|S )z
    Separates the real and imaginary parts from the complex number, and
    executes the _trim_zeros_float method on each of those.
    c              	     s$   g | ]}d  ttd| qS )rf   z([j+-]))r   r  rerP  r   )r   ri   rj   r~     s   z'_trim_zeros_complex.<locals>.<listcomp>c                 S  s   g | ]}t |qS ri   r   )r|   sri   ri   rj   r~     s     c                   s   g | ]\}}|d |d d d    | d d  ||d d d  |d d    ||d d  d   | d d  |d  qS )Nr   r   0r  ri   )r|   r  rJ  )
max_lengthri   rj   r~     s   ")r9  r   )r  r   trimmedlengthspaddedri   )r   r  rj   r    s    

	r  )	str_floatrd   c                 C  s    |  d} | dr| d7 } | S )zX
    Trims trailing zeros after a decimal point,
    leaving just one if necessary.
    r  r   )rstripendswith)r  ri   ri   rj   r    s    

r  np.ndarray | list[str])
str_floatsr   rd   c                   sp   | }t d  dddfdddddfd	d
}||rXfdd|D }q< 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\   rl   c                   s   t  | d k	S r   )r   matchrF  )number_regexri   rj   is_number_with_decimal  s    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 ri   ri   r   r  ri   rj   r~     s      z:_trim_zeros_float.<locals>.should_trim.<locals>.<listcomp>r   c                 s  s   | ]}| d V  qdS )r  Nr	  r   ri   ri   rj   r     s     z9_trim_zeros_float.<locals>.should_trim.<locals>.<genexpr>)rp   r  )r   numbersr  ri   rj   should_trim  s    z&_trim_zeros_float.<locals>.should_trimc                   s$   g | ]} |r|d d n|qS )Nr  ri   r   r  ri   rj   r~     s     z%_trim_zeros_float.<locals>.<listcomp>c                   s*   g | ]"}|r"|  r"|d  n|qS )r  r  r   )r   r  ri   rj   r~     s   )r   compile)r  r   r  r  r   ri   )r   r  r  rj   r    s    r  rB   )r   rd   c                 C  s$   t | trtj| j S | jd k	S d S r   )r   rC   comZany_not_noner   r   )r   ri   ri   rj   r    s    
r  c                   @  s\   e Zd ZdZdddddddd	d
dddddddddZd!ddddddZddddd ZdS )"EngFormatterzl
    Formats float values according to engineering format.

    Based on matplotlib.ticker.EngFormatter
    rB  zar  pnur  rf   rJ  MGTPEZY)iiiiiiir   r   r  	   r              NFr   r\   r^   accuracyuse_eng_prefixrd   c                 C  s   || _ || _d S r   r)  r*  )rh   r)  r*  ri   ri   rj   rk   	  s    zEngFormatter.__init__floatr]   )numrd   c           
      C  s  t t|}t |rdS t |r(dS d}|dk r>d}| }|dkrft tt| d d }nt d}|t	| j
 }|	t| j
 }t|}| jr| j
| }n$|dk rd| d}nd	|d}|| d
|  }| jdkrd}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
        rZ   infr   r   r  r   zE-02dzE+r  Nz{mant: g}{prefix}z{mant: .r  z
f}{prefix})mantprefix)r   r]   is_nanis_infiniter   mathr  r  r   r9  ENG_PREFIXESr  r*  r)  r   )
rh   r-  ZdnumsignZpow10Z	int_pow10r1  r0  
format_strr  ri   ri   rj   __call__  s4    

 
zEngFormatter.__call__)NF)r   r   r   rT  r5  rk   r8  ri   ri   ri   rj   r    s.      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+  ri   ri   rj   set_eng_float_formatN  s    7r9  rf   zbool | object | strzlist[dict[int, int]])rH  sentinelrd   c           	      C  s   t | dkrg S dgt | d  }g }| D ]b}d}i }t|D ]2\}}|| rX||krXq>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)rp   r5  r   )	rH  r:  controlr   r@  
last_indexr  r}   keyri   ri   rj   get_level_lengths  s     r>  zWriteBuffer[str])r`   linesrd   c                 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   ri   ri   rj   r     s     z#buffer_put_lines.<locals>.<genexpr>c                 S  s   g | ]}t |qS ri   rN  r   ri   ri   rj   r~     s     z$buffer_put_lines.<locals>.<listcomp>ro   N)r   r  r   )r`   r?  ri   ri   rj   buffer_put_lines  s    r@  )NN)N)	NrZ   NNrP   r   TNN)r   )r   N)r   N)r   F)rP   NN)r   )r   )r   F)rf   )rT  
__future__r   
contextlibr   csvr   r   r   r   	functoolsr   ior   r4  r   shutilr	   typingr
   r   r   r   r   r   r   r   r   r   r   r   unicodedatar   numpyr  Zpandas._config.configr   r   Zpandas._libsr   Zpandas._libs.missingr   Zpandas._libs.tslibsr   r   r   r   r   r    Zpandas._libs.tslibs.nattyper!   Zpandas._typingr"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   Zpandas.core.dtypes.commonr-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   Zpandas.core.dtypes.dtypesr9   Zpandas.core.dtypes.missingr:   r;   Zpandas.core.arraysr<   r=   r>   Zpandas.core.arrays.string_r?   Zpandas.core.baser@   Zpandas.core.commoncorecommonr  Zpandas.core.constructionrA   Zpandas.core.indexes.apirB   rC   rD   rE   Zpandas.core.indexes.datetimesrF   Zpandas.core.indexes.timedeltasrG   Zpandas.core.reshape.concatrH   Zpandas.io.commonrI   rJ   r   rK   ZpandasrL   rM   rN   __annotations__Z_VALID_JUSTIFY_PARAMETERSrX   rY   r   r   r   r   r   r   r   rV  ra  r  rv   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r7  r  r  r  r  r  r9  r>  r@  ri   ri   ri   rj   <module>   s   8 48;	@ !'!&   E @   (         &Rp -F       1   " $a; +