a
    7&blk                    @   s  d dl mZ d dlmZ d dlmZmZ ddl	m
Z
mZ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Zd dlZd dlZd dlmZmZm Z  d	Z!e"eeeeed
Zg dg d g d g d Z#g dZ$g dZ%g dZ&e#e$ e% e& Z'ej(ej)ej*ej+ej,ej-gZ.e.ej/ej0ej1g7 Z.G dd de2Z3e3 Z4[3da5dd Z6dd Z7edg dZ8edg dZ9dd Z:dd Z;d d! Z<d"d# Z=d$d% Z>d&d' Z?d(d) Z@d*d+ ZAd,d- ZBd.d/ ZCd0d1 ZDd2d3 ZEd4d5 ZFd6d7 ZGd8d9 ZHd:d; ZId<d= ZJd>d? ZKd@dA ZLdBdC ZMdDdE ZNdFdG ZOdHdI ZPdJdK ZQdLdM ZRdNdO ZSdPdQ ZTdRdS ZUdTdU ZVdVdW ZWdXdY ZXdZd[ ZYd\d] ZZdbd^d_Z[d`da Z\dS )c    N)
namedtupleOrderedDict   )IdentityMapConstantRange)olslowessrolling	expandingewm)ColorscaleValidator)qualitative
sequential)make_subplots_set_trace_grid_reference_subplot_type_for_trace_typeZpx_no_color_constant)r	   r
   r   r   r   )basexyzabcrthetasizex_startx_end)
hover_nametextnamesvaluesparents
wide_cross)idsZerror_xZerror_x_minusZerror_yZerror_y_minusZerror_z)Zerror_z_minuslatlon	locationsanimation_group)
dimensionscustom_data
hover_datapathwide_variable)animation_frame	facet_row	facet_col
line_group)colorsymbol	line_dashpattern_shapec                   @   s$   e Zd Zg dZdd Zdd ZdS )
PxDefaultstemplatewidthheightcolor_discrete_sequencecolor_discrete_mapcolor_continuous_scalesymbol_sequenceZ
symbol_mapline_dash_sequenceZline_dash_mappattern_shape_sequenceZpattern_shape_mapsize_maxcategory_orderslabelsc                 C   s   |    d S N)resetself rI   3lib/python3.9/site-packages/plotly/express/_core.py__init__B   s    zPxDefaults.__init__c                 C   s^   d | _ d | _d | _d | _i | _d | _d | _i | _d | _i | _	d | _
i | _d| _i | _i | _d S )N   r8   rG   rI   rI   rJ   rF   E   s    zPxDefaults.resetN)__name__
__module____qualname__	__slots__rK   rF   rI   rI   rI   rJ   r7   /   s   r7   c                 C   s   | a dS )z
    Arguments:
        token: A Mapbox token to be used in `plotly.express.scatter_mapbox` and         `plotly.express.line_mapbox` figures. See         https://docs.mapbox.com/help/how-mapbox-works/access-tokens/ for more details
    N)MAPBOX_TOKEN)tokenrI   rI   rJ   set_mapbox_access_token^   s    rS   c                 C   s   | j S )a  
    Extracts fit statistics for trendlines (when applied to figures generated with
    the `trendline` argument set to `"ols"`).

    Arguments:
        fig: the output of a `plotly.express` charting call
    Returns:
        A `pandas.DataFrame` with a column "px_fit_results" containing the `statsmodels`
        results objects, along with columns identifying the subset of the data the
        trendline was fit on.
    )_px_trendlines)figrI   rI   rJ   get_trendline_resultsi   s    rV   Mapping)show_in_trace_namegrouperval_mapsequenceupdatervariablefacet	TraceSpecconstructorattrstrace_patchmarginalc                 C   s*   z| d | W S  t y$   | Y S 0 d S )NrD   )	Exception)argscolumnrI   rI   rJ   	get_label   s    rh   c                 C   s<   dd | d   D }z
|| W S  ty6   | Y S 0 dS )zInvert mapping.
    Find key corresponding to value column in dict args["labels"].
    Returns `column` if the value does not exist.
    c                 S   s   i | ]\}}||qS rI   rI   ).0keyvaluerI   rI   rJ   
<dictcomp>       z invert_label.<locals>.<dictcomp>rD   N)itemsre   )rf   rg   Zreversed_labelsrI   rI   rJ   invert_label   s
    
ro   c                 C   s   | | j jdv S )NZifc)dtypekind)dfcol_namerI   rI   rJ   _is_continuous   s    rt   c                 C   s`  t | | }}d| v r\|dks^|dkr<d| v r<| d dks^|dkr\d| v r\| d dkr\| d phd}|dkrd	||f }nd}d
| v r4| d
 d ur4|dkr| d
 }n| d
 }|dkr|dkrd	d|f }n"|dkrd	||f }nd||f }n<|dkrdd|f }n$|dkr(dd|f }nd	||f }d| v r\| d d ur\d|| d f }|S )Nhistfuncr   r   orientationhr   vcountz%s of %shistnormsumprobabilityZfractionpercentz%s weighted by %sz%s of sum of %sZbarnormz%s (normalized as %s))rh   )rf   rg   ZroleZoriginal_labellabelru   rz   rI   rI   rJ   get_decorated_label   sL    





r   c              	      s$  dksdkr0t d|  i dgdd d dS dks@d	krd	krLd
nd}t d||  i dd tddD dd dkrdnddS d^ }}dkrd}dkrd}d}dkrd}d}| |d  dkrt }n| |d   }t d| | || |d   fddd dS ) Nr2   r/   F c                 S   s   |S rE   rI   tracerx   rI   rI   rJ   <lambda>   rm   zmake_mapping.<locals>.<lambda>)rX   rY   rZ   r[   r]   r\   r^   r0   r1   r   r   c                 S   s   g | ]}|qS rI   rI   ri   irI   rI   rJ   
<listcomp>   rm   z make_mapping.<locals>.<listcomp>r     c                 S   s   |S rE   rI   r   rI   rI   rJ   r      rm   rowcol)rX   r]   rY   rZ   r[   r\   r^   .r3   Zcolor_discretedashr5   patternr6   _mapidentityTZ	_sequencec                    s   |  dg  |iiS )Nr   )updatejoinr   Zother_variablesparentr]   rI   rJ   r      s   )rW   rangesplitr   copy)rf   r]   letterZvprefixarg_namerZ   rI   r   rJ   make_mapping   sX    		
r   c           $         s  d v r  d r | |jd }j p,i }d}d}jD ]} | t |}	|dkrȇ fdd| D }
 fdd|
D |d< jtj	kr|d D ]}t
d	d
|d< qd|d< d|d< q<dur|dkr"d|vrt
 |d< | |d d< d|d d< ||d d< d||	< q|dkrFjtjkrd|d< q|dkrjjtjkrd|d< q|dkr0 d r d rt| d  d g  dkr|j d d}| d  j}| d  j}|jjtjkr|td }nF|jjtjkr<z|tj}W n$ ty:   td d  Y n0 |jjtjkrzz|tj}W n tyx   td Y n0 ttt|t|}| d  | |d< t }| d! | d  || d  d |\}}}t|t|d ks J d"||d< d|t  d < d#|t  d < q|d$r|dd% }|d&rXd'nd(}||vrni ||< | || |< q|d)krtdkr| |d*< q|d+krjtjtj tj!fvr| |d,< |dkrd-}q|d.krjtjtj tj!fvrt"t
} #d)p$g }D ]}|rB| sBq*| #d #d #d/ #d0fv rpq*z d) $|}W n, tt%t&fy   t|}| | Y n0 t |d}d1| ||< q*t|dkr|| |d*< q|d2krnjtj'tj(fv r(| |d/< d3|d4< d5||	< qjtj)tj*tj+tj,tj-fv rd|vr\t
 |d<  #d6r| |d d7< d3|d d4< d8||	< ng |d d7<  d9 dur d9  }ni }| D ]L}|#|du r d: t|t d:   ||< |d d7  ||  qnXd}jtj.tj/fv r.d;}||vrBt
 ||< | || d2< d3|| d4< d<| ||	< q|d=kr| |d>< q|d?kr| ||< d@||	< q|dAkr| ||< |	dAkrdBn|	}dC||< n|dDkr| ||< |	dDkr dEn|	}dF||< n|d>kr@| ||< |	d>kr2dGn|	}dH||< nx|dIkrjtj)tj*tj+tj,tj-fv r| |dJ< |	dIkrdKn|	}dL||< n| ||< n| ||< dM| ||	< q<jtjkr|dNv sjtj tj!fv r<|d/kr<dM| ||	< q<jtj/tj.fvrt0|} d. rt" d. t
r|1 D ]d\}}t2 |} |  d. v r8 d. |  d }!|!rt"|!t3r|4dOdP|! ||< n
|5|}"q8dQd |1 D }#|dR6|# |dS< |dS  dT7  < ||fS )Ua:  Populates a dict with arguments to update trace

    Parameters
    ----------
    args : dict
        args to be used for the trace
    trace_spec : NamedTuple
        which kind of trace to be used (has constructor, marginal etc.
        attributes)
    trace_data : pandas DataFrame
        data
    mapping_labels : dict
        to be used for hovertemplate
    sizeref : float
        marker sizeref

    Returns
    -------
    trace_patch : dict
        dict to be used to update trace
    fit_results : dict
        fit information to be used for trendlines
    Z
line_closer   Nr   r*   c                    sv   g | ]n\}}r|v rj tjks2t d  |rj tjksjdurN|v sjt d  |   d kr||fqS )
data_frameNZdimensions_max_cardinality)ra   go	Parcoordsrt   Parcatslenuniqueri   namerg   rf   Z
attr_value
trace_specrI   rJ   r     s   z%make_trace_kwargs.<locals>.<listcomp>c                    s"   g | ]\}}t t ||d qS ))r~   r"   )dictrh   r   rf   rI   rJ   r   &  s   T)matchesaxisz%{x}z%{xaxis.title.text}z%{y}z%{yaxis.title.text}r   markerZareaZsizemodesizerefz%{marker.size}
marginal_xry   
marginal_y	trendliner   r   r   byi ʚ;zCould not convert value of 'x' ('%s') into a numeric type. If 'x' contains stringified dates, please convert to a datetime column.z3Could not convert value of 'y' into a numeric type.trendline_optionsz/missing-data-handling failure in trendline codez%{y} <b>(trend)</b>error   ZminusZ
arrayminusarrayr+   Z
customdatar   Z	hovertextz<b>%{hovertext}</b><br><br>r,   r   r   z%%{customdata[%d]}r3   
coloraxis1	coloraxisz%{z}color_is_continuousZcolorsz%{color}r=   r<   linez%%{%s.color}r)   r%   r(   z%{location}r"   rk   z%{value}r#   r   z	%{parent}idz%{id}r!   rD   r~   z%{label}z%%{%s}r   r   }z%s}c                 S   s   g | ]\}}|d  | qS )=rI   )ri   krx   rI   rI   rJ   r     rm   z<br>Zhovertemplatez<extra></extra>)7appendilocrc   r   rb   r   Z	iteritemsra   r   Splomr   	Histogramr   Zdropnasort_valuesr"   rp   typenpZ
datetime64astypeintZobject_Zfloat64
ValueErrorZlogical_notZ
logical_orZisnantrendline_functionsrh   
startswithendswithHistogram2dHistogram2dContour
isinstancegetindexAttributeErrorKeyError
ChoroplethChoroplethmapboxSunburstTreemapIciclePie
Funnelarear   r   r   rn   ro   strreplacepopr   )$rf   r   Z
trace_datamapping_labelsr   rc   fit_resultsZhover_headerZ	attr_nameZ
attr_labelZdimsdZsorted_trace_datar   r   Znon_missingZtrendline_functionZy_outZerror_xyZarrZhover_is_dictZcustomdata_colsr   positionZattr_label_colmappingcatZ	colorableZ_labelZmapping_labels_copyr   rx   Zk_args	formatter_Zhover_linesrI   r   rJ   make_trace_kwargs   s   












	























r   c                 C   sn   t jtt jtt jtt jtt jtt j	t
t jt
t jt
t jtt jti
}tD ]}t||< qD||v rj|| | || d S rE   )r   Z	Scatter3dconfigure_3d_axesZScatterternaryconfigure_ternary_axesScatterpolarconfigure_polar_axesScatterpolarglZBarpolarScattermapboxconfigure_mapboxr   DensitymapboxZ
Scattergeoconfigure_geor   
cartesiansconfigure_cartesian_axes)rf   ra   rU   ordersZconfiguratorsr   rI   rI   rJ   configure_axes  s    
r   c                 C   s   d| }d| }|| v rP| | rPd|d< || v rl| | rldd | | D |d< n|| v rl| | rl| | |d< | | |v rd|d	< t |tjjr|| |  ntt|| |  |d
< d S )Nlog_range_logr   c                 S   s   g | ]}t |d qS 
   mathr   )ri   r   rI   rI   rJ   r   &  rm   z+set_cartesian_axis_opts.<locals>.<listcomp>r   r   categoryordercategoryarray)r   r   layoutZXAxislistreversed)rf   r   r   r   Zlog_keyZ	range_keyrI   rI   rJ   set_cartesian_axis_opts   s    r   c                 C   s  d| d | d fv rd|j d< t|j}t|jd }|jddD ]}t| |d	| qB|jdd
D ]}t| |d| qb| d r|jdddd |d | d j jjd u r|j| d dk|d | d j j	jd u r|j
d|d | d rD|j
dddd |d | d j j	jd u r"|j
| d dk|d | d j jjd u rD|jd|d t| | d	 d	}| d rp|j|ddd n&td|d D ]}|j||dd q~t| | d d}	| d r|j
|	ddd n&td|d D ]}
|j
|	d|
d qd| v r| d r|j
dd d| v r(| d r(|jdd d	t|d  }| d rjtd|d dD ]}|j|d |d qR| d rtd|d dD ]}
|j
dd |
d qd S )N	histogramr   r   overlaybarmoder   r   r   r   r   r   Fr   )showticklabelsshowlineticksr   r   r9   )showgridr   T)r  r  r  r   r   )r  r   )
title_textr   r   log_xr   r   log_y   )r   r   r   x2)r   r   r   )r   r   	_grid_refselect_yaxesr   select_xaxesupdate_yaxesyaxisr  xaxisupdate_xaxesr   r   r   )rf   rU   r   nrowsncolsr  r  y_titler   x_titler   Z	matches_yrI   rI   rJ   !configure_cartesian_marginal_axes3  sZ    








r  c                 C   s2  d| v r| d s d| v r0| d r0t | || d S t| | d d}|jddD ]}|j|d t| |d| qLt| | d d}|jddD ]&}d	| vr|j|d t| |d| qd
| v r| d
 r|jdd d| v r| d r|jdd d	| v r|jdd d| v r.| d dkr"|jdd n|jdd d S )Nr   r   r   r   r   r  r   r   is_timeliner  r   r  r  dateecdfmoderv   rx   Ztozero)Z	rangemode)r  r   r  r   r   r  r  r  )rf   rU   r   r  r  r  r  rI   rI   rJ   r   x  s4    
r   c                 C   sD   |j tt| | d dtt| | d dtt| | d dd d S )Nr   r  r   r   )ZaaxisZbaxisZcaxis)Zupdate_ternariesr   rh   rf   rU   r   rI   rI   rJ   r     s
    r   c                 C   s   t t | d | d dt  d}dD ]4\}}| | |v r"d|| d< || |  || d< q"|d	 }| d
 rd|d< | d rdd | d D |d< n| d r| d |d< | d r| d |d< || d S )N	directionZstart_angle)r  Zrotation)angularaxis
radialaxis))r   r  )r   r  r   r   r   r  Zlog_rr   r   Zrange_rc                 S   s   g | ]}t |d qS r   r   ri   r   rI   rI   rJ   r     rm   z(configure_polar_axes.<locals>.<listcomp>r   Zrange_thetaZsector)r   Zupdate_polars)rf   rU   r   patchvarr   r  rI   rI   rJ   r     s$    r   c                 C   s   t t t| | d dt t| | d dt t| | d dd}dD ]}||d  }| d|  rd	|d
< | d|  rdd | d|  D |d< n| d|  r| d|  |d< | | |v rBd|d< || |  |d< qB|| d S )Nr   r  r   r   )r  r  Zzaxis)r   r   r   r   r   r   r   r   c                 S   s   g | ]}t |d qS r   r   r  rI   rI   rJ   r     rm   z%configure_3d_axes.<locals>.<listcomp>r   r   r   r   )r   rh   Zupdate_scenes)rf   rU   r   r   r   r   rI   rI   rJ   r     s"    r   c                 C   sf   | d }|sHd| v rHd| v rHt | d | d   | d | d   d}|jt|| d | d d d S )	Ncenterr&   r'   r   )r&   r'   zoomZmapbox_style)Zaccesstokenr"  r#  Zstyle)r   ZmeanZupdate_mapboxesrQ   )rf   rU   r   r"  rI   rI   rJ   r     s    r   c                 C   s2   |j | d | d | d | d t| d dd d S )Nr"  scope	fitboundsZbasemap_visible
projectionr  )r"  r$  r%  Zvisibler&  )Zupdate_geosr   r  rI   rI   rJ   r     s    r   c                    s    fddd| v r| d rt |jdkrd dgdddd gd	gd
ddgddddddddd	dd	g|j_d	dddt| | d d idddddd	fdd|jD d	g|j_d S )Nc                    s    |  t jkddd| dddS )N)durationZredrawZ	immediateTZlinear)r'  Zeasing)framemodeZfromcurrentZ
transition)r   Scatter)r'  )ra   rI   rJ   
frame_args  s
    z0configure_animation_controls.<locals>.frame_argsr/   r   i  z&#9654;animaterf   r~   methodr   z&#9724;leftr   F   )r   tFbuttonsg?righttop)	r2  r  padZ
showactiver   r   xanchorr   yanchorprefixr   <   )r   r1  g?c                    s&   g | ]}|j g d g|j ddqS )r   r,  r-  r   ri   f)r+  rI   rJ   r     s
   z0configure_animation_controls.<locals>.<listcomp>)	Zactiver7  r6  Zcurrentvaluer5  r   r   r   Zsteps)r   framesr   Zupdatemenusrh   Zsliders)rf   ra   rU   rI   )ra   r+  rJ   configure_animation_controls  sF    

r>  c           
      C   sB  |t jt jfv rrd| v rr| d dksL| d dkrrt| d dkrr| d d u rr|t jkrlt j}d|v rr|d= nt j}t|||d g}dD ]}d	| | v r| d	|  rd }t|d
krdnd|dkrdndd}| d	|  dkr
tt j|d	| gtf d|d||d}n| d	|  dkr<tt j	|ddgt|d|d}n| d	|  dkrntt j
|ddgtdd|d}nP| d	|  dkrddd}tt j
|ddgtdd did!d"d#d$|| id%|d}d |v sd | vrd&|jvrt |jd&< | d' d" }	|	|jd& d < || q| d(r>| d)d*d*kr>|t| | |S )+NZrender_modeZwebglautor   r   r/   rv   r   Z	marginal_r   Zx1r
  r   Zy1Zy2)r  r  r         ?)opacitybingroupr`   Zviolinr   r,   )Z
scalegroupZboxT)ZnotchedZrugzline-ns-openzline-ew-openzrgba(255,255,255,0)r3   allr   Zpointsr4   )Z	fillcolorr   Z	boxpointsZjitterZhoveronr   r   r>   r   trendline_scoper   )r   r*  r   r   	Scatterglr   r_   r   r   ViolinBoxrc   r   r   make_trendline_spec)
rf   ra   rb   rc   resultr   r   Zaxis_mapZsymbolsZfirst_default_colorrI   rI   rJ   make_trace_spec(  s    







rJ  c                 C   sJ   t |tjkrtjntjdgtddd d}| d rFt| d d|jd< |S )Nr   lines)r)  r`   Ztrendline_color_overrider3   r   )r_   r   rE  r*  r   rc   )rf   ra   r   rI   rI   rJ   rH  t  s    rH  c                 C   s   dS Nr   rI   r   rI   rI   rJ   	one_group  s    rO  c                 C   sl  t jD ]&}|| v r| | d u rtt || |< q| d d u r\tjjd urTtjj| d< nd| d< ztj| d  | d< W n& ty   tj	| d | d< Y n0 d| v r| d d u r| d jj
jrdd | d jj
jD | d< | d d u rtj| d< d| v r<| d d u r$| d jjr$| d jj| d< | d d u r<tj| d< d| v r| d d u r|| d jjr|dd | d jjD | d< | d rt| d sg d	| d< d
| v r| d
 d u r| d jjrdd | d jjD | d
< | d
 rt| d
 sg d| d
< d| v rh| d d u rD| d jjrDdd | d jjD | d< | d r\t| d shg d| d< d S )Nr9   Zplotlyr>   c                 S   s   g | ]}|d  qS )r   rI   r  rI   rI   rJ   r     s   z)apply_default_cascade.<locals>.<listcomp>r<   r?   c                 S   s   g | ]}|j jqS rI   )r   r4   ri   scatterrI   rI   rJ   r     s   )ZcircleZdiamondZsquarer   Zcrossr@   c                 S   s   g | ]}|j jqS rI   )r   r   rP  rI   rI   rJ   r     s   )Zsoliddotr   ZlongdashZdashdotZlongdashdotrA   c                 S   s   g | ]}|j jjqS rI   )r   r   shape)ri   barrI   rI   rJ   r     s   )r   /\r   +r   )defaultsrP   getattrpioZ	templatesdefaultre   r   r   ZTemplate
colorscaler   ZViridisZcolorwayr   ZD3datarQ  anyrT  )rf   ZparamrI   rI   rJ   apply_default_cascade  sb    











	


r_  c                 C   s    | |vr| S t d| | f d S )NzaA name conflict was encountered for argument '%s'. A column or index with name '%s' is ambiguous.)	NameError)
field_namereserved_namesrI   rI   rJ   _check_name_not_reserved  s    rc  c                 C   s   | d }t  }| D ]}|tvr q|tv r0| | n| | g}|du rDq|D ]}|du rXqHqHt|trn|| qHt|tjr|j}|rt	||r||| u }|r|| qH||j
u rH|jdurH||j qHq|S )z
    This function builds a list of columns of the data_frame argument used
    as arguments, either as str/int arguments or given as columns
    (pandas series type).
    r   N)setall_attrablesarray_attrablesr   r   addpdSeriesr   hasattrr   )rf   rr   rb  fieldr!   argr   Zin_dfrI   rI   rJ   _get_reserved_col_names  s,    
rm  c              	   C   s   |du st |tst |tr dS t |tjr0dS zt| W n tyP   Y dS 0 |D ]V}t |tsnt |tr| du s|| jvr dS qVzt| W qV ty   Y  dS 0 qVdS )zReturns True if arg looks like it's a list of columns or references to columns
    in df_input, and False otherwise (in which case it's assumed to be a single column
    or reference to a column).
    NFT)r   r   r   rh  
MultiIndexiter	TypeErrorcolumns)df_inputrl  r   rI   rI   rJ   _is_col_list  s"    rs  c                 C   s>   t | ts2t | tr t| dks2t | ts2| du r6dS dS dS )zReturns True if x is an iterable which can be transformed into a pandas Series,
    False for the other types of possible values of a `hover_data` dict.
    A tuple of length 2 is a special case corresponding to a (format, data) tuple.
    r	  NFT)r   r   tupler   boolrN  rI   rI   rJ   _isinstance_listlike  s    
rv  c                 C   s(   | d ur$|| j v s||v r$d| }q |S )Nr   rq  )rr  rs   ZextrarI   rI   rJ   _escape_col_name$  s    
rx  c                 C   s   t | jddS )aU  
    assuming x is list-like or even an existing pd.Series, return a new pd.Series with
    no index, without extracting the data from an existing Series via numpy, which
    seems to mangle datetime columns. Stripping the index from existing pd.Series is
    required to get things to match up right in the new DataFrame we're building
    T)Zdrop)rh  ri  reset_indexrN  rI   rI   rJ   to_unindexed_series*  s    rz  c              	      s$  | d }|du}t  }t }t }t }	|r6t| nt }
d| v rn| d du rn|s^tdn||j ||j< d| v o| d ot| d t}|r| d D ]}t	| d | rd| d | f| d |< t| d | t
s| d | df| d |< |r| d | d dur||v rtd| qtD ]  tvr>|  gn|  }|du s"|dgu rbq" tvrr gn fd	d
tt|D }tt||D ]F\}\}}t|}|du rqd}t|t jrtd| t|tst|tr:t|jdurt|jn||
}t|tr,|j||< n
|| nBt|tsRt|ds dkr|r| d t| d durt|}| d | d }|rt||krtd|t|tt|j|f t|||< n|std| n||jvrF|r|||fv rqn2d|tt|j|f }|dkr<|d7 }t|nX|rt|| |krtd|t|| tt|j|f nt|}t|| ||< n|r"t|dr"||ju r|jdu s|j|v rd}n|j}t||||g}n.|jdur"|j|v r"|||j u r"|j}|du r6t||
}|rlt||krltd|t|tt|j|f t||t|< |dusJ d tvrt||  < n"t|   trnt||   |<  dkr|	 t| qq"|D ]}tt|||< q|D ]}|| ||< q||	fS )ac  
    After this function runs, the `all_attrables` keys of `args` all contain only
    references to columns of `df_output`. This function handles the extraction of data
    from `args["attrable"]` and column-name-generation as appropriate, and adds the
    data to `df_output` and then replaces `args["attrable"]` with the appropriate
    reference.
    r   Nr*   zjNo data were provided. Please provide data either with the `data_frame` or with the `dimensions` argument.r,   Tr   zIAmbiguous input: values for '%s' appear both in hover_data and data_framec                    s   g | ]} d  t | qS )r   r   r   ra  rI   rJ   r   q  rm   z/process_args_into_dataframe.<locals>.<listcomp>ziArgument '%s' is a pandas MultiIndex. pandas MultiIndex is not supported by plotly express at the moment.__len__zAll arguments should have the same length. The length of hover_data key `%s` is %d, whereas the length of previously-processed arguments %s is %dzString or int arguments are only possible when a DataFrame or an array is provided in the `data_frame` argument. No DataFrame was provided, but argument '%s' is of type str or int.z^Value of '%s' is not the name of a column in 'data_frame'. Expected one of %s but received: %sr   z6
 To use the index, pass it in directly as `df.index`.zAll arguments should have the same length. The length of column argument `df[%s]` is %d, whereas the length of  previously-processed arguments %s is %dr   zAll arguments should have the same length. The length of argument `%s` is %d, whereas the length of  previously-processed arguments %s is %dzData-frame processing failure, likely due to a internal bug. Please report this to https://github.com/plotly/plotly.py/issues/new and we will try to replicate and fix it.r.   )!rh  	DataFramer   r   rd  rm  r   rq  r   rv  rt  re  rf  r   r   r   	enumerateziprn  rp  r   r   rc  r~   r   rk   r   rj  rz  r   r   rx  rg  )rf   	wide_modevar_name
value_namerr  df_provided	df_outputZ	constantsZrangeswide_id_varsrb  Zhover_data_is_dictr   Zargument_listZ
field_listr   argumentrk  lengthrs   Zreal_argumenterr_msgrI   r|  rJ   process_args_into_dataframe4  s&   	 










r  c                    s  | D ]B}|t v r| | durt| | tr6t| | n
t| | | |< q| d du}|rzt| d tjszt| d | d< | d }| ddu }| ddu }|rdnt|| d }|rdnt|| d }d}	d}
d}d}tj	tj
g}|tjkpd| v }|tv r|r|rtd|r|r|rd}	t|jtjrDtd	t|j| d
< |jj}
|
dv sn|
|v rrd}
|tjkr| dpd}n| dpd}|| d< d| d< n||krd}	|r| d n| d | d
< |r| d
 |ju r|jj}
t| d
 tjrt| d
 | d
< |
dv s4|r8|
|v r8d}
|rN|rHdnd}n|rXdnd}d| |rjdnd< d| d< |s|s|rdnd}|	rt|dg }t||
g }
d}|tjtjtjg| v r|s|	sJ||krJdD ]b}| |du r|r|jnt | |< |tjkr"|}n$| d du r|dkr>dnd| d< q|	r|du r||kr| d du r|r|dnd| d< |rt|jtjrtd|j| d< ntt|d|
|gd| d< d}t| dtkr| d tkrd}d| d< t| |	|
|\} t|d|
|g}|	s|r|tjkr|dkrBdnd}t|| | sh|| |< d||< n$| d du r|dkrdnd| d< ||v r| d= |	r fdd| d
 D }| d
= |dkr| d }n|dkr| d }n| d }| d= d}|D ]F}|| jj}|dv rdn|}|du r.|}n||krtdq|j  ||
|d }t!|jt!t"|jksxJ d!||
 #t||
< |dk}|r|| |rdnd< || |rdnd< | d p|
| d< nB|tjtjg| v rH|| |rdnd< || |rdnd< |tj	kr*| d p$|
| d< d"| v r| d" p@|
| d"< n|tjkrt||r|| |rndnd< || |rdnd< | d p|
| d< n>|| |rdnd< || |rdnd< d||< | d p|
| d< n<|tj$tj%fv r|p|
| |rdnd< || |rdnd< |r|tjkr| d durL| d durLd#| d$< nP| d du r|d| d$< d| d< || d< d||< n d| d$< d| d< || d< d||< |rd| d< || d< | S )%a  
    Constructs a dataframe and modifies `args` in-place.

    The argument values in `args` can be either strings corresponding to
    existing columns of a dataframe, or data arrays (lists, numpy arrays,
    pandas columns, series).

    Parameters
    ----------
    args : OrderedDict
        arguments passed to the px function and subsequently modified
    constructor : graph_object trace class
        the trace type selected for this figure
    Nr   r   r   Fr  zPCannot accept list of column references or list of columns for both `x` and `y`.TznData frame columns is a pandas MultiIndex. pandas MultiIndex is not supported by plotly express at the moment.r.   )Nrk   r   r]   rv   rw   rx   r$   Z__x__Z__y__rk   r   zlData frame index is a pandas MultiIndex. pandas MultiIndex is not supported by plotly express at the moment.r   )r~   r3   ry   r   c                    s   g | ]}| vr|qS rI   rI   )ri   r   r  rI   rJ   r     rm   z#build_dataframe.<locals>.<listcomp>)r   r<  uZnumberzLPlotly Express cannot process wide-form data with columns of different type.)Zid_varsZ
value_varsr  r  zWide-mode name-inference failure, likely due to a internal bug. Please report this to https://github.com/plotly/plotly.py/issues/new and we will try to replicate and fix it.r2   r{   ru   )&rf  r   r   r   rh  r~  r   rs  r   r   r   r   r   r   rq  rn  rp  r   FunnelZIndexrx  r*  Barr   r   r   r   NO_COLORr  rt   rp   rq   Zmeltr   rd  r   rF  rG  )rf   ra   rk  r  rr  Zno_xZno_yZwide_xZwide_yr  r  Zwide_cross_namer  Zhist2d_typesZhist1d_orientationZwide_orientationZmissing_bar_dimaxZno_colorr  Z
count_nameZ	other_dimZwide_value_varsrp   rx   Zv_dtypeZorient_vrI   r  rJ   build_dataframe  s\   





"










r  c                 C   s   | j t| jd}| }|t}t|jddj	d }|D ]B}|j
| }t|j	d d }||d   s@td|j
| q@d||< t|jdd dd}t|d d	 D ]:\}}||d  |v r|d |v rtd
|j
|d  dqd S )Nr   r   )r   r   z*None entries cannot have not-None childrenr   c                 S   s
   d | S rM  )r   rN  rI   rI   rJ   r     rm   z-_check_dataframe_all_leaves.<locals>.<lambda>z4Non-leaves rows are not permitted in the dataframe 
zis not a leaf.)r   r   rq  Zisnullr   r   r   Znonzeror^  r"   r   rC  r   Zapplyr  )rr   Z	df_sortedZ	null_maskZnull_indicesZnull_row_indexr   r   Zrow_stringsrI   rI   rJ   _check_dataframe_all_leaves  s*    

r  c                    s  | d | d ddd }t |ddd   d}g }|D ]"}|d }|| | |< q<|}dd }i }d}| d	 rzt| d	  | d	 < W n" ty   td
| d	  Y n0 | d r| d | d	 kr| d	 d }	| d	  |	< |	| d	< | d	  n:djvrdnddd tjD  d <  | d	< d| < | d rt| d sl|}d}n fdd}
|
}||| d < tt	j
|}|D ]}||vr|||< qtt	|t	g d }tjg d| d}|D ]}|| | j||< qt|D ] \}}tj|jd}||d |}| }||  t|d< d|d< ||  t|d< |t|d k r |d }|t|k r |||   td |d  |d< |||   td |d  |d< |d7 }q|d jd|d< |r&|| ||< |j|dd}q| d r|rd}||jv rd|d7 }qL| d  t||< |j|d}|| d< d| d< d| d < d| d!< d| d"< | d r| d# s| d g| d#< nHt| d# tr| d# | d sd$| d# | d < n| d# | d  | S )%z^
    Build dataframe for sunburst, treemap, or icicle when the path argument is provided.
    r   r-   Nr  FZ
_path_copyc                 S   s$   |   }t|dkr|d S dS d S )Nr   r   z(?))r   r   )r   uniquesrI   rI   rJ   aggfunc_discrete  s    z5process_dataframe_hierarchy.<locals>.aggfunc_discreter"   zDColumn `%s` of `df` could not be converted to a numerical data type.r3   Z_sumry   r   c                 S   s   g | ]}t |qS rI   r{  )ri   elrI   rI   rJ   r   2  rm   z/process_dataframe_hierarchy.<locals>.<listcomp>r   r{   Tc                    s   t j| j| j f dS )N)Zweights)r   Zaveragelocr   rN  Zcount_colnamerr   rI   rJ   aggfunc_continuous?  s    z7process_dataframe_hierarchy.<locals>.aggfunc_continuous)rD   r   r   rw  rD   r   r   rU  )Zignore_indexZsort_color_if_discrete_color0r   r%   r!   r#   r,   )TN)r  r   rh  Z
to_numericr   rq  r   r   rt   rd  
differencer~  r   rp   r  groupbyZaggry  r   r   r   rstripr   r   r   r   )rf   r-   Zdiscrete_colornew_pathrs   Znew_col_namer  Zagg_fZaggfunc_colorZnew_value_col_namer  colsr   Zdf_all_treesr   levelZdf_treeZdfgjZsort_col_namerI   r  rJ   process_dataframe_hierarchy  s    





 &

r  c              	   C   s   d| d< | d du s | d du r(t dz0t| d | d  }t| d | d  }W n t tfyv   tdY n0 || d	| d | d < | d | d
< | d= | d | d< | d= | S )z8
    Massage input for bar traces for px.timeline()
    Tr  r   Nr   z#Both x_start and x_end are requiredr   zCBoth x_start and x_end must refer to data convertible to datetimes.ztimedelta64[ms]r   r   )r   rh  Zto_datetimerp  r   )rf   r   r   rI   rI   rJ   process_dataframe_timeline  s     
r  c                    s   fddt t D }g }d}d v rN d rN d  d    d d  }d v rd	 v rd
 vrt|d n` d rt d  d r|d d d< n2|tjtjtjfv r|d d d< n
|d nxd v s|tj	kr|d nZ|tj
tjfv rD|d  d rN d d u r0g  d<  d  d  n
|d td|v o d o|tj
tjfvo|tjtjtjfvp d}nd}d v r|d d v r|d d v r|d d v r d d u} d d u}	 d d u r`|tjtjfv r2|	r`|s`d d< n.|tjtjtjtjfv r`|r`|	s`d d<  d d u r|r|	rt d  d }
t d  d }|
r|sd d< |r|
sd d<  d d u rd d< |tjkrd|r|	r d d u rd  d< |d<  d } d }|dkr0|nd |d < |dkrFd n||d!< |dkr\dnd|d"<  d |d< |tjtjfv r|tjkrd#nd$}|| d u r d d ur d  d kr܈ d dkrd%||< n( d  d kr d dkrd%||< || d u rd&||< |tjkrR d' d urR d d u rRd  d< |d<  d(ddur|tjtj	fv r|d'}n(|tjkr d dkrdnd}nd)} d( du rd*| d+ |d,< nd*| d-  d(  d+ |d,< |tjtjfv rd}d.|d/< d0 v rx d0 d u r>d1 v rx d1 d%krxtd2d3|d4< n:|tjtj
tjtjfv rf d0 |d0< nt d0 d3|d4< d v sd v rt } d5dr|d5  d6sΈ dsΈ d7r|d7  d6r|d6 t|dkr|d5 d8||d9< n<|tjkrRd v s8|tjkrRd7 d6 rHd:nd; |d9< d< v rpt d< d=|d>< n*d? v rt d? d@krdAndBd=|d>< dC v rֈ dD |dD< t dC dEsȈ dC n dC j|dC< dF v r  d dkrdGndH} d dkrdGndH} dF  |< d  |<  dId urH dHd urHd  dH<  dJd urp dGd urpd  dG<  dGd us dHd us dJd urd dK< dL v r dL d ur dL tvrt dM dL t! f dN v r dN d u rt  dN< dO v rD dOd dPvr8t dQdR dO    dO  dS< t"D ]}| v rH|| qH fdTd|D }t# |||}||||fS )UNc                    s   g | ]}| v r|qS rI   rI   )ri   r   r   rI   rJ   r     rm   z infer_config.<locals>.<listcomp>r   r   r   rB   r	  r3   r>   r<   Tr   Fzmarker.colorr2   z
line.colorr,   r5   z	line.dashr4   zmarker.symbolr6   zmarker.pattern.shaperv   r   r   rw   rx   ru   r{   nbinsZnbinsxZnbinsyrB  ZboxmodeZ
violinmoder   groupr   Z	text_autork   z%{r   Ztexttemplate:r   r   rA  r   r@  )rA  r   rK  r    ZmarkersrW  r)  z+textr   Z
line_shape)rS  r   r  r   ZvhZhvZgeojsonZfeatureidkey__geo_interface__rd   r   r   r1   r0   facet_col_wrapr   z,Value '%s' for `trendline` must be one of %sr   ecdfnorm)Nr}   r|   z<`ecdfnorm` must be one of None, 'percent' or 'probability'. z'%s' was provided.rz   c                    s   g | ]}t  |qS rI   )r   )ri   r   r   rI   rJ   r   i  rm   )$direct_attrablesrf  maxr   rt   r   r   r   r   r   r   r   ru  r   r   r*  rF  rG  r  r  r   r   r   rd  rg  r   r   r   r   rj  r  r   r   keysgroup_attrablesrJ  )rf   ra   rc   layout_patchrb   Zgrouped_attrsr   show_colorbarZhas_xZhas_yZx_is_continuousZy_is_continuousrv   r  r)  r   Zmodesr   Zother_positionr   grouped_mappingstrace_specsrI   r   rJ   infer_config  s^    

















 
 



$







  



r  c                    s   d| vri n
| d   |D ]P  tkrt| d    } vrN| < qttt  |  < qg }|jD ] }t|dkr|f}|| qxt	tt
|D ](\  tkrt| fddd}q|fS )a  
    `orders` is the user-supplied ordering with the remaining data-frame-supplied
    ordering appended if the column is used for grouping. It includes anything the user
    gave, for any variable, including values not present in the dataset. It's a dict
    where the keys are e.g. "x" or "color"

    `sorted_group_names` is the set of groups, ordered by the order above. It's a list
    of tuples like [("value1", ""), ("value2", "")] where each tuple contains the name
    of a single dimension-group
    rC   r   r   c                    s&   |    v r"   |  S dS )Nr  r   )gr   r   r   rI   rJ   r     rm   zget_orderings.<locals>.<lambda>rj   )r   rO  r   r   r   fromkeysgroupsr   r   r   r  sorted)rf   rY   groupedr  sorted_group_names
group_namerI   r  rJ   get_orderingsp  s&    
 
r  c           4         sJ
  |pi }|pi }t   t | |tjtjtjfv rJ d d urJt  |dkr`tj}t  t	 |||\}}}}dd |D pt
g} d j|dd}	t ||	\}
g }g }d }}|D ]}|jvr|jd	 |jd
< q|j }|jdkr"t  d d fdd|D }t|}|jdkrZt  d d fdd|D }t|}|D ]2}||jvr^|jt|jt|j  |j|< q^qt| j}i }t }g }d } dd	}|
D ]}|	t|dkr|n|d	 }t }t }d
}t|||D ]^\}}}|t
krt |}t|jtsPt|||< |jrPt|||< |jdkr|}qd| }||vrt  ||< || }|D ] } | j!|d}!| j!tj"tj#tj$tj%tj&tj'tjtjtjf	vr|!j(||d
ko||vd | j!tjtj)tj*tj+fv r|!j(d|d |,| d|!_-d|!_.t/|D ]\}"}||" }z|0|!|j|  W n t1yP   | |d	 kr| j!tj)tj*fv r|jdv sL| j!tj+fv r|jdv rn| |d	 kr | j!tj+fv r |jdkr |!j(t2|j| dd nL| j!tj$tj%fv rJ|jdkrJ|!j(dgt| |j| gd ddd n Y n0 |jdkrj|j| }#n& d d ur| j3d!krd}#nd}#|jdkr|j| }|rd|d |  }#d|d |  }n| j3d"krd}nd}|#dkr|#|!_-|dkr8||!_.q8|d	 j!tj4krH| j!tj*krH|!j5j6rH|!j(t2|!j5j6dd d# v r@ d$ d%krh d! n d" }$ d$ d&kr d! n d" }% d#d'd(k}&|j7|$|&d)}||% 8 }'||% 9 ||%< |&s|j7|$dd)} d#d'd*kr|'||%  ||%<  d+ d,kr||% |' ||%< n" d+ d-kr@d.||%  |' ||%< t: | ||; |\}(})|!(|( |)d ur|<|;  |)|d/ d0< ||vrt2g |d1||< || d2 <|! qqd3d | D }*t|*dkrt=|* fd4d5d6}*|rj|tj'tj&fv rd7nd}+ d8 p d d g},t>d9d:}-t2|-? d;  d< |,d	 |,d t2t@  |+ |+d=d>|d?< d@D ]}. |. rn |. ||.< qnt2d	dA|dB< |rd||dB dC<  dD rʈ dD |dC< n  dE jAjBjCd u rdFdGi|dH< dI v r dI r dE jAjDjEd u rdJ|dB dK< |r<tFG|| }tH||} d d urT|d7 } dLd url|d7 }tI ||*||||}/|*D ]H}0|0d2 D ]8}!t|!tjJrqtK|!|/jA|/jL||!j- d |!j. qq|/Mt|*d	kr|*d	 d2 ng  |/N| dE v 	r& dE d u	r&|/jN dE ddM t|dk	r8|*ng |/_O dN
r  dOdPdQk
r tP |}1|1j!dRdRddS}2dT|1jQv	r|D ]<}|jdk	r|jt|jt|j  }3t2|3d|1jQdT< 	qt: |1 d i |\}(})|2(|( |/jR|2dUdUddV |/jSd/ddW |)d u
r |<t2|)dX tTU||/_VtW ||/ tX ||/ |/S )YNr-   Ztimelinec                 S   s   g | ]}|j ptqS rI   )rY   rO  r  rI   rI   rJ   r     rm   zmake_figure.<locals>.<listcomp>r   F)sortr   r   r   r   r1   r   c                    s   g | ]} t | qS rI   r{  ri   sr8  rI   rJ   r     rm   r   r0   c                    s   g | ]} t | qS rI   r{  r  r  rI   rJ   r     rm   r  r/   z, r:  )legendgroup
showlegendT)ZalignmentgroupZoffsetgroup)r4   r   r   )r4   r   r3   rL  )r   r	  )r   r\  Z	showscaler  r   r   r   r  rv   rx   rw   Zstandardr   )r   	ascendingZcomplementaryr  r|   r}   g      Y@r  px_fit_results)r]  r   r]  c                 S   s   g | ]}|qS rI   rI   r;  rI   rI   rJ   r   U  rm   c                    s    d   | d S )Nr/   r   r  )r<  )rf   r   rI   rJ   r   X  rm   zmake_figure.<locals>.<lambda>r  r   range_colorr\  make_figurer>   Zcolor_continuous_midpointr  )r\  ZcmidZcminZcmaxZcolorbarr   )r;   r:   )Ztracegroupgaplegendr  titler9   r1  r9  marginr   Zconstant
itemsizingr   )r9   Z	overwriter   rD  r   ZoverallzOverall Trendline)r   r  r  r   rC  )r   r   Zexclude_empty_subplots)selectorr  )r  )Yr_  r  r   r   r   r   r  r  r  r  rO  r  r  rY   r[   rZ   r^   rh   r   r   r   r   r   Z	get_groupr  r   r   r   rX   r]   r   r"   rd  ra   r   r   r   r   r   r   r   rF  rG  r   rg  Z_subplot_rowZ_subplot_colr  r\   r   r   rd   r   r   r3   r   r{   Zcumsumr   r   r   r  r   Zvalidate_coercer   r   r  r1  r  r  r   Zceilmininit_figurer   r   r  Z
add_tracesZupdate_layoutr=  rH  rc   Z	add_traceZupdate_tracesrh  r~  rT   r   r>  )4rf   ra   rc   r  r  r  r   r  rY   r  r  
col_labels
row_labelsr  r  mZsorted_valuesvalsubplot_typeZtrace_names_by_framer=  Ztrendline_rowsZtrace_name_labelsr  r  r  r   Z
frame_namer   rj   Z
trace_nameZtrace_namesr   r   r   r   r   r!  r  Z	group_sumr   r   
frame_listZcolorvarr  Zcolorscale_validatorrx   rU   r(  Ztrendline_specZtrendline_traceZ
next_colorrI   )rf   r   r8  rJ   r    s   
 

&
 





















	$



r  c                    s   fddt |D }dg  }dg| }	| dd}
dkr| dd ur| d dksld	| v rr| d	 rrd
}nd}|g|d  d| g }	d}n"|
r| dpd}n| dpd}| dd ur
| d dksd	| v r| d	 rd
}nd}|g d  d| g }d}n| dpd}n8|
r4| dp0d}n| dpBd}| dpRd}|
rd g|   }t||  k r|d  qht |D ]:}t  D ]*}||d |   |  ||  | < qqdd }zLt| |dd|
rg n
tt||
r g n||
r|ng |||	|dd}W n> ty^ } z$||dd ||dd W Y d }~n
d }~0 0 |jj	D ]}|j
d d qh|S )Nc                    s    g | ]}t pd dg  qS )domainr  )r   )ri   r   r  r  rI   rJ   r     rm   zinit_figure.<locals>.<listcomp>g      ?r  r   Zxyr   r   r3   gGz?gzG?r   g{Gz?Zfacet_row_spacinggQ?gQ?r   g{Gzt?Zfacet_col_spacingg{Gz?c                 S   s6   d|f | j d v r2| j d dj|d f| _ | dS )z
        Translates the spacing errors thrown by the underlying make_subplots
        routine into one that describes an argument adjustable through px.
        z
%s spacingr   z5
Use the {facet_arg} argument to adjust this spacing.)	facet_argN)rf   format)er  r  rI   rI   rJ   _spacing_error_translator  s    z.init_figure.<locals>._spacing_error_translatorrC  zbottom-left)Zrowsr  specsZshared_xaxesZshared_yaxesZ
row_titlesZcolumn_titlesZsubplot_titleshorizontal_spacingvertical_spacingrow_heightscolumn_widthsZ
start_cellZ
HorizontalZVertical)Zfont)r   r   r   r   r   r   r   r   r   annotationsr   )rf   r  r  r  r  r  r  r  r  r  r  Z	main_sizer  r  Zsubplot_labelsr   r  r  rU   r  ZannotrI   r  rJ   r    sn    


,
"r  )NN)]Zplotly.graph_objsZ
graph_objsr   Z	plotly.ioiorZ  collectionsr   r   Z_special_inputsr   r   r   r   r   r	   r
   r   r   Z_plotly_utils.basevalidatorsr   Zplotly.colorsr   r   r   Zpandasrh  Znumpyr   Zplotly.subplotsr   r   r   r  r   r  rf  r  Zrenameable_group_attrablesre  r*  rE  r  r  rG  rF  r   r   r   r   objectr7   rX  rQ   rS   rV   rW   r_   rh   ro   rt   r   r   r   r   r   r  r   r   r   r   r   r   r>  rJ  rH  rO  r_  rc  rm  rs  rv  rx  rz  r  r  r  r  r  r  r  r  r  rI   rI   rI   rJ   <module>   s   
(&2  E&
:LL

 K n} X$
  *