gL idZddlmZddlmZmZmZmZddlZddl Z ddl Z ddl m Z m Z mZmZddlZddlZddlmZddlmZddlmZdd lmZdd lmZmZdd lmZm Z m!Z!m"Z"ddl#m$cm%Z&dd l'm(Z(dd l)m*Z*ddl+m,Z,m-Z-ddl.m/Z/ddl0m1Z1e rddl2m3Z3m4Z4m5Z5m6Z6ddlm7Z7GddZ8Gdde8Z9GddZ:GddZ;y)zC Utilities for conversion to writer-agnostic Excel representation. ) annotations)HashableIterableMappingSequenceN) TYPE_CHECKINGAnyCallablecast) is_list_like)doc)find_stack_level)missing)is_float is_scalar) DataFrameIndex MultiIndex PeriodIndex) _shared_docs) CSS4_COLORS) CSSResolver CSSWarning)get_level_lengths) pprint_thing)FilePath IndexLabelStorageOptionsWriteExcelBuffer ExcelWriterc6eZdZdZeZ d ddZy) ExcelCellrowcolvalstyle mergestartmergeendNcX||_||_||_||_||_||_yNr$)selfr%r&r'r(r)r*s ]/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/pandas/io/formats/excel.py__init__zExcelCell.__init__Cs. $  )NNN) r%intr&r1r) int | Noner*r2returnNone)__name__ __module__ __qualname__ __fields__ __slots__r/r0r.r#r#?sLIJI!%#! !!  !! !r0r#c@eZdZ dfd ZxZS) CssExcelCellc  |rK|rI|||fD cic]\} }| j|} } }t| j} || }t |d|||d| ycc}} w)Nr%r&r'r(r:)lower frozensetitemssuperr/)r-r%r&r'r( css_stylescss_rowcss_col css_converterkwargspropdeclaration_dictunique_declarations __class__s r.r/zCssExcelCell.__init__Us -4>gw>N3O &/dC c!   #,,<,B,B,D"E !"56E JScs%J6J sA$)r%r1r&r1r( dict | NonerCz3dict[tuple[int, int], list[tuple[str, Any]]] | NonerDr1rEr1rFCallable | Noner3r4)r5r6r7r/ __classcell__)rKs@r.r<r<TsfK KK  K H KKK'K KKr0r<ceZdZUdZeZdddddddZdddddddddddddd Zdddd Zd d d d dZ dDcic]}|j|c}}Z de d<d.d/dZ eZ d0dZ d0dZd1dZd2dZd3dZd4dZ d5dZd6dZd7dZd8dZd9dZd:dZd;d Z dd%Z!d4d&Z"d=d'Z#d?d(Z$d@d)Z%dAd*Z&dBd+Z'dCd,Z(dBd-Z)ycc}}w)DCSSToExcelConverteraK A callable for converting CSS declarations to ExcelWriter styles Supports parts of CSS 2.2, with minimal CSS 3.0 support (e.g. text-shadow), focusing on font styling, backgrounds, borders and alignment. Operates by first computing CSS styles in a fairly generic way (see :meth:`compute_css`) then determining Excel style properties from CSS properties (see :meth:`build_xlstyle`). Parameters ---------- inherited : str, optional CSS declarations understood to be the containing scope for the CSS processed by :meth:`__call__`. topcenterbottom)rQztext-topmiddlebaselinerSz text-bottomTF) boldbolder600700800900normallighter100200300400500)r\italicoblique)serifz sans-serifcursivefantasy) dashed mediumDashDot dashDotDothairdottedmediumDashDotDotdoubledashDot slantDashDot mediumDashedzdict[str, str] | None inheritedNc||j||_nd|_tj|j|_yr,) compute_cssrv functoolscache_call_uncached _call_cached)r-rvs r.r/zCSSToExcelConverter.__init__s:  !--i8DN!DN&OOD,?,?@r0c$|j|S)a Convert CSS declarations to ExcelWriter style. Parameters ---------- declarations : str | frozenset[tuple[str, str]] CSS string or set of CSS declaration tuples. e.g. "font-weight: bold; background: blue" or {("font-weight", "bold"), ("background", "blue")} Returns ------- xlstyle : dict A style as interpreted by ExcelWriter when found in ExcelCell.style. )r|)r- declarationss r.__call__zCSSToExcelConverter.__call__s&  ..r0c\|j||j}|j|Sr,)rxrv build_xlstyle)r-r~ propertiess r.r{z"CSSToExcelConverter._call_uncacheds+%%lDNNC !!*--r0c|j||j||j||j||j |d}dfd ||S)N) alignmentborderfillfont number_formatct|jD]*\}}|||= t|ts||r(||=,y)z4Remove key where value is None, through nested dictsN)listrA isinstancedict)dkv remove_nones r.rz6CSSToExcelConverter.build_xlstyle..remove_nonesGQWWY !19!4(NaD  !r0)rdict[str, str | None]r3r4)build_alignment build_border build_fill build_fontbuild_number_format)r-propsoutrs @r.rz!CSSToExcelConverter.build_xlstyles`--e4''.OOE*OOE*!55e<   ! C r0ch|jd|j||j|dS)Nz text-align) horizontalvertical wrap_text)get_get_vertical_alignment_get_is_wrap_textr-rs r.rz#CSSToExcelConverter.build_alignments6 ))L144U;//6  r0c`|jd}|r|jj|Sy)Nzvertical-align)r VERTICAL_MAP)r-rvertical_aligns r.rz+CSSToExcelConverter._get_vertical_alignments.#34 $$((8 8r0cF|jdyt|ddvS)Nz white-space)nowrapprezpre-line)rboolrs r.rz%CSSToExcelConverter._get_is_wrap_text s* 99] # +E-(0MMNNr0c*dDcic]}||j|jd|d|jd|d|j|jd|d|j|jd|ddc}Scc}w)NrQrightrSleftzborder-z-stylez-widthz-color)r(color) _border_stylercolor_to_excel)r-rsides r.rz CSSToExcelConverter.build_borders;   ++IIvV45IIvV45'' GD62H(IJ ,,UYYf7M-NO     sBBc,|||y||y|dvry|j|}|y|dvr|S|dk(ry|dk(r|dvryy|dk(r|dvryy ||jvr|j|Stjd t |t t y) Nnone)rhidden)Ngrooveridgeinsetoutsetsolidrrrp)rothinrqrlruzUnhandled border style format:  stacklevel)_get_width_nameBORDER_STYLE_MAPwarningswarnreprrr)r-r(widthr width_names r.rz!CSSToExcelConverter._border_styles =U]u} =U] & &))%0   I I  H  H --% H --! d++ +((/ / MM1$u+?+-  r0cJ|j|}|dkry|dkry|dkryy)Ngh㈵>g?rgffffff@mediumthick)_width_to_float)r- width_inputrs r.rz#CSSToExcelConverter._get_width_nameVs3$$[1 4< S[ S[r0c,|d}|j|S)N2pt) _pt_to_float)r-rs r.rz#CSSToExcelConverter._width_to_float`s =E  ''r0c\|jdsJt|jdS)Npt)endswithfloatrstrip)r- pt_strings r.rz CSSToExcelConverter._pt_to_floates,!!$'''Y%%d+,,r0cV|jd}|dvr|j|ddSy)Nzbackground-color)N transparentrr)fgColor patternType)rr)r-r fill_colors r.rzCSSToExcelConverter.build_fillis7YY12 : :#22:>wW W ;r0ct|jd}t|tr|jddn|}d|iS)Nz number-format§; format_code)rrstrreplace)r-rfcs r.rz'CSSToExcelConverter.build_number_formatps6 YY '&0S&9RZZc "rr""r0c V|j|}|j|}|r|dnd|j||j||j ||j |d|vrdndd|vxsd|j |jd|j|d S)Nr underlinesinglez line-throughr) namefamilysizerVrcrstrikershadow) _get_font_names_get_decoration_select_font_family_get_font_size _get_is_bold_get_is_italicrr _get_shadow)r-r font_names decorations r.rzCSSToExcelConverter.build_fontus))%0 ))%0 %/JqMT..z:''.%%e,))%0&1Z&?(T%3<((7);<&&u-  r0c`|jd}|r|jj|Sy)Nz font-weight)rBOLD_MAP)r-rweights r.rz CSSToExcelConverter._get_is_bolds+=) ==$$V, ,r0c`|jd}|r|jj|Sy)Nz font-style)r ITALIC_MAP)r-r font_styles r.rz"CSSToExcelConverter._get_is_italics+YY|, ??&&z2 2r0cJ|jd}||jSy)Nztext-decorationr:)rsplit)r-rrs r.rz#CSSToExcelConverter._get_decorations)YY01  !##% %r0cd|vryy)Nrrr:)r-rs r._get_underlinez"CSSToExcelConverter._get_underlines * $r0cPd|vr"ttjd|dSy)Nz text-shadowz ^[^#(]*[1-9])rresearchrs r.rzCSSToExcelConverter._get_shadows( E ! .% 2FGH Hr0c$tjd|jdd}g}|D]b}|dddk(r|ddjdd}n.|dddk(r|ddjd d}n|j }|sR|j |d|S) Nz(?x) ( "(?:[^"]|\\")+" | '(?:[^']|\\')+' | [^'",]+ )(?=,|\s*$) z font-familyre"z\"'z\')rfindallrrstripappend)r-rfont_names_tmprrs r.rz#CSSToExcelConverter._get_font_namess  IImR (   " (DBQx3Abz))%5bqSAbz))%5zz|!!$' (r0cN|jd}||S|j|S)Nz font-size)rr)r-rrs r.rz"CSSToExcelConverter._get_font_sizes+yy% <K  &&r0cXd}|D]"}|jj|}|s!|S|Sr,) FAMILY_MAPr)r-rrrs r.rz'CSSToExcelConverter._select_font_familys< D__((.F    r0c|y|j|r|j|S |j|S#t$r3t j dt |ttYywxYw)NzUnhandled color format: r) _is_hex_color_convert_hex_to_excel NAMED_COLORSKeyErrorrrrrrr-r's r.rz"CSSToExcelConverter.color_to_excelsv ;   c "--c2 2 $$S) )  MM*49+6+-    s69A21A2c6t|jdS)N#)r startswith)r- color_strings r.rz!CSSToExcelConverter._is_hex_colorsL++C011r0c|jd}|j|r(|ddz|ddzz|ddzzjS|jS)Nr rrfre)lstrip_is_shorthand_colorupperr-rcodes r.rz)CSSToExcelConverter._convert_hex_to_excels]""3'  # #L 1GaK$q'A+-Q! ;BBD D::< r0c||jd}t|dk(ryt|dk(rytd|)zcCheck if color code is shorthand. #FFF is a shorthand as opposed to full #FFFFFF. r TFzUnexpected color )rlen ValueErrorrs r.rz'CSSToExcelConverter._is_shorthand_colorsC ""3' t9> Y!^0?@ @r0r,)rv str | Noner3r4)r~z str | frozenset[tuple[str, str]]r3dict[str, dict[str, str]])rMapping[str, str]r3r)rrr3zdict[str, bool | str | None])rrr3r)rrr3z bool | None)rrr3z dict[str, dict[str, str | None]])r(rrrrr)rrr3r)rrr3r)rrr3r)rr)rrr3r)rrr3z$dict[str, bool | float | str | None])rrr3 Sequence[str])rrr3r)rrr3z float | None)rrr3r2)r'rr3r)rrr3r)rrr3r)*r5r6r7__doc__rr rrrrr?r__annotations__r/rrxrr{rrrrrrrrrrrrrrrrrrrrrrrr).0r(s00r.rPrPms"L LH"J J     u(%$A-K/</ "/*.<. ". 0  O  &  )  5n( -X#  & - $    4' "2  AA sCrPceZdZdZdZdZ d ddZeddZdZ ddZ dd Z dd Z dd Z dd Zdd ZeddZddZddZeed d ddZy)ExcelFormattera9 Class for formatting a DataFrame to a list of ExcelCells, Parameters ---------- df : DataFrame or Styler na_rep: na representation float_format : str, default None Format string for floating point numbers cols : sequence, optional Columns to write header : bool or sequence of str, default True Write out column names. If a list of string is given it is assumed to be aliases for the column names index : bool, default True output row names (index) index_label : str or sequence, default None Column label for index column(s) if desired. If None is given, and `header` and `index` are True, then the index names are used. A sequence should be given if the DataFrame uses MultiIndex. merge_cells : bool, default False Format MultiIndex and Hierarchical Rows as merged cells. inf_rep : str, default `'inf'` representation for np.inf values (which aren't representable in Excel) A `'-'` sign will be added in front of -inf. style_converter : callable, optional This translates Styler styles (CSS) into ExcelWriter styles. Defaults to ``CSSToExcelConverter()``. It should have signature css_declarations string -> excel style. This is only called for body cells. ii@Nc d|_||_t|tsA||_|jj |j }| t} | |_nd|_d|_||_ |tt|j|js tdtt|j|jtt|k7r td|j!||_ |jj|_ ||_||_||_||_||_| |_y)Nrz,passes columns are not ALL present dataframez.Not all names specified in 'columns' are found)columns) rowcounterna_reprrstyler_computedatarPstyle_converterdfrr intersectionr%r setreindex float_formatindex index_labelheader merge_cellsinf_rep) r-r,r'r0colsr3r1r2r4r5r+s r.r/zExcelFormatter.__init__s "i(DK KK "B&"5"74CD DK#'D   uT{// ;<MNN5;++BJJ78CD NJOPPjjj.DGww ( & & r0c"ddidddddddddS) NrVTrrrRrQ)rr)rbordersrr:r-s r. header_stylezExcelFormatter.header_styleGs0TN   )1eD  r0c|t|r"tj|r |j}nvt |rktj |r |j }nItj|rd|j }n$|jt|j|z}t|dd td|S)N-tzinfoz{Excel does not support datetimes with timezones. Please ensure that datetimes are timezone unaware before writing to Excel.) rrisnar'risposinf_scalarr5isneginf_scalarr0rgetattrrr s r. _format_valuezExcelFormatter._format_valueTs S>gll3/++C c]&&s+ll((-$,,("".D--34 3$ ' 3@   r0c#K|jjdkDr|js td|js |j sy|j}|j |jd}t|}d}d}|jrIt|jjtr%t|jjddz }|jrt|jD] \}}t||||j "tt#||j$|j&D]\}\}}} |j)| } |j+D]b\} } d\} }| dkDr ||| z| z}} t-||| zdz| | |j t/|j0dd|| |j2| | d||_ytt#|D]h\} } d j5t7t8| }t-||| zdz||j t/|j0dd|| |j2 j||_yw) Nrez]Writing to Excel with MultiIndex columns and no index ('index'=False) is not yet implemented.Fsparsify include_namesrr>NN ctx_columns r%r&r'r(rCrDrErFr)r*.r%r&r'r(rCrDrErF)r%nlevelsr1NotImplementedError _has_aliasesr3 _format_multir4rrr,rr enumeratenamesr#r:ziplevelscodestakerAr<rAr(r+joinmaprr&)r-r% level_strs level_lengths coloffsetlnumrspansrS level_codesvaluesispan_valr)r*rs r._format_header_miz ExcelFormatter._format_header_mifs_ <<  ! #::)D !!T[[ ,,**%%U+ **5   ::*TWW]]J?DGGMM!,-1I   ' 6  d!++  7@M7>>7==A7 22ufk [1#(;;=KAx+5(J!|/3Y]X5MH & %MA-"1I"//#*4;; t#L $ !&*&:&:#-!)     F'sJ'78  6HHSv67"!A )++&t{{M4H "&"6"6   sI#I%c #K|js |jrbd}|jrOd}t|jjt r)t |jjj}|j}|jrtt|j|_t |jt |jk7r8tdt |jdt |jd|j}t|D]P\}}t|j||z||jt!|j"ddd||j$Ryyw)NrrezWriting z cols but got z aliasesrHrK)rNr3r1rr,rrrQr%r rrrPr<r&r:rAr(r+)r-rZcolnamescolindexcolnames r._format_header_regularz%ExcelFormatter._format_header_regulars7    Izz dggmmZ8 #DGGMM$7$7 8I||H  "8T[[9 t{{#s4<<'88$"3t||#4"56##&t{{#3"4H> ;;%.x%8 !'" 9,++&t{{M4H$"&"6"6   %!,sE=E?ctjtrj}nj }d}j j jrj j jDcgc]}||nd c}dgtjzz}tjdd|Dr)fdt|D}xjdz c_ tj||Scc}w)Nr:rc|xr|Sr,r:)xys r.z/ExcelFormatter._format_header..s QW1r0c3&K|] }|dk7 yw)rNr:)r!ris r. z0ExcelFormatter._format_header..s6L1qBw6Lsc3hK|])\}}tj||j+ywr,)r#r&r:)r!rdr'r-s r.rmz0ExcelFormatter._format_header..s2%#dooxd>O>OPs/2re)rr%rrarfr,r1rQrryreducerPr& itertoolschain)r-gengen2rir%s` r._format_headerzExcelFormatter._format_headers dllJ /((*C--/C$& 77==  7;ww}}7J7JK! 12-KODLL!O""C 46L6LM)231$sD))Ls Dct|jjtr|j S|j Sr,)rr,r1r_format_hierarchical_rows_format_regular_rowsr9s r. _format_bodyzExcelFormatter._format_bodys2 dggmmZ 0113 3,,. .r0c #PK|js |jr|xjdz c_|jr|jrDt |jt ttjtfr|jd}nV|jr't |jtr |j}n#|jjjd}t |jtr|xjdz c_|r5|jdur't!|jdz d||j"|jj}t |jjt$r$|jjj'}t)|D]P\}}t+|j|zd||j"t-|j.dd|d|j0Rd}nd}|j3|Ed{y7w)NrerF ctx_indexrK)rNr3r&r1r2rrtuplenpndarrayrrr,rQr%rr#r:r to_timestamprPr<rAr(r+_generate_body)r-r2 index_valuesidxidxvalrZs r.rwz#ExcelFormatter._format_regular_rowss    OOq O ::J  4 E"B%#..q1 !!j1A1A3&G".. "ggmm11!4 $,, 31$t{{%7! 3Q TEVEVWW 77==L$''--5#ww}}99; (6  V"#-++&t{{KF"&"6"6   II&&y111sHH&H$H&c#TK|js |jr|xjdz c_d}|jr|jjj }|j r@t|j tttjtfr |j }t|jtr!|jr|xjdz c_t!j"|rH|jdur:t%|D],\}}t'|jdz |||j(.|jr;|jjj+dd}t-|}t/||jjj0|jjj2D]\}}} |j5| |j6|j8} |j;D]v\} } d\} }| dkDr|j| z| zdz } |}t=|j| z|| | |j(t?|j@dd| ||jB| | x|dz }nt/|jjD]e}t%|D]P\}}t=|j|z|||j(t?|j@dd|||jB R|dz }g|jE|Ed{y7w) NrerFTrD) allow_fill fill_valuerGrzrIrK)#rNr3r&r1r,rQr2rrr{r|r}rr%rr4com any_not_nonerPr#r:rOrrRrSrTrU _can_hold_na _na_valuerAr<rAr(r+r)r-gcolidx index_labelscidxrrXrYr\rSr]r^r_r`r)r* indexcolvalsr indexcolvals r.rvz(ExcelFormatter._format_hierarchical_rowss    OOq O ::77==..LJ  4 E"B% $// $,, 38H8H1$.4;;e3K"+L"9XJD$#DOOa$7tTEVEVWWX!WW]]88!9 !2* = 25!477==#7#79L9L3!.E6;$[[##)#6#6#)#3#3)F (-{{} 8/9, H#a<)-1)*>'1%-   "qLG5!<%($7 !L,5l,C ([* $# 5 ' +"&"3"3'.t{{K'N$'$+*.*>*>   qLG !&&w///sLL( L&!L(c,t|jS)z1Whether the aliases for column names are present.)r r3r9s r.rNzExcelFormatter._has_aliasescsDKK((r0c #:Ktt|jD]v}|jjdd|f}t |D]I\}}t |j|z||z|dt|jdd|||jKxyw)NctxrK) rangerr%r,ilocrPr<r&rAr(r+)r-rZcolidxseriesr_r's r.rzExcelFormatter._generate_bodyhsC -. FWW\\!V),F#F+ 3"!+*&t{{E4@""&"6"6    sBBc#Ktj|j|jD]&}|j |j |_|(ywr,)rprqrtrxrBr')r-cells r.get_formatted_cellsz"ExcelFormatter.get_formatted_cellsxsMOOD$7$7$94;L;L;NO D))$((3DHJ sAAstorage_options)rc ddlm} |jj\} } | |jkDs| |j kDr+t d| d| d|jd|j |i}|j} t|| rd} n| ||||}d } |j| |||| | r|jyy#| r|jwwxYw) ab writer : path-like, file-like, or ExcelWriter object File path or existing ExcelWriter sheet_name : str, default 'Sheet1' Name of sheet which will contain DataFrame startrow : upper left cell row to dump data frame startcol : upper left cell column to dump data frame freeze_panes : tuple of integer (length 2), default None Specifies the one-based bottommost row and rightmost column that is to be frozen engine : string, default None write engine to use if writer is a path - you can also set this via the options ``io.excel.xlsx.writer``, or ``io.excel.xlsm.writer``. {storage_options} engine_kwargs: dict, optional Arbitrary keyword arguments passed to excel engine. rr z-This sheet is too large! Your sheet size is: z, z Max sheet size is: NF)enginer engine_kwargsT)startrowstartcol freeze_panes) pandas.io.excelr!r,shapemax_rowsmax_colsrrr _write_cellsclose)r-writer sheet_namerrrrrrr!num_rowsnum_colsformatted_cells need_saves r.writezExcelFormatter.write}sD 0!WW]]( dmm #x$--'??zH:V&&*mm_Bt}}oG   M224 fk *I  /+ F I    !!)   y s CC) rNNTTNFinfN)r'rr0rr6zSequence[Hashable] | Noner3zSequence[Hashable] | boolr1rr2zIndexLabel | Noner4rr5rr+rMr3r4)r3z dict[str, dict[str, str | bool]])r3Iterable[ExcelCell])r3r)rZr1r3r)Sheet1rrNNNN)rz)FilePath | WriteExcelBuffer | ExcelWriterrrrr1rr1rztuple[int, int] | NonerrrzStorageOptions | NonerrLr3r4)r5r6r7rrrr/propertyr:rBrarfrtrxrwrvrNrrr rrr:r0r.r#r#s@HH #'*.,0)-!+/++! + ( + * ++'+++)+ +Z    $CJ>*,/ ,2\M0^))   &789#/3!15%)D9DD D  D - DD/D#D D:Dr0r#)rs#   )'4&  ! 0573#!!*K9K2FAFAR LLr0