a
    ~b1                     @   s   d dl mZ d dlZd dlZzd dlmZ W n ey>   Y n0 d dlm	Z	 d dl
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mZ d	dlmZ d	dlmZ G dd deZee dS )    )absolute_importN)product   )util)dimension_name)Element)	NdMapping
item_checksorted_context   )	DataError	Interface)PandasInterface)finite_rangec                   @   s   e Zd ZdZdZdZedd Zedd Zedd	 Z	ed
d Z
ed#ddZedd Zedd Zed$ddZedd Zedd Zedd Zedd Zeg dfdd Zed!d" ZdS )%cuDFInterfaceaw  
    The cuDFInterface allows a Dataset objects to wrap a cuDF
    DataFrame object. Using cuDF allows working with columnar
    data on a GPU. Most operations leave the data in GPU memory,
    however to plot the data it has to be loaded into memory.

    The cuDFInterface covers almost the complete API exposed
    by the PandasInterface with two notable exceptions:

    1) Aggregation and groupby do not have a consistent sort order
       (see https://github.com/rapidsai/cudf/issues/4237)
    3) Not all functions can be easily applied to a cuDF so
       some functions applied with aggregate and reduce will not work.
    ZcuDF c                 C   s
   dt jv S )Ncudf)sysmodules)clsr   r   7lib/python3.9/site-packages/holoviews/core/data/cudf.pyloaded,   s    zcuDFInterface.loadedc                 C   s&   |   sdS dd l}t||j|jfS )NFr   )r   r   
isinstance	DataFrameSeries)r   objr   r   r   r   applies0   s    zcuDFInterface.appliesc                    s  dd l }dd l}|j }|d }|d }	t||j|jfrD| }t||jspt	||\}}
}
|
|}t|j}t|}|jjg}|d gkrd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|D nrXd u rXfdd|D d | n|d u rt|d | d u rԇfd	d|||r|| nd  D n.g krԈd u rt|d |r|nd  D ]Bt|v rqtfd
d|D r| } qqtdd  D r>td| rtd }|jr|dkr||vr| }|d|tt|  D ]8 t  t fdd|D dkrtd  | q|di fS )Nr   kdimsvdimsindexr   c                    s   g | ]}| vr|qS r   r   .0cr   r   r   
<listcomp>U       z&cuDFInterface.init.<locals>.<listcomp>c                    s   g | ]}| vr|qS r   r   r    )r   r   r   r$   W   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!   name)kdr   r   	<genexpr>e   s   z%cuDFInterface.init.<locals>.<genexpr>c                 s   s   | ]}t |tjtfV  qd S N)r   npZint64intr&   r   r   r   r*   i   r%   zLcudf DataFrame column names used as dimensions must be strings not integers.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. )r   r   )r   pandasZparamZobjectsr   r   to_framer   r   initZfrom_pandaslistcolumnslenr   r(   Z_auto_indexable_1dZboundsr-   mindefaultr   anyreset_indexr   copyinsertr,   Zarange)r   Zeltypedatar   r   r   pdZelement_paramsZ
kdim_paramZ
vdim_param_r2   ZncolsZindex_namesndimZnvdimkdimr   )r'   r)   r   r   r   r0   7   st    




 

*


zcuDFInterface.initc                 C   sb   |j |dd}|j|j }|jd ur2| ||j}|jjdkrJtjtjfS t	||
 | S d S )NTstrictO)get_dimensionr:   r(   ZnodataZreplace_valueZdtypekindr,   ZNaNr   r4   max)r   dataset	dimensioncolumnr   r   r   range}   s    
zcuDFInterface.rangeTFc                 C   sn   |j |dd}|j|j }|s6| }|r0|jS |jS |r>|S |rH|jS z|jW S  tyh   |j Y S 0 d S )NTr?   )rB   r:   r(   uniquevalues_hostvalues	Exception)r   rE   dimZexpandedZflatZcompute
keep_indexr:   r   r   r   rK      s    zcuDFInterface.valuesc              	      sx   fddD fdd j D }i }|dkr6tn|}t|tr\|t  ||d< ||  j|d< t fddD  }g }	t	|D ]F}
 j
f i tt|
}t|sq||fi |}|	|
|f qt|trltd	f td	<  fd
d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 | ]}  |jqS r   rB   r(   r&   rE   r   r   r$      r%   z)cuDFInterface.groupby.<locals>.<listcomp>c                    s   g | ]}| vr|qS r   r   )r!   r>   
dimensionsr   r   r$      r%   rawr   rE   c                 3   s"   | ]} j d    jV  qdS )r   N)r:   rI   rJ   r&   rE   rR   r   r   r*      r%   z(cuDFInterface.groupby.<locals>.<genexpr>Fc                    s   g | ]}  |qS r   )rB   r&   rP   r   r   r$      r%   r#   )r   dict
issubclassr   updater   Zget_param_valuesrE   r   Zunique_iteratorselectzipr3   appendr   r	   r
   )r   rE   rR   Zcontainer_typeZ
group_typekwargsr   Zgroup_kwargskeysZgrouped_dataZ
unique_keyZ
group_datar   rT   r   groupby   s,    


\zcuDFInterface.groupbyc              	   C   s  d}|  D ]\}}t|tr(t| }| j||dd}t|rdtjrdzt|}W n   Y n0 g }t|trt	
 P t	dd |jdur||j|k |jdur|||jk  W d   n1 s0    Y  |sq|d }|dd D ]}	||	M }qntt|ttfr^|D ]}
|||
k q|s8q|d }|dd D ]}	||	O }qLnt|rr||}n||k}|du r|}q||M }q|S )a  
        Given a Dataset object and a dictionary with dimension keys and
        selection keys (i.e. tuple ranges, slices, sets, lists, or literals)
        return a boolean mask over the rows in the Dataset object that
        have been selected.
        NT)rN   ignorezinvalid value encounteredr   r   )itemsr   tupleslicerK   r   Z
isdatetimer;   Zparse_datetime_selectionwarningscatch_warningsfilterwarningsstartrZ   stopsetr1   callable)r   rE   	selectionmaskrM   ZselZarrZ	new_masksZnew_maskZimaskvr   r   r   select_mask   sL    



.



zcuDFInterface.select_maskNc                 K   sp   |j }|d u r| ||}| ||}|d ur8|j| }|rlt|dkrlt|jdkrl||jd j jd S |S )Nr   r   )r:   rl   indexedilocr3   r   r(   )r   rE   Zselection_maskri   dfrm   r   r   r   rX      s    
zcuDFInterface.selectc                 K   s   dd l }|j|fi |S )Nr   )r   concat)r   Z
dataframesr[   r   r   r   r   	concat_fn   s    zcuDFInterface.concat_fnc                 C   s"   |j  }|j|vr|||j< |S r+   )r:   r8   r(   )r   rE   rF   Zdim_posrK   Zvdimr:   r   r   r   add_dimension  s    


zcuDFInterface.add_dimensionc              	      sh  |j } fdd|jD }|jddd}|||  }|j}	t rddd}
|
|	|	}	|j|d	d
}t||	s|td|	 t	||	 
 }ndddd}
|
|	|	}	t||	std|	 t	||	 }	z$tdd t|	jj|	 D }W n4 ty    tdd t|	jj|	 D }Y n0 tjj|t|	jjd}g }|D ]}||jvrB|| qB||fS )Nc                    s   g | ]}| v r|j qS r   r(   r&   rQ   r   r   r$     r%   z+cuDFInterface.aggregate.<locals>.<listcomp>valuer(   )Zlabelr4   rD   )aminamaxF)sortz2%s aggregation is not supported on cudf DataFrame.count)ru   rv   sizec                 s   s   | ]\}}||gfV  qd S r+   r   r!   colrk   r   r   r   r*      r%   z*cuDFInterface.aggregate.<locals>.<genexpr>c                 s   s   | ]\}}||gfV  qd S r+   r   rz   r   r   r   r*   %  r%   r2   )r:   r   rR   __name__r3   getr]   hasattr
ValueErrorgetattrr7   rU   rY   r   rJ   Zto_numpyrL   Zto_arrayr   r;   r   r1   r2   rZ   )r   rE   rR   functionr[   r:   colsr   Z	reindexedZaggZagg_mapZgroupedro   ZdroppedZvdr   rQ   r   	aggregate  s6    


$&zcuDFInterface.aggregatec           	         s   dd l }|\}}d}tjj t|trBdd  D | }n:t|rft|}	|j
g}nfdd|d D } fdd|D }t|r|g}|rj|d  j|d  S jj||f }t||jrt|dkr||d }n
| j}|S )Nr   Fc                 S   s   g | ]
}|j qS r   rs   r&   r   r   r   r$   7  r%   z&cuDFInterface.iloc.<locals>.<listcomp>c                    s   g | ]}  |jqS r   rO   r&   rP   r   r   r$   <  r%   r   c                    s   g | ]}  |qS r   )r   r    r|   r   r   r$   =  r%   )r   r1   r:   r2   r   ra   rR   r,   ZisscalarrB   r(   rn   r   r3   r/   T)	r   rE   r   r   Zrowsr   ZscalarZ	col_indexresultr   )r2   rE   r   rn   /  s*    




zcuDFInterface.ilocc                    s$    fdd|D } j j|| dS )Nc                    s   g | ]} j |d djqS )Tr?   rO   r&   rP   r   r   r$   Q  r%   z&cuDFInterface.sort.<locals>.<listcomp>)byZ	ascending)r:   Zsort_values)r   rE   r   reverser   r   rP   r   rw   O  s    zcuDFInterface.sortc                 C   s    |r|j |  S |j  S d S r+   )r:   Z	to_pandas)r   rE   rR   r   r   r   dframeU  s    zcuDFInterface.dframe)TTTF)N)r}   
__module____qualname____doc__Zdatatypetypesclassmethodr   r   r0   rH   rK   r]   rl   rX   rq   rr   r   rn   rw   r   r   r   r   r   r      sB   


E
  
$
2


#
r   )Z
__future__r   r   rb   Zitertools.izipZiziprY   ImportError	itertoolsr   Znumpyr,    r   rF   r   elementr   Z	ndmappingr   r	   r
   Z	interfacer   r   r.   r   r   r   registerr   r   r   r   <module>   s&     G