
    BeF                    X   d dl mZ d dlZd dlZd dlmZ d dlmZ d dl	m
Z
mZmZmZmZmZmZ d dl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 ddlmZ ddlm Z m!Z! ddl"m#Z# ddl$m%Z% e
rd dl&m'Z' d dl(m)Z) d dlm*Z* ddl+m,Z, dZ-g dZ. G d de          Z/ddZ0 G d de%e          Z1dS )    )annotationsN)Enum)partial)TYPE_CHECKINGCallableClassVarListMappingOptionalType)ColumnDataSourceImportedStyleSheet)JupyterComm   )CDN_DIST)state)ReactiveData)datetime_types	lazy_load)Viewable   )	ModelPane)Document)Model)Comm)PerspectiveClickEventmaterial)r   zmaterial-darkmonokai	solarizedzsolarized-dark	vaporwavec                  h    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZed             ZdS )PluginzThe plugins (grids/charts) available in Perspective.  Pass these into
    the `plugin` arg in `PerspectiveWidget` or `PerspectiveViewer`.
    	hypergriddatagridd3_y_bard3_x_bar
d3_xy_line	d3_y_line	d3_y_aread3_y_scatterd3_xy_scatter
d3_treemapd3_sunburst
d3_heatmapd3_candlestickd3_ohlcc                 >    t          d t          D                       S )z
        Returns the list of options of the PerspectiveViewer, like Hypergrid, Grid etc.

        Returns
        -------
        options: list
          A list of available options
        c              3  $   K   | ]}|j         V  d S N)value.0cs     6lib/python3.11/site-packages/panel/pane/perspective.py	<genexpr>z!Plugin.options.<locals>.<genexpr>F   s$      ,,AG,,,,,,    )listr"    r:   r8   optionszPlugin.options<   s!     ,,V,,,,,,r:   N)__name__
__module____qualname____doc__	HYPERGRIDGRIDYBAR_D3XBAR_D3	XYLINE_D3YLINE_D3YAREA_D3YSCATTER_D3XYSCATTER_D3
TREEMAP_D3SUNBURST_D3
HEATMAP_D3CANDLESTICKCANDLESTICK_D3OHLCOHLC_D3staticmethodr=   r<   r:   r8   r"   r"   &   s          IDGGIHH K"LJKJ"K%NDG	- 	- \	- 	- 	-r:   r"   c                   ddl }pi g g g dt          | j        |j                  r| j                                        | _        t          | |j                  rgt          |d          rW| j                                        D ]=\  }}t          ||j	                  r#| |         
                    t                    | |<   >t          | |j                  rTt          | j        |j                  r9t          | j        |j                  rd                             d | j        j        D                        d| j        j        v rd         | j        j        z   }| j        j        D ]3}|/d                             |           |                                 } 4|                    |                                           } | j        D ]!}||vrd                             |           "n4d         D ]}|                                 } |                    |           } d}	t)          | j        j                  }
t+          | j        j                  D ]l\  }}|&|	dk    rd	nd
                    |	          |
|<   |	dz  }	-t          |          d         vr(d                             t          |                     m|
| j        _        |                                 } fd| j        D             | _        d                             fd| j        D                        n2t          | |j                  rt          | j        |j                  r| j        j        r5d                             t          | j        j                             d}nd}|                    |                                           } d}	t)          | j        j                  }
t+          | j        j                  D ]\  }}|V|	dk    rd	nd
                    |	          |
|<   |	dz  }	|r.d                             t          |
|                              ]t          |          d         vr(d                             t          |                     |
| j        _        fd| j        D             | _        d                             fd| j        D                        nut          | |j                  r`t          | j        |j                  rFd                             t)          | j        j                             |                                 } t          | |j                  rhd	d | j        D             vr|                     d	          } d         s7d                             d | j        D                        d         | _        t          | |j                  rM|                                 }t          | |j                  r"| j        |_        d |j        D             |_        |} | fS )az  
    Given a dataframe, flatten it by resetting the index and memoizing
    the pivots that were applied.

    This code was copied from the Perspective repository and is
    reproduced under Apache 2.0 license. See the original at:

    https://github.com/finos/perspective/blob/master/python/perspective/perspective/core/data/pd.py

    Arguments
    ---------
    data: (pandas.dataframe)
      A Pandas DataFrame to parse

    Returns
    -------
    data: pandas.DataFrame
      A flattened version of the DataFrame
    kwargs: dict
      A dictionary containing optional members `columns`,
      `group_by`, and `split_by`.
    r   Ncolumnsgroup_bysplit_byCategoricalDtyperV   c                ,    g | ]}t          |          S r<   strr5   s     r8   
<listcomp>z&deconstruct_pandas.<locals>.<listcomp>s   s    "D"D"Da3q66"D"D"Dr:   rW   rU   indexzindex-{}r   c                r    g | ]3}|d gd         z   d         z   d         z   v rt          |          nd4S r]   rV   rW   rU   r4   rZ   r6   r7   kwargss     r8   r\   z&deconstruct_pandas.<locals>.<listcomp>   su     	
 	
 	
  yZ !Z ! Y     FFF 	
 	
 	
r:   c                T    g | ]$}|d gd         z   d         z   d         z   v"d%S r_   r<   r`   s     r8   r\   z&deconstruct_pandas.<locals>.<listcomp>   sd       y$%$% #$$ $ $ $ $r:   FTc                `    g | ]*}|d gd         z   d         z   v rt          |          nd+S r]   rV   rW   r4   rZ   r`   s     r8   r\   z&deconstruct_pandas.<locals>.<listcomp>   sY     
 
 
  WIz 22VJ5GGGG FFF
 
 
r:   c                B    g | ]}|d gd         z   d         z   vdS rd   r<   r`   s     r8   r\   z&deconstruct_pandas.<locals>.<listcomp>   sD       WIz(::VJ=OOOO OOOr:   c                P    g | ]#}t          |                                          $S r<   )r[   lowerr5   s     r8   r\   z&deconstruct_pandas.<locals>.<listcomp>   s&    @@@a3q66<<>>@@@r:   )col_fillc                ,    g | ]}t          |          S r<   rZ   r5   s     r8   r\   z&deconstruct_pandas.<locals>.<listcomp>   s    %C%C%Cc!ff%C%C%Cr:   c                ,    g | ]}t          |          S r<   rZ   r5   s     r8   r\   z&deconstruct_pandas.<locals>.<listcomp>   s     C C CAQ C C Cr:   )pandas
isinstancer]   PeriodIndexto_timestamp	DataFramehasattrdtypesitemsrX   astyper[   rU   
MultiIndexextendnamesappendstackreset_indexunstackr;   	enumerateformatnameSeries)datara   pdkvexistentr7   
new_column_i	new_namesjvalpush_row_pivot	flatteneds    `             r8   deconstruct_pandasr   I   s   . \rF<<F$*bn-- /Z,,..
$%% 22)** 	2))++ 2 21a!455 2"1gnnS11DG 	4&&y"t|R]33y" tz2=11y" 	z!!"D"D4:3C"D"D"DEEE 4<%%% j)DL,>>H\' ( (=:&--a000::<<D<<%%1133D"l 9 9
X--9%,,Z8889 J' & &||~~<<%%D )**	
 011 	8 	8FAs{*+q&&wwj6G6G6J6J	!Q s886*#555:&--c#hh777 %
!!	
 	
 	
 	
 \	
 	
 	
 	y       
	
 
	
 
	
 
	
 
D",	'	' ("Jt|R],S,S (":? 	":%%c$*/&:&:;;;"NN!N||DLLNN++)**	
 011 	8 	8FAs{*+q&&wwj6G6G6J6J	!Q! A:&--c)A,.?.?@@@s886*#555:&--c#hh777$

 
 
 
 \	
 
 
 	y       	
 	
 	
 	
 
D",	'	' "Jtz2=,Q,Q "z!!$tz'7"8"8999!!$%% -@@4<@@@@@##W#55Di  	-9$$%C%Cdl%C%C%CDDD!),DL$	"" $$&&	dBI&& 	D!YIN !D C1B C C CI<r:   c                  h    e Zd ZU dZ ej        ddd          Z ej        ddd          Z ej	        ddd          Z
 ej        ddd	          Z ej        ddd
          Z ej        ddd          Z ej        ddd          Z ej        d          Z ej        dd          Z ej	        ddd          Z ej        dd          Z ej        ej        j        e                                d          Z ej        i dd          Z ej	        dd          Z ej        ded          ZdZde d<   dZ!de d<   d gZ"d!e d"<   d#diZ#d$e d%<   dZ$d&e d'<   e% d(gZ&d!e d)<   e'd*             Z(dF fd+	Z)d, Z*d- Z+dF fd.	Z,dFd/Z- fd0Z.d1 Z/ fd2Z0	 	 dGdH fd<Z1dIdAZ2dB Z3dJdEZ4 xZ5S )KPerspectivea2  
    The `Perspective` pane provides an interactive visualization component for
    large, real-time datasets built on the Perspective project.

    Reference: https://panel.holoviz.org/reference/panes/Perspective.html

    :Example:

    >>> Perspective(df, plugin='hypergrid', theme='material-dark')
    NTz<
      How to aggregate. For example {"x": "distinct count"})defaultnested_refsdoczL
        A list of source columns to show as columns. For example ["x", "y"]z"
      Whether items are editable.)r   
allow_Noner   zk
      A list of expressions computing new columns from existing columns.
      For example [""x"+"index""]zC
      A list of source columns to pivot by. For example ["x", "y"]zJ
      How to filter. For example [["x", "<", 3],["y", "contains", "abc"]]i  )r   NzK
        Minimal width of the component (in pixels) if width is adjustable.)r   boundsr   zG
      The plot data declared as a dictionary of arrays or a DataFrame.)r   zC
      A list of source columns to group by. For example ["x", "y"])r   r   z$
      Whether items are selectable.z-
      How to sort. For example[["x","desc"]]zX
      The name of a plugin to display the data. For example hypergrid or d3_xy_scatter.)r   objectsr   z5
      Configuration for the PerspectiveViewerPlugin.z'
      Whether to show the config menu.r   zD
      The style of the PerspectiveViewer. For example material-darkzClassVar[float | bool | None]priorityzClassVar[Type[Model] | None]_bokeh_modelobjectzClassVar[List[str]]_data_params	selectionz"ClassVar[Mapping[str, str | None]]_renamezClassVar[bool]_updateszcss/perspective-datatable.css_stylesheetsc                    t          |t                    r1t          d |                                D                       r|rdnd S dt          j        v rdd l}t          ||j                  rdS dS )Nc              3  X   K   | ]%}t          |t          t          j        f          V  &d S r3   )rl   r;   npndarray)r6   r   s     r8   r9   z&Perspective.applies.<locals>.<genexpr>N  s4      +g+gRSJq4:L,M,M+g+g+g+g+g+gr:   r   rk   F)rl   dictallvaluessysmodulesrk   ro   )clsr   r   s      r8   applieszPerspective.appliesL  s    fd## 	+g+gW]WdWdWfWf+g+g+g(g(g 	(11D($$&",// qur:   c                    |                     dd           }g | _         t                      j        |fi | |r|                     |           d S d S )Non_click)pop_on_click_callbackssuper__init__r   )selfr   paramsclick_handler	__class__s       r8   r   zPerspective.__init__V  sg    

:t44#% **6*** 	)MM-(((((	) 	)r:   c                &     j         i i fS t           j         t                    rt           j                   } j         x}npt	           j                   \  }t          j                  }fdj        D             }|r0  j        j        di  fd|                                D              t           fdD                       }t          |          |k    rt          d          d |                                D             fS )Nc                ,    i | ]}||         j         S r<   )r   )r6   coldfs     r8   
<dictcomp>z)Perspective._get_data.<locals>.<dictcomp>f  s!    >>>CCC>>>r:   c                <    i | ]\  }}t          |          ||S r3   )getattr)r6   r   r   r   s      r8   r   z)Perspective._get_data.<locals>.<dictcomp>h  s9     % % %!QtQ''/ q///r:   c              3  B   K   | ]}                     |          V  d S r3   	_as_digit)r6   r7   r   s     r8   r9   z(Perspective._get_data.<locals>.<genexpr>l  s/      114>>!$$111111r:   z9Integer columns must be unique when converted to strings.c                4    i | ]\  }}t          |          |S r<   rZ   )r6   r   r   s      r8   r   z)Perspective._get_data.<locals>.<dictcomp>p  s$    777$!QCFFA777r:   r<   )r   rl   r   lenr   rU   paramupdaterr   set
ValueError)r   ncolsr   ra   colsr   s   `    @r8   	_get_datazPerspective._get_data]  sH   ;r6Mdk4(( 	$$E#B+DK88JB
OOE>>>>2:>>>D !
!   % % % %%+\\^^% % %    1111b11111t99 5 6 6 677$**,,77777r:   c                R    t          t          j                  fd|D             S )Nc                    g | ]}|v|	S r<   r<   )r6   pignoreds     r8   r\   z2Perspective._filter_properties.<locals>.<listcomp>t  s#    :::a')9)9)9)9)9r:   )r;   r   r   )r   
propertiesr   s     @r8   _filter_propertieszPerspective._filter_propertiesr  s,    x~&&:::::::::r:   c                   t                                          |          }|d= |                    d          r| j        pd|d<   n| j        pd|d<   |t	          | j                  }n| j        |_        ||d<   i x|d<   }|j                                        D ]A\  }}t          |t          j
                  st          j        |          }|j        j        }|d	k    rd
||<   L|dv rd||<   V|dk    rd||<   b|dk    rd||<   n|dv rd||<   xt          |          r|d         }t          |t          j                  rd||<   t          |t"                    rd
||<   t          |t$                    rd||<   t          |t&          t          j        f          rd||<   t          |t*          t          j        f          rd||<   5d||<   <d||<   C|S )Nr   toggle_configi,  height   )r   sourceschemaMdatetimeuiintegerbbooleanffloatsUstringr   date)r   _get_propertiesgetr   r   _datar   rr   rl   r   r   asarraydtypekindr   dtr   r   r[   r   floatingintr   )
r   r   r   propsr   r   arrayr   r4   r   s
            r8   r   zPerspective._get_propertiesv  s   '',,(O99_%% 	1"k0SE(OO"k0SE(O>%4:666FF*FK h#%%h& +++-- 	+ 	+JCeRZ00 *
5));#Ds{{(s's's%s&su:: +!!HE!%11 /&,s#E>:: 	/&0s#E3// /&.s#EE2;+?@@ /&-s#EC+<== /&/s&.s"*F3KKr:   c                r    ddl m} | | d}| j        "| j        j        d d         |gz   | j        _        |S )Nr   )	THEME_URLz.css   )models.perspectiver   r   __css_raw__)r   theme	resourcesr   	theme_urls        r8   
_get_themezPerspective._get_theme  sY    222222 -%---	(,0,=,I"1",MQZP[,[D)r:   c                   d|v sd|v ro|                      |                    d| j                             t          | j        dg           }d |D             |                    d| j                  z   |d<   t                                          |          }dD ],}|                    |          rd ||         D             ||<   -|                    d          rd |d         D             |d<   |                    d	          rd
 |d	         D             |d	<   |                    d          r'd |d                                         D             |d<   |S )Nstylesheetsr   __css__c                .    g | ]}t          |           S ))url)r   )r6   sss     r8   r\   z5Perspective._process_param_change.<locals>.<listcomp>  s1     % % %/1"r***% % %r:   rT   c                4    g | ]}|d nt          |          S r3   rZ   )r6   r   s     r8   r\   z5Perspective._process_param_change.<locals>.<listcomp>  s&    RRR#CKDDSXXRRRr:   sortc                6    g | ]^}}t          |          g|S r<   rZ   r6   r   argss      r8   r\   z5Perspective._process_param_change.<locals>.<listcomp>  s*    OOO:3c#hh..OOOr:   filtersc                6    g | ]^}}t          |          g|S r<   rZ   r   s      r8   r\   z5Perspective._process_param_change.<locals>.<listcomp>  s*    UUUjcDS 1D 1UUUr:   
aggregatesc                4    i | ]\  }}t          |          |S r<   rZ   )r6   r   aggs      r8   r   z5Perspective._process_param_change.<locals>.<dictcomp>  s$    "]"]"]XS#3s88S"]"]"]r:   )	r   r   r   r   r   r   r   _process_param_changerr   )r   r   cssr   r   r   s        r8   r   z!Perspective._process_param_change  s   F""g&7&7OOFJJw
;;<<<$+Y;;C% %58% % %

=$*:;;%<F=! --f554 	S 	SAyy|| SRRqRRRa99V 	POOvOOOE&M99Y 	VUUE)DTUUUE)99\"" 	^"]"]|ATAZAZA\A\"]"]"]E,r:   c                    | j         || j         v s||S |                                r%t          |          | j         v rt          |          S |S r3   )
_processedisdigitr   )r   r   s     r8   r   zPerspective._as_digit  sQ    ?"cT_&<&<J[[]] 	s3xx4?::s88O
r:   c                    t                                          |          }dD ]}||vr fd||         D             ||<   |                    d          r fd|d         D             |d<   |                    d          r fd|d         D             |d<   |                    d          r) fd|d                                         D             |d<   |S )	NrT   c                :    g | ]}                     |          S r<   r   )r6   r   r   s     r8   r\   z8Perspective._process_property_change.<locals>.<listcomp>  s%    BBB,,BBBr:   r   c                D    g | ]^}}                     |          g|S r<   r   r6   r   r   r   s      r8   r\   z8Perspective._process_property_change.<locals>.<listcomp>  s1    VVVJC$DNN3//7$7VVVr:   r   c                D    g | ]^}}                     |          g|S r<   r   r  s      r8   r\   z8Perspective._process_property_change.<locals>.<listcomp>  s1    \\\zsTt~~c22:T:\\\r:   r   c                B    i | ]\  }}                     |          |S r<   r   )r6   r   r   r   s      r8   r   z8Perspective._process_property_change.<locals>.<dictcomp>  s+     d d dhc3!4!4c d d dr:   )r   _process_property_changer   rr   )r   msgpropr   s   `  r8   r  z$Perspective._process_property_change  s   gg..s337 	C 	CD3BBBBD	BBBCII776?? 	WVVVV#f+VVVCK779 	]\\\\SQZ^\\\C	N77<   	e d d d d#lJ[JaJaJcJc d d dC
r:   r   r   rootOptional[Model]parentcommOptional[Comm]returnr   c                    t          ddt          |t                    |          | _        t	                                          ||||          }|                     d|||           |S )Nzpanel.models.perspectiver   perspective-click)modelr   r  )r   rl   r   r   r   
_get_model_register_events)r   r   r  r  r  r  r   s         r8   r  zPerspective._get_model  sm     &&z$7T7TVZ
 
 ""3fd;;1CdSSSr:   refr[   r  Nonec                ^     |j         di |                     |j        |j                   d S )N)r   r<   )r   r   documentr   )r   r  r  s      r8   _updatezPerspective._update  s7    QQt++EN5<+PPQQQQQr:   c                |    |j         dk    r.| j        D ](}t          j        t	          ||          d           'd S d S )Nr  F)schedule)
event_namer   r   executer   )r   eventcbs      r8   _process_eventzPerspective._process_event  s[    222. B Bgb%005AAAAA 32B Br:   callback'Callable[[PerspectiveClickEvent], None]c                :    | j                             |           dS )aU  
        Register a callback to be executed when any row is clicked.
        The callback is given a PerspectiveClickEvent declaring the
        config, column names, and row values of the row that was
        clicked.

        Arguments
        ---------
        callback: (callable)
            The callback to run on edit events.
        N)r   rw   )r   r%  s     r8   r   zPerspective.on_click  s!     	 ''11111r:   r3   )NNN)
r   r   r  r  r  r  r  r  r  r   )r  r[   r  r   r  r  )r%  r&  )6r>   r?   r@   rA   r   Dictr   r	   rU   BooleaneditableexpressionsrW   r   Integer	min_width	Parameterr   rV   
selectabler   ObjectSelectorr"   rC   r4   r=   pluginplugin_configr   THEMESr   r   __annotations__r   r   r   r   r   r   classmethodr   r   r   r   r   r   r   r   r  r  r  r$  r   __classcell__)r   s   @r8   r   r     s3        	 	 Dd A? @ @ @J ej4 >O P P PG u}Td A% & & &H %*Tt B% & & &K uz$D ?F G G GH ej4 >M N N NG c) BN O O OI U_ "J K K KF uz$ -F G G GH t C' ( ( (J 5:d )0 1 1 1D "U!&+*;V^^EUEU \[ \ \ \F EJrt B8 9 9 9M "EM$ 5* + + +M !E V JG H H HE /3H222215L5555)1
L2222 	T3G      $H#### 222)L       [) ) ) ) ) )8 8 8*; ; ;, , , , , ,\       &       6:?C	 	 	 	 	 	 	R R R RB B B
2 2 2 2 2 2 2 2r:   r   r3   )2
__future__r   r   r   r   enumr   	functoolsr   typingr   r   r   r	   r
   r   r   numpyr   r   bokeh.modelsr   r   pyviz_commsr   io.resourcesr   io.stater   reactiver   utilr   r   viewabler   baser   bokeh.documentr   bokeh.modelr   r   model.perspectiver   DEFAULT_THEMEr3  r"   r   r   r<   r:   r8   <module>rH     sG   " " " " " "     



                                   = = = = = = = = # # # # # # # # # # # #       # # # # # # , , , , , , , ,             :''''''!!!!!!      999999
 
 
 -  -  -  -  -T  -  -  -Fv v v vrp2 p2 p2 p2 p2)\ p2 p2 p2 p2 p2r:   