a
    ~bC                     @   s   d dl mZmZ zd dlmZ W n ey2   Y n0 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mZmZ dd
lmZ ddlmZ G dd de
Ze
e dS )    )OrderedDictdefaultdictN   )	Interface	DataError   dimension_name)Elementr   )	NdMapping
item_checksorted_contextisscalar)utilc                       sh  e Zd ZdZeeefZdZe	dd Z
e	dd Ze	d8dd	Ze	d
d Ze	dd Ze	dd Ze	dd Ze	dd Ze	dd Ze	dd Ze	dd Ze	ejfddZe	g dfddZe	dd  Ze	d9d!d"Ze	d#d$ Ze	d%d& Ze	d'd( Ze	d:d*d+Ze	g fd,d-Ze	d.d/ Z e	d0d1 Z!e	d2d3 Z"e	d4d5 Z#e	 fd6d7Z$  Z%S );DictInterfacez
    Interface for simple dictionary-based dataset format. The dictionary
    keys correspond to the column (i.e. dimension) names and the values
    are collections representing the values in that column.
    Z
dictionaryc                 C   s2   |j |ddj}|j| }t|r*t|S |jjS NTstrict)get_dimensionnamedatar   typedtype)clsdatasetdimr   values r   =lib/python3.9/site-packages/holoviews/core/data/dictionary.pydimension_type   s    
zDictInterface.dimension_typec              	      s  t tf}|d u r|j}|d u r$|j}dd || D t trttdd  D rttfdd D sttdnt trdd t	 D  nt
 rt fd	dD ṙ fd
dD  nNt tjrD jdkr*|jrt|t| dkrttt  g nt j  fddtD  nt trp g krpt dd D  nt trt d r|jrd tt d  i nd  i nXt tr0t d tr0t d dkr0tdd  d D r0t	dd  D  }dd t	|D  nt fdd| j D shdd t	t	  D  nt trtdd   D st fddD st  }|d \}}tt
|t|kstt
|t|krtdt	dd |D  }dd t	|D  t | js0tdg }	  D ]\}
}t|
trt|}|j dkr|
D ] }|	!|tj"g |j#df qlnX|jdks|j d t|
krtdn.t|
D ]$\}}|	!||d d |f f qnZ|
vr|	!|
|f n@t|s6t|}|jdks6|
v r6td|	!|
|f q<| $fdd|	D sjtd t |r %|	 nt |	  ||d!i fS )"Nc                 S   s   g | ]}t |qS r   r   .0dr   r   r    
<listcomp>-       z&DictInterface.init.<locals>.<listcomp>c                 s   s   | ]}t |tV  qd S N)
isinstancedictr"   r   r   r    	<genexpr>.   r&   z%DictInterface.init.<locals>.<genexpr>c                 3   s    | ]} D ]}||v V  q
qd S r'   r   )r#   r$   c
dimensionsr   r    r*   /   r&   z>DictInterface could not find specified dimensions in the data.c                 S   s   i | ]\}}||qS r   r   r#   r$   vr   r   r    
<dictcomp>2   r&   z&DictInterface.init.<locals>.<dictcomp>c                 3   s   | ]}| v V  qd S r'   r   r"   r   r   r    r*   3   r&   c                    s   i | ]}| | qS r   r   r"   r1   r   r    r0   4   r&   r   c                    s"   i | ]\}}| d d |f qS r'   r   )r#   ikr1   r   r    r0   ;   r&   c                 S   s   g | ]}|g fqS r   r   r"   r   r   r    r%   =   r&   r   r   c                 s   s   | ]}t |tV  qd S r'   r(   tupler#   r/   r   r   r    r*   D   r&   c                 s   s&   | ]\}}t |t | V  qd S r'   r   
wrap_tupler#   r3   r/   r   r   r    r*   E   s   c                 S   s   i | ]\}}|t |qS r   nparrayr9   r   r   r    r0   G   r&   c                 3   s(   | ] }t  td d |jD V  qdS )c                 s   s   | ]}|d ur|V  qd S r'   r   )r#   tr   r   r    r*   J   r&   /DictInterface.init.<locals>.<genexpr>.<genexpr>N)r(   r5   types)r#   	interfacer1   r   r    r*   J   s   c                 S   s   i | ]\}}||qS r   r   r9   r   r   r    r0   L   r&   c                 s   s   | ]}t |tjV  qd S r'   )r(   r;   ndarrayr6   r   r   r    r*   M   r&   c                 3   s,   | ]$  v p"t  fd dD V  qdS )c                 3   s    | ]}t |tr |v V  qd S r'   r4   r#   r3   r$   r   r    r*   N   r&   r>   N)anyr#   r1   rC   r    r*   N   r&   zzDictionary data not understood, should contain a column per dimension or a mapping between key and value dimension values.c                 s   s&   | ]\}}t |t | V  qd S r'   r7   r9   r   r   r    r*   W   s   c                 S   s   i | ]\}}|t |qS r   r:   r9   r   r   r    r0   Y   r&   z.DictInterface interface couldn't convert data.)r   r   z9Values for %s dimensions did not have the expected shape.z6DictInterface expects data for each column to be flat.c                    s$   g | ]\}}| v rt |s|qS r   r   )r#   r$   Zvsr,   r   r    r%   t   r&   z2DictInterface expects data to be of uniform shape.)kdimsvdims)&r   cyODictrG   rH   r(   listall
ValueErrorr5   zipr   Zis_dataframer;   rA   ndimZ_auto_indexable_1dlencolumn_stackZarangeZ
atleast_2dT	enumerater   rD   Z
interfacesr   r)   sorteditemsr8   r?   asarrayshapeappendr<   r   expandedupdate)r   Zeltyper   rG   rH   Zodict_typesZ	dict_datar3   r/   Zunpackedr$   valssdr2   r   )r   r-   r    init%   s    
  .
$0
  
 


zDictInterface.initTc                    s   |rdnd} j |dd} fdd|D }|r>td| |  fdd|D }td	d
 |D dkrddd t|D }td| | d S )NrK   keyr   Zlabelc                    s   g | ]}| j vr|qS r   r1   r"   r   r   r    r%      r&   z*DictInterface.validate.<locals>.<listcomp>zCFollowing columns specified as dimensions but not found in data: %sc                    s0   g | ](}|t  j| rd nt j| fqS r   )r   r   rO   r#   r   r_   r   r    r%      s   c                 S   s   h | ]\}}|d kr|qS r`   r   )r#   r$   lr   r   r    	<setcomp>   r&   z)DictInterface.validate.<locals>.<setcomp>r   z, c                 S   s   g | ]}d | qS )z%s: %dr   )r#   rb   r   r   r    r%      r&   zCLength of columns must be equal or scalar, columns have lengths: %s)r-   r   rO   joinrS   )r   r   rH   Z	dim_typesr-   Z	not_foundlengthsr   r_   r    validate~   s&    
zDictInterface.validatec                 C   s`   t |dkr|S t| d }t || dkr\||jv r\|| d }t|drX| S |S |S )z~
        Given a dataset object and data in the appropriate format for
        the interface, return a simple scalar.
        r   r   compute)rO   rJ   keysrH   hasattrrg   )r   r   r   r]   scalarr   r   r    unpack_scalar   s    zDictInterface.unpack_scalarc                 C   sf   |j |ddj}|j| }t|r&dS |jjdkr<t|}nt|}t	
|  rZdS t|dkS )NTr   Or   )r   r   r   r   r   kindsetr;   uniquer   ZisfiniterK   rO   )r   r   r   r   r   ro   r   r   r    r      s    


zDictInterface.isscalarc                 C   s   |  |t|jfS r'   )lengthrO   r   r   r   r   r   r    rV      s    zDictInterface.shapec                    s(    fdd j  D }|r$t|S dS )Nc                    s,   g | ]$\}}|   v rt|st|qS r   )r-   r   rO   )r#   r$   rZ   r_   r   r    r%      s   z(DictInterface.length.<locals>.<listcomp>r   )r   rT   max)r   r   re   r   r_   r    rp      s    zDictInterface.lengthc                    sN   |s j dd}n fdd|D } fdd|D }t fdd|D S )Nr   r^   c                    s   g | ]}  |jqS r   )Zget_dimensionsr   r"   r_   r   r    r%      r&   z'DictInterface.array.<locals>.<listcomp>c                    s   g | ]} j |j qS r   )r   r   ra   r_   r   r    r%      r&   c                    s(   g | ] }t |r tt |n|qS r   )r   r;   fullrO   )r#   arrr_   r   r    r%      s   )r-   r;   rP   )r   r   r-   arraysr   r_   r    r<      s    zDictInterface.arrayc                 C   s.   t |}t|j }||||f t|S r'   )r	   rJ   r   rT   insertr   )r   r   	dimensionZdim_posr   vdimr   r   r   r   r    add_dimension   s    zDictInterface.add_dimensionc                 C   s^   |  }g }|j D ]>\}}||v r2|| j}n||v rF||j}|||f qt|S r'   )r-   r   rT   r   r   rW   r   )r   r   r-   Zall_dimsZrenamedr3   r/   r   r   r    redim   s    zDictInterface.redimc                    s   t t |D ]`\}}|j D ]\}} | t| qt||D ]$\}} |j t	t
|| qFq|d d }	||	  }
t fdd|
D S )Nr   r   c                    s"   g | ]}|j t |j  fqS r   )r   r;   concatenater"   columnsr   r    r%      r&   z(DictInterface.concat.<locals>.<listcomp>)r   rJ   r   rT   rW   r;   Z
atleast_1drM   r   rs   rO   r-   r   )r   Zdatasetsr-   rH   r]   Zdsr3   rZ   r$   templateZdimsr   r|   r    concat   s     zDictInterface.concatc                 C   s>   t |j}|jD ](}t|j|j }|||< |||j< q|S r'   )r   r   rH   r;   copyr   )r   r   maskZ
mask_valueZmaskedZvdZ	new_arrayr   r   r    r      s    

zDictInterface.maskFc                    sn    fdd|D }t |dkr4|  |d  n fdd|D }t|tfdd j D S )Nc                    s   g | ]}  |jqS r   r   r   r"   r_   r   r    r%      r&   z&DictInterface.sort.<locals>.<listcomp>r   r   c                    s   g | ]}  |qS r   Zdimension_valuesr"   r_   r   r    r%      r&   c                    s>   g | ]6\}}|t |r|n r0| d d d n| fqS )Nr   r.   )reversesortingr   r    r%      s   )rO   r   Zargsortr   Z
arglexsortr   r   rT   )r   r   Zbyr   ru   r   )r   r   r   r    sort   s    
zDictInterface.sortc                 C   s6   |j |dd}|j|j }t|r*||fS t||S r   )r   r   r   r   r   range)r   r   rw   r   columnr   r   r    r      s
    zDictInterface.rangec                 C   sn   |j |ddj}|j|}t|rR|s4t|gS tjt||t|j	d}n|s`t
|S t|}|S )NTr   rF   )r   r   r   getr   r;   r<   rs   rO   r   r   Zunique_arrayrU   )r   r   r   rX   Zflatrg   Z
keep_indexr   r   r   r    r     s    

zDictInterface.valuesc                 C   s   t |j}|| |S r'   )r   r   rY   )r   r   new_datar   r   r   r    assign  s    

zDictInterface.assignc                    s,    fdd|| D }t  fdd|D S )Nc                    s   g | ]}  |jqS r   r   r"   r_   r   r    r%     r&   z)DictInterface.reindex.<locals>.<listcomp>c                    s   g | ]}|  |fqS r   r   r"   r_   r   r    r%     s   r   )r   r   rG   rH   r-   r   r_   r    reindex  s    zDictInterface.reindexc              	      st   fddD fdd j D } j}i }|dkr<tn|}t|trb|t  ||d< ||  fddtt	 D }	g }
t
|	D ]T}|  tt|t fdd|| D }||fi |}|
||f qt|trhtd	T td	* ||
d
W  d    W  d    S 1 s<0    Y  W d    n1 s\0    Y  n||
S d S )Nc                    s   g | ]}  |qS r   r   r"   r_   r   r    r%   "  r&   z)DictInterface.groupby.<locals>.<listcomp>c                    s   g | ]}| vr|qS r   r   )r#   kdimr,   r   r    r%   #  r&   rawrG   c                 3   s&   | ] t  fd dD V  qdS )c                 3   s:   | ]2}t  j|j r" j|j n j|j  V  qd S r'   )r   r   r   r"   )r   r2   r   r    r*   /  s   z2DictInterface.groupby.<locals>.<genexpr>.<genexpr>N)r5   rE   )r   r-   )r2   r    r*   /  s   z(DictInterface.groupby.<locals>.<genexpr>c                 3   s@   | ]8}|j t j|j  r& j|j  n j|j   fV  qd S r'   )r   r   r   r"   )r   r   r   r    r*   7  s    F)rG   )rG   rH   r)   
issubclassr
   rY   r   Zget_param_valuesr   rO   unique_iteratorselect_maskrM   r   rW   r   r   r   )r   r   r-   Zcontainer_typeZ
group_typekwargsrG   rH   Zgroup_kwargsrh   Zgrouped_dataZ
unique_keyZ
group_datar   )r   r-   r   r    groupby  s0    


\zDictInterface.groupbyNc                    s   |d u r  |}|  } }|r> fdd|D S  |}t }j D ].\}}	||vsrt|	r||	||< qZ|	| ||< qZ|rtt	|
 d dkrtjdkr|jd j }
t|
r|
S |
d S |S )Nc              	      s&   i | ]}|j tjg  |d qS )rF   )r   r;   r<   r   r"   rq   r   r    r0   K  s   z(DictInterface.select.<locals>.<dictcomp>r   r   )r   sumr-   indexedr   r   rT   r   rO   rJ   r   rH   r   )r   r   Zselection_maskZ	selectionemptyr-   r   r   r3   r/   valuer   rq   r    selectD  s$    

*zDictInterface.selectc                    sp   d |D ]N}d}t |r|g}t|D ]&\}}||j}||j| |kM }q& |O  q fdd|j D S )NFTc                    s,   i | ]$\}}|t |r|nt|  qS r   )r   r;   r<   )r#   r3   colr   r   r    r0   d  s   z(DictInterface.sample.<locals>.<dictcomp>)r   rR   r   r   r   rT   )r   r   ZsamplessampleZsample_maskr2   r/   r   r   r   r    r   Z  s    

zDictInterface.samplec              
      s6   fdd|D } j ddd}|  |tt}tdd || D }g }|D ]\}	}
t|	trd|	n|	f}	t||	D ]\}}|| | qt|
 D ]\}}| j	v rt
|r|| | qzBt|tjr|j|fi |}n||fi |}|| | W q ty   || Y q0 qqN|tt|fS )Nc                    s   g | ]} j |d djqS Tr   r   r"   r_   r   r    r%   j  r&   z+DictInterface.aggregate.<locals>.<listcomp>r   r   r^   c                 S   s   g | ]}|g fqS r   r   rB   r   r   r    r%   m  r&   )r-   r   rJ   r   r(   r5   rM   rW   rT   rH   r   r;   Zufuncreduce	TypeErrorr   r   )r   r   rG   functionr   rH   groupsZ
aggregatedZdroppedr]   groupr   valrx   rt   Zreducedr   r_   r    	aggregateh  s,    
zDictInterface.aggregatec           
         s   |\}}d}t |r.t |} j|ddg}n*t|trF  | }n fdd|D }t |rf|g}t } j D ].\}}||v rvt |r|||< qv|| ||< qv|r||d j }	t |	r|	S |	d S |S )NFTr   c                    s   g | ]} j |d dqS r   r   r"   r_   r   r    r%     r&   z&DictInterface.iloc.<locals>.<listcomp>r   )	r   r   r(   slicer-   r   r   rT   r   )
r   r   indexZrowsZcolsrj   r   r$   r   rt   r   r_   r    iloc  s(    

zDictInterface.ilocc                 C   s   |j dS )N	geom_type)r   r   rq   r   r   r    r     s    zDictInterface.geom_typec                 C   s,   ddl m} |j}||jv o*t|j| tS )Nr   Polygons)holoviews.elementr   	_hole_keyr   r(   rJ   )r   r   r   r]   r   r   r    	has_holes  s    zDictInterface.has_holesc           	         s   ddl m} |j}||jv rg }|j| D ]j}g }|D ]R}t|}|dd d f |dd d f k r~t||d d g}|| q6|| q*|gS t	t
| |S d S )Nr   r   r   r   )r   r   r   r   r;   rU   rK   r{   rW   superr   holes)	r   r   r   r]   r   ZhsZsubholeshZhole	__class__r   r    r     s    

$zDictInterface.holes)T)TTTF)N)&__name__
__module____qualname____doc__r)   r   rI   r?   Zdatatypeclassmethodr!   r\   rf   rk   r   rV   rp   r<   ry   rz   r   r;   nanr   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__r   r   r   r    r      sj   


X




	


	



$



r   )collectionsr   r   Zitertools.izipZiziprM   ImportErrorZnumpyr;   r@   r   r   rw   r	   elementr
   rI   Z	ndmappingr   r   r   r   r    r   registerr   r   r   r    <module>   s"      .