o
    h?                     @  s  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 d dlmZ 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 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 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 d dlmZ erd dl m!Z! d dl"m	  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- d dl.m/Z/ d dlm0Z0 d dlm1Z1 d d lm2Z2 d d!lm3Z3 d d"lm4Z4 G d#d$ d$ed% Z5dS )&    )annotations)TYPE_CHECKING)Any)Iterator)Mapping)SequenceN)add_row_index)evaluate_exprs)native_to_narwhals_dtype)select_columns_by_name)CompliantDataFrame)CompliantLazyFrame)Implementation)_remap_full_join_keys)check_column_exists)check_column_names_are_unique)generate_temporary_column_name)not_implemented)parse_columns_to_drop)parse_version)validate_backend_version)
ModuleType)Self)TypeIs)DaskExprDaskLazyGroupByDaskNamespace)DType)AsofJoinStrategy)JoinStrategy)LazyUniqueKeepStrategy)Version)_FullContextc                   @  sX  e Zd Zdd	d
ZedddZedddZdddZdddZ	dddZ
dddZdd"d#Zdd%d&Zdd)d*Zdd/d0Zedd2d3Zdd5d6Zdd9d:Zdd;d<Zdd=d>ZddAdBZeddDdEZddFdGZddLdMZddOdPZddSdTZddWdXZdd[d\ZddadbZddidjZddpdqZ ddtduZ!ddvdwZ"ddydzZ#dddZ$e% Z&dS )DaskLazyFramenative_dataframedd.DataFramebackend_versiontuple[int, ...]versionr#   returnNonec                C  s8   || _ || _tj| _|| _d | _d | _t| j| j d S N)	_native_frame_backend_versionr   DASK_implementation_version_cached_schema_cached_columnsr   )selfr&   r(   r*    r6   L/var/www/vscode/kcb/lib/python3.10/site-packages/narwhals/_dask/dataframe.py__init__/   s   zDaskLazyFrame.__init__objdd.DataFrame | AnyTypeIs[dd.DataFrame]c                 C  s   t | tjS r-   )
isinstancedd	DataFrame)r9   r6   r6   r7   
_is_native>   s   zDaskLazyFrame._is_nativedatacontextr$   r   c               C  s   | ||j |jdS Nr(   r*   )r/   r2   )clsr@   rA   r6   r6   r7   from_nativeB   s   
zDaskLazyFrame.from_nativer   c                 C  s.   | j tju r| j  S dt| j  }t|)NzExpected dask, got: )r1   r   r0   to_native_namespacetypeAssertionError)r5   msgr6   r6   r7   __native_namespace__H   s   
z"DaskLazyFrame.__native_namespace__r   c                 C  s   ddl m} || j| jdS )Nr   r   rC   )narwhals._dask.namespacer   r/   r2   )r5   r   r6   r6   r7   __narwhals_namespace__O   s   z$DaskLazyFrame.__narwhals_namespace__c                 C  s   | S r-   r6   r5   r6   r6   r7   __narwhals_lazyframe__T   s   z$DaskLazyFrame.__narwhals_lazyframe__c                 C  s   | j | j| j|dS rB   )	__class__nativer/   )r5   r*   r6   r6   r7   _with_versionW      
zDaskLazyFrame._with_versiondfr   c                 C  s   | j || j| jdS rB   )rO   r/   r2   )r5   rS   r6   r6   r7   _with_native\   rR   zDaskLazyFrame._with_nativeIterator[dx.Series]c                 c  s     | j  D ]\}}|V  qd S r-   )rP   items)r5   _colserr6   r6   r7   _iter_columnsa   s   zDaskLazyFrame._iter_columnsexprsr   c                 G  s,   t | g|R  }| | jjdi t|S )Nr6   )r	   rT   rP   assigndict)r5   rZ   
new_seriesr6   r6   r7   with_columnse   s   zDaskLazyFrame.with_columnsbackendImplementation | Nonekwargs!CompliantDataFrame[Any, Any, Any]c           
      K  s   | j jd
i |}|d u s|tju r%ddlm} ||tjtt| jddS |tj	u rAdd l
}ddlm} |||t|| jdS |tju r_dd l}ddlm} ||j|t|| jddS d	| }	t|	)Nr   )PandasLikeDataFrameT)implementationr(   r*   validate_column_names)PolarsDataFramerC   )ArrowDataFrame)r(   r*   re   zUnsupported `backend` value: r6   )rP   computer   PANDASnarwhals._pandas_like.dataframerc   r   pdr2   POLARSpolarsnarwhals._polars.dataframerf   from_pandasPYARROWpyarrownarwhals._arrow.dataframerg   Table
ValueError)
r5   r_   ra   resultrc   plrf   parg   rI   r6   r6   r7   collecti   s:   



zDaskLazyFrame.collect	list[str]c                 C  s2   | j d u r| jd urt| jn| jj | _ | j S r-   )r4   r3   listschemarP   columnstolistrM   r6   r6   r7   r|      s   



zDaskLazyFrame.columns	predicatec                 C  s   || d }|  | jj| S )Nr   )rT   rP   loc)r5   r~   maskr6   r6   r7   filter   s   zDaskLazyFrame.filtercolumn_namesstrc                 G  s"   t | jt|| j| j}| |S r-   )r   rP   rz   r/   r1   rT   )r5   r   rP   r6   r6   r7   simple_select   s   
zDaskLazyFrame.simple_selectc                 G  s2   t | g|R  }tjdd |D dd}| |S )Nc                 S  s   g | ]	\}}| |qS r6   )rename).0namevalr6   r6   r7   
<listcomp>   s    z+DaskLazyFrame.aggregate.<locals>.<listcomp>   )axis)r	   r=   concatrT   r5   rZ   r]   rS   r6   r6   r7   	aggregate   s   
zDaskLazyFrame.aggregatec                 G  sH   t | g|R  }t| jjdi t|dd |D | j| j}| |S )Nc                 S  s   g | ]}|d  qS )r   r6   )r   sr6   r6   r7   r      s    z(DaskLazyFrame.select.<locals>.<listcomp>r6   )r	   r   rP   r[   r\   r/   r1   rT   r   r6   r6   r7   select   s   
zDaskLazyFrame.selectsubsetSequence[str] | Nonec                 C  s<   |d u r|  | j S |  }| ||j|   S r-   )rT   rP   dropnarL   r   any_horizontalcolis_null)r5   r   plxr6   r6   r7   
drop_nulls   s   zDaskLazyFrame.drop_nullsdict[str, DType]c                   s2   j d u rjj  fddjjD _ j S )Nc                   s"   i | ]}|t  | jjqS r6   )r
   r2   r1   )r   r   native_dtypesr5   r6   r7   
<dictcomp>   s    z(DaskLazyFrame.schema.<locals>.<dictcomp>)r3   rP   dtypesr|   rM   r6   r   r7   r{      s   
zDaskLazyFrame.schemac                 C  s   | j S r-   )r{   rM   r6   r6   r7   collect_schema   s   zDaskLazyFrame.collect_schemar|   Sequence[str]strictboolc                C  s"   t | ||d}| | jj|dS )N)compliant_framer|   r   r|   )r   rT   rP   drop)r5   r|   r   to_dropr6   r6   r7   r      s   zDaskLazyFrame.dropr   c                 C  s   |  t| j|| j| jS r-   )rT   r   rP   r/   r1   )r5   r   r6   r6   r7   with_row_index   s   zDaskLazyFrame.with_row_indexmappingMapping[str, str]c                 C  s   |  | jj|dS )Nr   )rT   rP   r   )r5   r   r6   r6   r7   r      s   zDaskLazyFrame.renamenintc                 C  s   |  | jj|dddS )NF)r   rh   npartitions)rT   rP   head)r5   r   r6   r6   r7   r      s   zDaskLazyFrame.headkeepr"   c                C  s   t | j| |dkr8|p| j}td|d}| j| |}||dk }| j|d}| jj	||dd}ndd	i
||}| jj||d
}| |S )Nnone   n_bytesr|   r   r   inner)onhowanyfirst)r   r   )r   r|   r   rP   groupbysizer   reset_indexr   mergegetdrop_duplicatesrT   )r5   r   r   tokenrX   uniqueru   mapped_keepr6   r6   r7   r      s   

zDaskLazyFrame.uniqueby
descendingbool | Sequence[bool]
nulls_lastc                G  sH   t |tr	| }ndd |D }|rdnd}| | jjt|||dS )Nc                 S  s   g | ]}| qS r6   r6   )r   dr6   r6   r7   r      s    z&DaskLazyFrame.sort.<locals>.<listcomp>lastr   )	ascendingna_position)r<   r   rT   rP   sort_valuesrz   )r5   r   r   r   r   positionr6   r6   r7   sort   s   
zDaskLazyFrame.sortotherr   r!   left_onright_onsuffixc             	   C  s  |dkr5t dg | j|jd}| | jjdi |dij|jjdi |did||d|fdj|dS |d	krt dg | j|jd}|d u rOd
}t|t|jt	|| j
| jjtt||d }	| jj|	d|||d}
| |
|
| dk j|gdS |dkr|d u rd}t|t|jt	|| j
| jjtt||d }	| | jj|	d||dS |dkr| jj|jd||d|fd}g }t||D ]\}}||kr|| jvr|| q||kr|| d q| |j|dS |dkr0|d usJ |d usJ t|||}|jj|d}	t|	j t	| }| | jj|	||dd|fdS | | jj|j|||d|fdS )Ncrossr   r   r   r    )r   r   r   suffixesr   antiz(`right_on` cannot be `None` in anti-joinouter)r   	indicatorr   r   	left_onlysemiz(`right_on` cannot be `None` in semi-join)r   r   r   left_rightfull)r   r   r   r   r6   )r   r|   rT   rP   r[   r   r   	TypeErrorr   rz   r/   r1   r   r\   zipr   appendr   r   values)r5   r   r   r   r   r   	key_tokenindicator_tokenrI   other_nativerS   result_nativeextraleft_key	right_keyright_on_mapperr6   r6   r7   join  s   			


zDaskLazyFrame.join
str | Noneby_leftby_rightstrategyr    c          	      C  s0   |   }| |j| j|j|||||d|fdS )Nr   )r   r   left_byright_by	directionr   )rJ   rT   
merge_asofrP   )	r5   r   r   r   r   r   r   r   r   r6   r6   r7   	join_asof  s   zDaskLazyFrame.join_asofdrop_null_keysr   c                G  s   ddl m} || ||dS )Nr   r   )r   )narwhals._dask.group_byr   )r5   r   r   r   r6   r6   r7   group_by  s   zDaskLazyFrame.group_byc                 C  s6   | j }|j}|dkr| | j j|ddS d}t|)Nr   F)r   rh   zL`LazyFrame.tail` is not supported for Dask backend with multiple partitions.)rP   r   rT   tailNotImplementedError)r5   r   native_framen_partitionsrI   r6   r6   r7   r     s   zDaskLazyFrame.tailoffsetc                 C  sR   t d| jd}|  }| ||||k||| | dk@ j|gddS )Nr   r   r   F)r   )r   r|   rL   r   r   r   r   )r5   r   r   row_index_tokenr   r6   r6   r7   gather_every  s   zDaskLazyFrame.gather_everyr   indexvariable_name
value_namec                 C  s   |  | jj||||dS )N)id_vars
value_varsvar_namer   )rT   rP   melt)r5   r   r   r   r   r6   r6   r7   unpivot  s   zDaskLazyFrame.unpivotN)r&   r'   r(   r)   r*   r#   r+   r,   )r9   r:   r+   r;   )r@   r'   rA   r$   r+   r   )r+   r   )r+   r   )r+   r   )r*   r#   r+   r   )rS   r   r+   r   )r+   rU   )rZ   r   r+   r   )r_   r`   ra   r   r+   rb   )r+   ry   )r~   r   r+   r   )r   r   r+   r   )r   r   r+   r   )r+   r   )r|   r   r   r   r+   r   )r   r   r+   r   )r   r   r+   r   )r   r   r+   r   )r   r   r   r"   r+   r   )r   r   r   r   r   r   r+   r   )r   r   r   r!   r   r   r   r   r   r   r+   r   )r   r   r   r   r   r   r   r   r   r   r   r    r   r   r+   r   )r   r   r   r   r+   r   )r   r   r   r   r+   r   )
r   r   r   r   r   r   r   r   r+   r   )'__name__
__module____qualname__r8   staticmethodr?   classmethodrE   rJ   rL   rN   rQ   rT   rY   r^   rx   propertyr|   r   r   r   r   r   r{   r   r   r   r   r   r   r   r   r   r   r   r   r  r   exploder6   r6   r6   r7   r%   .   sJ    








,
	



















r%   )r   r'   )6
__future__r   typingr   r   r   r   r   dask.dataframe	dataframer=   pandasrk   narwhals._dask.utilsr   r	   narwhals._pandas_like.utilsr
   r   narwhals.typingr   r   narwhals.utilsr   r   r   r   r   r   r   r   r   typesr   dask.dataframe.dask_expr	dask_exprdxtyping_extensionsr   r   narwhals._dask.exprr   r   r   rK   r   narwhals.dtypesr   r    r!   r"   r#   r$   r%   r6   r6   r6   r7   <module>   sL    