U
    ?vfb                     @  sV   d dl mZ d dlmZ d dlZd dlZG dd dZdddd	Z	e
d
krRe	  dS )    )annotations)IterableNc                   @  sz   e Zd ZdZd#ddddddd	Zd
ddddZddddZd$dddddZdd Zdd Z	d%dddd d!d"Z
dS )&TablePlotterzg
    Layout some DataFrames in vertical/horizontal layout for explanation.
    Used in merging.rst
    Gz?      ?      @floatNone)
cell_widthcell_height	font_sizereturnc                 C  s   || _ || _|| _d S )N)r
   r   r   )selfr
   r   r    r   9/tmp/pip-unpacked-wheel-vdrwu74i/pandas/util/_doctools.py__init__   s    zTablePlotter.__init__zpd.DataFrameztuple[int, int])dfr   c                 C  s"   |j \}}||jj ||jj fS )zA
        Calculate table shape considering index levels.
        )shapecolumnsnlevelsindex)r   r   rowcolr   r   r   _shape   s    
zTablePlotter._shaper   c                   s   |rPt t fdd|D  |d }t  fdd|D  |d  }nLt  fdd|D  |d g }t fdd|D  |d g }||fS )	zQ
        Calculate appropriate figure size based on left and right data.
        c                 3  s   | ]}  |d  V  qdS r   Nr   .0r   r   r   r   	<genexpr>'   s     z*TablePlotter._get_cells.<locals>.<genexpr>r   c                 3  s   | ]}  |d  V  qdS    Nr   r   r   r   r   r    (   s     r"   c                   s   g | ]}  |d  qS )r   r   r   r   r   r   
<listcomp>*   s     z+TablePlotter._get_cells.<locals>.<listcomp>c                   s   g | ]}  |d  qS )r"   r   r   r   r   r   r#   +   s     )maxsumr   )r   leftrightverticalvcellshcellsr   r   r   
_get_cells!   s    &&&&zTablePlotter._get_cellsr   TzIterable[str]boollabelsr(   c              	     s2  ddl m} ddlm} t|ts(|g} fdd|D } |} |||\}}|rp j|  j	| f}	n j|  j	| f}	|j
|	d}
|r^|t||}t fdd|D }t fd	d|D }tt||D ]8\}\}}|
||d|f } j|||d
| d q||dd|df } j||dd| d |
jddddd nt fdd||g D }d
t| }|d|}d}t||D ]P\}} |}|
|d|||d  f } j||||d ||d 7 }q||d|df } j||d|d |
jddddd |
S )a  
        Plot left / right DataFrames in specified layout.

        Parameters
        ----------
        left : list of DataFrames before operation is applied
        right : DataFrame of operation result
        labels : list of str to be drawn as titles of left DataFrames
        vertical : bool, default True
            If True, use vertical layout. If False, use horizontal layout.
        r   )gridspecNc                   s   g | ]}  |qS r   )_convr   r   r   r   r#   ?   s     z%TablePlotter.plot.<locals>.<listcomp>)figsizec                 3  s   | ]}  |d  V  qdS r!   r   r   r   r   r   r    N   s     z$TablePlotter.plot.<locals>.<genexpr>c                 3  s   | ]}  |d  V  qdS r   r   r   r   r   r   r    O   s           ?)titleheightZResultg?g?g?gffffff?)topZbottomr&   r'   c                 3  s   | ]}  |d  V  qdS r   r   r   r   r   r   r    X   s     r"   g333333?)Z
matplotlibr/   matplotlib.pyplotpyplot
isinstancelistr0   r+   r
   r   figureZGridSpeclenr$   	enumeratezipZadd_subplot_make_tableZsubplotZsubplots_adjustnpr   )r   r&   r'   r.   r(   r/   pltr*   r)   r1   ZfigZgsZmax_left_colsZmax_left_rowsi_leftZ_labelaxZmax_rowsr4   r   spr   r   r   plot.   sD    


zTablePlotter.plotc                 C  s:   t |tjr,|jdkr$|jdd}n| }|d}|S )zF
        Convert each input to appropriate for table outplot.
        N )nameNaN)r8   pdZSeriesrG   Zto_frameZfillna)r   datar   r   r   r0   i   s    

zTablePlotter._convc                   s        jj}|dkr* dd j n*t|D ] } |d|  j| q2 jj}|dkr jd} fddtd|D }t|}|j _t	| g | _ S )Nr"   r   ZIndexc                   s   g | ]} j |jqS r   )r   _get_level_valuesZ_values)r   rA   rJ   r   r   r#      s    z.TablePlotter._insert_index.<locals>.<listcomp>)
copyr   r   insertrangerK   r   rI   	DataFrameconcat)r   rJ   idx_nlevelsrA   col_nlevelsr   valuesZcol_dfr   rL   r   _insert_indexu   s"    

zTablePlotter._insert_indexNstrzfloat | None)r3   r4   r   c                 C  s  |d kr| d d S ddlm} |jj}|jj}| |}|j||dd}|| j	 |d krpdt
|d  }| }	|	d  D ]`\\}
}}|d	kr| d n6|
|k r||k r| d n|
|k s||k r|d
 || q|j|| j	d |d d S )NFr   )plotting	   )locr2   r"   Zcelldz#AAAAAA)sizeoff)Zset_visiblepandasrW   r   r   r   rU   tableZset_fontsizer   r;   Z
propertiesitemsZset_facecolorZ
set_height	set_titleaxis)r   rC   r   r3   r4   rW   rR   rS   tbpropsrccellr   r   r   r>      s,    


zTablePlotter._make_table)r   r   r   )r   T)N)__name__
__module____qualname____doc__r   r   r+   rE   r0   rU   r>   r   r   r   r   r   
   s      
;r   r	   r   c                  C  s:  dd l m}  t }tdddgdddgdd	d
gd}tddgdd
gd}|j||gt||gddgdd |   tddgdd
gd}|j||gtj||gddddgdd |   tj	ddddddg}tj	ddg}tjddddddgddd d!d"dgd#|d$}||_
|j||d%gd& |   d S )'Nr   
                            )ABC)rt   rv   df1df2Tr-   )XZr"   )ra   F)r"   rt   )r"   ru   )r"   rv   )   rt   )r{   ru   )r{   rv   r{                     rX   )Zv1Zv2)r   df3)r.   )r6   r7   r   rI   rP   rE   rQ   showZ
MultiIndexfrom_tuplesr   )r@   prw   rx   r   idxcolumnr   r   r   main   s,    $$   ,r   __main__)
__future__r   typingr   Znumpyr?   r]   rI   r   r   rg   r   r   r   r   <module>   s    !