a
    ~b0>                     @   s   d dl mZ zd dlmZ W n ey.   Y n0 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mZmZ dd
lmZ ddlmZ G dd deZee dS )    )absolute_importN   )	Interface	DataError   dimension_name)Element)OrderedDict)	NdMapping
item_checksorted_context)util)finite_rangec                   @   s@  e Zd ZerejndfZdZedd Zedd Z	edd Z
ed1d
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d2ddZeejfddZedd Zeg dfdd Zed3d!d"Zed4d#d$Zeg fd%d&Zed'd( Zed)d* Zed+d, Zed-d. Zed/d0 ZdS )5PandasInterfaceNZ	dataframec                 C   s0   |j |ddj}t|jj|}|jj| jS )NTstrict)get_dimensionnamelistdatacolumnsindexZdtypestype)clsdatasetdimr   idx r   9lib/python3.9/site-packages/holoviews/core/data/pandas.pydimension_type   s    zPandasInterface.dimension_typec                    s  |j  }|d }|d }tr, trtj}tt	j
rVjjnjjg}	|	d gkrpdg}	|jr|dkrd u rt|	t|jd trt|jd t|jg}
nd }
t|jd tr|jd nd }rd u rfddjD nr*d u r*fddjD d |
 nd u r|tjd |
 d u rfddj|
|rn|
| nd  D n0g krd u rtjd |r|nd  D ]Dtjv r̐qtfd	d
|	D r  qqtdd
  D rtd| rhtd }|jrh|dkrh|jvrh d|tt  D ]:ttfddjD dkrptd | qpnrn|jrʈn|jttdd  D  ttr*tfdd
 D r*tfdd
 D nttrVtdkrVdd  D nXtttfr|g i fv r|d n2ttr4tfdd
 D s4tdd
   D s4t!" }|d \}}tt#|tks tt#|tkrt$dt%dd
 |D  }tdd
 t% |D nzttj&rj'dkr|jrtt dkrttfnt(j)n t*fdd
t+j,d D tt*r\dd D |jd pd|jd pd }tdd
 D rt$dn<t|k r.td|j-|tf n| .sBt$dt	j
tt%  d n`ttrtfd!d
 D sttrt fd"d
D rt$d#nt	j
 d d$i fS )%Nkdimsvdimsr   r   c                    s   g | ]}| vr|qS r   r   .0cr!   r   r   
<listcomp>5       z(PandasInterface.init.<locals>.<listcomp>c                    s   g | ]}| vr|qS r   r   r#   )r"   r   r   r'   7   r(   c                    s   g | ]}| vr|qS r   r   r$   dr&   r   r   r'   ;   s   c                 3   s"   | ]} |d u rdn|kV  qd S )Nr   r   )r$   r   )kdr   r   	<genexpr>E   s   z'PandasInterface.init.<locals>.<genexpr>c                 s   s   | ]}t |tjtfV  qd S N)
isinstancenpZint64intr)   r   r   r   r,   I   r(   zNpandas DataFrame column names used as dimensions must be strings not integers.r   c                    s   g | ]}| kr|qS r   r   r#   )r*   r   r   r'   U   r(   zDimensions may not reference duplicated DataFrame columns (found duplicate %r columns). If you want to plot a column against itself simply declare two dimensions with the same name. c                 S   s   g | ]}t |qS r   r   r)   r   r   r   r'   _   r(   c                 3   s   | ]}| v V  qd S r-   r   r#   r   r   r   r,   a   r(   c                 3   s   | ]}| | fV  qd S r-   r   r)   r1   r   r   r,   b   r(   c                 S   s   i | ]}|t g qS r   )r/   arrayr#   r   r   r   
<dictcomp>d   r(   z(PandasInterface.init.<locals>.<dictcomp>c                 3   s   | ]}| v V  qd S r-   r   r)   r1   r   r   r,   g   r(   c                 s   s   | ]}t |tjV  qd S r-   )r.   r/   ndarray)r$   vr   r   r   r,   h   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-   )r   
wrap_tupler$   kr5   r   r   r   r,   o   s   c                 s   s   | ]\}}||fV  qd S r-   r   )r$   r%   colr   r   r   r,   q   r(   c                 3   s   | ]} d d |f V  qd S r-   r   )r$   ir1   r   r   r,   y   r(   c                 S   s&   g | ]}t |tjst|n|qS r   )r.   r/   r4   r2   r)   r   r   r   r'   |   r(   c                 s   s   | ]}|j d kV  qdS )r   N)ndimr)   r   r   r   r,   ~   r(   z:PandasInterface cannot interpret multi-dimensional arrays.zpData contains fewer columns than the %s element expects. Expected at least %d columns but found only %d columns.z4PandasInterface expects data to be of uniform shape.r   c                 3   s   | ]}| vV  qd S r-   r   r#   r1   r   r   r,      r(   c                 3   s*   | ]"} D ]}t |to||vV  q
qd S r-   )r.   dict)r$   r*   r%   r<   r   r   r,      r(   z@PandasInterface could not find specified dimensions in the data.)r!   r"   )/ZparamZobjectsr   Z	is_seriesZto_frameZis_dataframelenr   r.   pd	DataFramer   namesr   Z_auto_indexable_1dr   Zboundsr0   mindefaultr   anyreset_indexr   copyinsertr/   ZarangeZunique_iteratorr=   allcyODictvaluessorteditemsr6   
ValueErrorzipr4   r;   Z
atleast_2dTtuplerangeshape__name__expanded)r   Zeltyper   r!   r"   Zelement_paramsZ
kdim_paramZ
vdim_paramZncolsZindex_namesr;   ZnvdimkdimZcolumn_datar8   r5   Zmin_dimsr   )r   r*   r   r+   r!   r"   r   init    s    





,

$$0  
$
zPandasInterface.initc                 C   s&   |j |ddj}t|j|  dkS )NTr   r   )r   r   r>   r   unique)r   r   r   r   r   r   r   isscalar   s    zPandasInterface.isscalarTc                    sR   |rdnd}|j |dd}t|jj  fdd|D }|rNtdt| | d S )NrH   keyr   Zlabelc                    s   g | ]}| vr|qS r   r   r)   colsr   r   r'      r(   z,PandasInterface.validate.<locals>.<listcomp>z`Supplied data does not contain specified dimensions, the following dimensions were not found: %s)
dimensionsr   r   r   r   repr)r   r   r"   Z	dim_typesr]   Z	not_foundr   r[   r   validate   s    zPandasInterface.validatec                 C   s&  |j |dd}|j|j }|jjdkrt|jtjrJt	tj
t	dk rX|jdd}n| }z||d g  }W n   Y n0 t|stjtjfS |jd |jd fS |jd ur| ||j}t|| | \}}|jjd	krt|jd
d r| jd d| jd dfS ||fS d S )NTr   O0.17.0F)Zinplacer   MtzZtzinfo)r   r   r   dtypekindr.   r?   r@   r   LooseVersion__version__sortsort_valuesZisinr>   r/   ZNaNilocZnodataZreplace_valuer   rB   maxgetattrto_pydatetimereplace)r   r   	dimensioncolumnZcminZcmaxr   r   r   rQ      s.    
zPandasInterface.rangec                 K   s*   t jt dkrd|d< tj|fi |S )Nz0.23.0Frj   )r   Zpandas_versionrh   r?   concat)r   
dataframeskwargsr   r   r   	concat_fn   s    zPandasInterface.concat_fnc           
      C   sN   g }|D ]:\}}|j  }t||D ]\}}	|	||j< q$|| q| |S r-   )r   rF   rN   r   appendrv   )
r   Zdatasetsr]   r"   rt   rY   Zdsr   r*   r8   r   r   r   rs      s    
zPandasInterface.concatc           	   	      s   fdd|D fdd j D }i dkrNttrNtt |d|  jd< dd D }fdd jj	|d	d
D }t|t
r
td	R td	* ||dW  d    W  d    S 1 s0    Y  W d    n1  s0    Y  n||S d S )Nc                    s   g | ]} j |d dqS Tr   )r   r)   r   r   r   r'      r(   z+PandasInterface.groupby.<locals>.<listcomp>c                    s   g | ]}| vr|qS r   r   )r$   rU   )
index_dimsr   r   r'      s   rawr&   r   c                 S   s   g | ]
}|j qS r   r   r)   r   r   r   r'      r(   c                    s$   g | ]\}}||fi  fqS r   r   r7   )group_kwargs
group_typer   r   r'      r(   Frj   )r!   
issubclassr	   r=   r   Zget_param_valuesupdater   r   groupbyr   r   r   )	r   r   r]   Zcontainer_typer~   ru   Zelement_dimsZgroup_byr   r   )r   r}   r~   rz   r   r      s"    


ZzPandasInterface.groupbyc                    s   |j } fdd|jD }|jddd}|||  }tjtjfv rRfdd}	n}	t r|j|dd	}
|
j|	fi |	 }nB|j
|	fi |}td
d t|j|jD }tj|t|jd}g }|D ]}||jvr|| q||fS )Nc                    s   g | ]}| v r|j qS r   r|   r)   )r]   r   r   r'      r(   z-PandasInterface.aggregate.<locals>.<listcomp>valuer   rZ   c                    s    | ddS )Nr   )Zddofr   )x)functionr   r   <lambda>   r(   z+PandasInterface.aggregate.<locals>.<lambda>Fr   c                 s   s   | ]\}}||gfV  qd S r-   r   )r$   r9   r5   r   r   r   r,      r(   z,PandasInterface.aggregate.<locals>.<genexpr>r<   )r   r!   r]   r/   Zstdvarr>   r   	aggregaterE   Zapplyr=   rN   r   rJ   r?   r@   r   r   rw   )r   r   r]   r   ru   r   r\   r"   Z	reindexedfnZgroupeddfZaggZdroppedvdr   )r]   r   r   r      s$    
zPandasInterface.aggregatec                 C   s(   t |dkst |jdkr|S |jd S )z~
        Given a dataset object and data in the appropriate format for
        the interface, return a simple scalar.
        r   )r   r   )r>   r   Ziat)r   r   r   r   r   r   unpack_scalar  s    zPandasInterface.unpack_scalarc                 C   s   |j S r-   r1   )r   r   r!   r"   r   r   r   reindex  s    zPandasInterface.reindexc                 C   s,   |j  }dd |jD }||j||f< |S )Nc                 S   s   g | ]
}|j qS r   r|   )r$   r   r   r   r   r'     r(   z(PandasInterface.mask.<locals>.<listcomp>)r   rF   r"   loc)r   r   maskZ
mask_valueZmaskedr\   r   r   r   r     s    
zPandasInterface.maskc                 C   s    dd |  D }|jj|dS )Nc                 S   s   i | ]\}}||j qS r   r|   r7   r   r   r   r3     r(   z)PandasInterface.redim.<locals>.<dictcomp>r<   )rL   r   rename)r   r   r]   Zcolumn_renamesr   r   r   redim  s    zPandasInterface.redimFc                    sb   dd l } fdd|D }t j|jr>t|jtdk rP jj|| dS  jj|| dS )Nr   c                    s   g | ]} j |d djqS rx   r   r   r)   ry   r   r   r'   $  r(   z(PandasInterface.sort.<locals>.<listcomp>ra   )r   	ascending)byr   )	pandasr.   r   r@   r   rh   ri   rj   rk   )r   r   r   reverser?   r\   r   ry   r   rj   !  s    zPandasInterface.sortc                 K   s~   |j }|d u r| ||}| ||}t|tjr<|| }n
|j| }|rzt|dkrzt|jdkrz||jd j	 jd S |S )Nr   r   )
r   Zselect_maskindexedr.   r?   ZSeriesrl   r>   r"   r   )r   r   Zselection_maskZ	selectionr   r   r   r   r   select,  s    

zPandasInterface.selectc           	      C   s   |j |dd}|j|j }|r"|S |jjdkrbt|jdd rbdd |j D }tj	||jj
d}|spt|S t|dr|jS |S )	NTr   rc   rd   c                 S   s   g | ]}|j d dqS )Nre   )rp   )r$   dtr   r   r   r'   K  r(   z*PandasInterface.values.<locals>.<listcomp>)rf   rJ   )r   r   r   rf   rg   rn   r   ro   r/   r2   baser?   rW   hasattrrJ   )	r   r   r   rT   ZflatZcomputeZ
keep_indexr   Zdtsr   r   r   rJ   <  s    

zPandasInterface.valuesc           
      C   s   |j }d }|D ]l}d }t|r&|g}t|D ]4\}}|jd d |f |k}	|d u rZ|	}q.||	M }q.|d u rr|}q||O }q|| S r-   )r   r/   rX   	enumeraterl   )
r   r   Zsamplesr   r   sampleZsample_maskr:   r5   Zsubmaskr   r   r   r   R  s    

zPandasInterface.samplec                 C   s(   |j  }|j|vr$|||j| |S r-   )r   rF   r   rG   )r   r   rq   Zdim_posrJ   Zvdimr   r   r   r   add_dimensionf  s    

zPandasInterface.add_dimensionc                 C   s   |j jf i |S r-   )r   assign)r   r   Znew_datar   r   r   r   m  s    zPandasInterface.assignc                 C   s   t |jtr|jS | S dS )zw
        Returns the data of a Dataset as a dataframe avoiding copying
        if it already a dataframe type.
        N)r   	interfacer   r   dframe)r   r   r   r   r   	as_dframeq  s    zPandasInterface.as_dframec                 C   s   |r|j | S |j  S d S r-   )r   rF   )r   r   r]   r   r   r   r   }  s    
zPandasInterface.dframec                    s   |\}}d}t jj t|tr:dd  D | }n:t|r^t|}|j	g}nfdd|d D } fdd|D }t|r|g}|rjj
|d |d f S jj
||f S )NFc                 S   s   g | ]
}|j qS r   r|   r)   r   r   r   r'     r(   z(PandasInterface.iloc.<locals>.<listcomp>c                    s   g | ]}  |jqS r   r   r)   ry   r   r   r'     r(   r   c                    s   g | ]}  |qS r   )r   r#   r<   r   r   r'     r(   r   )r   r   r   r.   slicer]   r/   rX   r   r   rl   )r   r   r   Zrowsr\   Zscalarr   )r   r   r   rl     s    



zPandasInterface.iloc)T)NN)N)TTTF) rS   
__module____qualname__r?   r@   typesZdatatypeclassmethodr    rV   rX   r_   rQ   rv   rs   r   r   r   r   r/   nanr   r   rj   r   rJ   r   r   r   r   r   rl   r   r   r   r   r      sd   

n










    



r   )Z
__future__r   Zitertools.izipZiziprN   ImportErrorZnumpyr/   r   r?   r   r   r   rq   r   elementr	   r
   rI   Z	ndmappingr   r   r    r   r   r   registerr   r   r   r   <module>   s$      	