o
    hf                     @  s  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 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"  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l0m1Z1 d dl2m3Z3 d d l2m4Z4 d d!l2m5Z5 d d"l2m6Z6 d d#l2m7Z7 d d$lm8Z8 d d%lm9Z9 G d&d' d'e
d( ed( Z:dS ))    )annotationsN)TYPE_CHECKING)Any)Callable)Literal)Sequence)LazyExpr)DepthTrackingExprDaskExprDateTimeNamespaceDaskExprStringNamespace)add_row_indexmaybe_evaluate_expr)narwhals_to_native_dtype)ExprKind)!evaluate_output_names_and_aliases)native_to_narwhals_dtype)ColumnNotFoundErrorInvalidOperationError)Implementation)generate_temporary_column_name)not_implemented)Self)
AliasNames)	EvalNames)
EvalSeries)DaskLazyFrameDaskNamespace)ExprMetadata)DType)FillNullStrategy)NonNestedLiteral)NumericLiteral)RollingInterpolationMethod)TemporalLiteral)Version)_FullContextc                   @  s4  e Zd ZU ejZded< dddddZdddZdddZ	dd!d"Z
dd&d'Zed(d)dd/d0Zedd2d3Z	(	ddd8d9Zdd;d<Zdd>d?ZddBdCZddDdEZddFdGZddHdIZddJdKZddLdMZddNdOZddPdQZddRdSZddTdUZddVdWZddXdYZddZd[Zdd\d]Zdd_d`Z ddadbZ!ddcddZ"ddedfZ#ddgdhZ$ddidjZ%ddkdlZ&ddmdnZ'ddodpZ(ddqdrZ)ddsdtZ*ddvdwZ+ddxdyZ,ddzd{Z-dd}d~Z.dddZ/dddZ0dddZ1dddZ2dddZ3dddZ4dddZ5dddZ6dddZ7dddZ8dddZ9dddZ:dddZ;dddZ<dddZ=dddZ>dddZ?dddZ@dddZAdddZBdddZCdddZDdddZEdddZFdddÄZGdddńZHdddǄZIdddɄZJddd˄ZKddd̈́ZLdddӄZMdddׄZNdddلZOePddd܄ZQePddd߄ZReS ZTeS ZUeS ZVdS )DaskExprr   _implementationNcall_kwargscall$EvalSeries[DaskLazyFrame, dx.Series]depthintfunction_namestrevaluate_output_namesEvalNames[DaskLazyFrame]alias_output_namesAliasNames | Nonebackend_versiontuple[int, ...]versionr)   r.   dict[str, Any] | NonereturnNonec          	      C  s>   || _ || _|| _|| _|| _|| _|| _|pi | _d | _d S N)	_call_depth_function_name_evaluate_output_names_alias_output_names_backend_version_version_call_kwargs	_metadata)	selfr/   r1   r3   r5   r7   r9   r;   r.    rJ   G/var/www/vscode/kcb/lib/python3.10/site-packages/narwhals/_dask/expr.py__init__5   s   

zDaskExpr.__init__dfr   Sequence[dx.Series]c                 C  
   |  |S r?   )r@   )rI   rM   rJ   rJ   rK   __call__M   s   
zDaskExpr.__call__c                 C  s   d S r?   rJ   rI   rJ   rJ   rK   __narwhals_expr__P   s    zDaskExpr.__narwhals_expr__r!   c                 C  s   ddl m} || j| jdS )Nr   r    )r9   r;   )narwhals._dask.namespacer!   rE   rF   )rI   r!   rJ   rJ   rK   __narwhals_namespace__R   s   zDaskExpr.__narwhals_namespace__kind/Literal[ExprKind.AGGREGATION, ExprKind.LITERAL]r   c              
     s6   d fdd} j | j j j j j j jdS )	NrM   r   r=   list[dx.Series]c                   s   dd  | D S )Nc                 S  s   g | ]}|d  qS )r   rJ   ).0resultrJ   rJ   rK   
<listcomp>Z       z4DaskExpr.broadcast.<locals>.func.<locals>.<listcomp>rJ   rM   rQ   rJ   rK   funcY   s   z DaskExpr.broadcast.<locals>.funcr1   r3   r5   r7   r9   r;   r.   rM   r   r=   rW   )	__class__rA   rB   rC   rD   rE   rF   rG   )rI   rU   r]   rJ   rQ   rK   	broadcastX   s   zDaskExpr.broadcast )r3   cls
type[Self]evaluate_column_namescontextr*   c            	     s(   d	 fdd}| |d| d |j |jdS )
NrM   r   r=   rW   c              
     sZ   z fdd D W S  t y, } z fdd D }tj| jd|d }~ww )Nc                      g | ]} j | qS rJ   )_native_frame)rX   column_namer\   rJ   rK   rZ   r   s    z<DaskExpr.from_column_names.<locals>.func.<locals>.<listcomp>c                   s   g | ]	}| j vr|qS rJ   columns)rX   xr\   rJ   rK   rZ   w   s    )missing_columnsavailable_columns)KeyErrorr   'from_missing_and_available_column_namesrk   )rM   erm   re   r\   rK   r]   p   s    

z(DaskExpr.from_column_names.<locals>.funcr   r1   r3   r5   r7   r9   r;   r_   rE   rF   )rc   re   rf   r3   r]   rJ   rr   rK   from_column_namesg   s   	zDaskExpr.from_column_namescolumn_indicesc             	     s0   d fdd}| |dd fd	d
d |j |jdS )NrM   r   r=   rW   c                       fddD S )Nc                   s    g | ]} j jd d |f qS r?   )rh   iloc)rX   column_indexr\   rJ   rK   rZ      s    z>DaskExpr.from_column_indices.<locals>.func.<locals>.<listcomp>rJ   r\   rv   r\   rK   r]      s   
z*DaskExpr.from_column_indices.<locals>.funcr   nthc                   rw   )Nc                   rg   rJ   rj   )rX   ir\   rJ   rK   rZ      s    zBDaskExpr.from_column_indices.<locals>.<lambda>.<locals>.<listcomp>rJ   r\   rz   r\   rK   <lambda>   s    z.DaskExpr.from_column_indices.<locals>.<lambda>rs   r_   rt   )rc   rf   rv   r]   rJ   rz   rK   from_column_indices   s   
zDaskExpr.from_column_indices	expr_nameCallable[..., dx.Series]expressifiable_args
Self | Anyc             
     sF   d
 fdd}j |jd j d| jjjj|d	S )NrM   r   r=   rW   c                   sL   g }  } fdd D }|D ]}|fi |}|| q|S )Nc                   s   i | ]
\}}|t  |qS rJ   r   )rX   keyvaluer\   rJ   rK   
<dictcomp>   s    
z9DaskExpr._with_callable.<locals>.func.<locals>.<dictcomp>)r@   itemsappend)rM   native_resultsnative_series_listother_native_seriesnative_seriesresult_nativer/   r   rI   r\   rK   r]      s   

z%DaskExpr._with_callable.<locals>.func   z->r^   r_   )r`   rA   rB   rC   rD   rE   rF   )rI   r/   r   r.   r   r]   rJ   r   rK   _with_callable   s   	zDaskExpr._with_callabler]   c             
   C  s*   t | | j| j| j| j|| j| j| jdS )N)r/   r1   r3   r5   r7   r9   r;   r.   )typer@   rA   rB   rC   rE   rF   rG   rI   r]   rJ   rJ   rK   _with_alias_output_names   s   z!DaskExpr._with_alias_output_namesnamec              
     s6   d fdd}| j | j| j| j| j|| j| j| jdS )NnamesSequence[str]r=   c                   s$   t | dkrd|  }t| gS )Nr   z:Expected function with single output, found output names: )len
ValueError)r   msgr   rJ   rK   r7      s   
z*DaskExpr.alias.<locals>.alias_output_namesr^   )r   r   r=   r   )r`   r@   rA   rB   rC   rE   rF   rG   )rI   r   r7   rJ   r   rK   alias   s   zDaskExpr.aliasotherr   c                 C     | j dd d|dS )Nc                 S  rO   r?   )__add___inputr   rJ   rJ   rK   r}         
 z"DaskExpr.__add__.<locals>.<lambda>r   r   r   rI   r   rJ   rJ   rK   r         
zDaskExpr.__add__c                 C  r   )Nc                 S  rO   r?   )__sub__r   rJ   rJ   rK   r}      r   z"DaskExpr.__sub__.<locals>.<lambda>r   r   r   r   rJ   rJ   rK   r      r   zDaskExpr.__sub__c                 C     | j dd d|ddS )Nc                 S  s   ||  S r?   rJ   r   rJ   rJ   rK   r}          z#DaskExpr.__rsub__.<locals>.<lambda>__rsub__r   literalr   r   r   rJ   rJ   rK   r      
   
zDaskExpr.__rsub__c                 C  r   )Nc                 S  rO   r?   )__mul__r   rJ   rJ   rK   r}      r   z"DaskExpr.__mul__.<locals>.<lambda>r   r   r   r   rJ   rJ   rK   r      r   zDaskExpr.__mul__c                 C  r   )Nc                 S  rO   r?   )__truediv__r   rJ   rJ   rK   r}      r   z&DaskExpr.__truediv__.<locals>.<lambda>r   r   r   r   rJ   rJ   rK   r      r   zDaskExpr.__truediv__c                 C  r   )Nc                 S  s   ||  S r?   rJ   r   rJ   rJ   rK   r}      r   z'DaskExpr.__rtruediv__.<locals>.<lambda>__rtruediv__r   r   r   r   rJ   rJ   rK   r      r   zDaskExpr.__rtruediv__c                 C  r   )Nc                 S  rO   r?   )__floordiv__r   rJ   rJ   rK   r}      r   z'DaskExpr.__floordiv__.<locals>.<lambda>r   r   r   r   rJ   rJ   rK   r      r   zDaskExpr.__floordiv__c                 C  r   )Nc                 S  s   ||  S r?   rJ   r   rJ   rJ   rK   r}      r   z(DaskExpr.__rfloordiv__.<locals>.<lambda>__rfloordiv__r   r   r   r   rJ   rJ   rK   r      r   zDaskExpr.__rfloordiv__c                 C  r   )Nc                 S  rO   r?   )__pow__r   rJ   rJ   rK   r}     r   z"DaskExpr.__pow__.<locals>.<lambda>r   r   r   r   rJ   rJ   rK   r     r   zDaskExpr.__pow__c                 C  r   )Nc                 S  s   ||  S r?   rJ   r   rJ   rJ   rK   r}   	  r   z#DaskExpr.__rpow__.<locals>.<lambda>__rpow__r   r   r   r   rJ   rJ   rK   r     r   zDaskExpr.__rpow__c                 C  r   )Nc                 S  rO   r?   )__mod__r   rJ   rJ   rK   r}     r   z"DaskExpr.__mod__.<locals>.<lambda>r   r   r   r   rJ   rJ   rK   r     r   zDaskExpr.__mod__c                 C  r   )Nc                 S  s   ||  S r?   rJ   r   rJ   rJ   rK   r}     r   z#DaskExpr.__rmod__.<locals>.<lambda>__rmod__r   r   r   r   rJ   rJ   rK   r     r   zDaskExpr.__rmod__c                 C  r   )Nc                 S  rO   r?   )__eq__r   rJ   rJ   rK   r}     r   z!DaskExpr.__eq__.<locals>.<lambda>r   r   r   r   rJ   rJ   rK   r     r   zDaskExpr.__eq__c                 C  r   )Nc                 S  rO   r?   )__ne__r   rJ   rJ   rK   r}     r   z!DaskExpr.__ne__.<locals>.<lambda>r   r   r   r   rJ   rJ   rK   r     r   zDaskExpr.__ne__DaskExpr | Anyc                 C  r   )Nc                 S  rO   r?   )__ge__r   rJ   rJ   rK   r}   "  r   z!DaskExpr.__ge__.<locals>.<lambda>r   r   r   r   rJ   rJ   rK   r      r   zDaskExpr.__ge__c                 C  r   )Nc                 S  rO   r?   )__gt__r   rJ   rJ   rK   r}   '  r   z!DaskExpr.__gt__.<locals>.<lambda>r   r   r   r   rJ   rJ   rK   r   %  r   zDaskExpr.__gt__c                 C  r   )Nc                 S  rO   r?   )__le__r   rJ   rJ   rK   r}   ,  r   z!DaskExpr.__le__.<locals>.<lambda>r   r   r   r   rJ   rJ   rK   r   *  r   zDaskExpr.__le__c                 C  r   )Nc                 S  rO   r?   )__lt__r   rJ   rJ   rK   r}   1  r   z!DaskExpr.__lt__.<locals>.<lambda>r   r   r   r   rJ   rJ   rK   r   /  r   zDaskExpr.__lt__c                 C  r   )Nc                 S  rO   r?   )__and__r   rJ   rJ   rK   r}   6  r   z"DaskExpr.__and__.<locals>.<lambda>r   r   r   r   rJ   rJ   rK   r   4  r   zDaskExpr.__and__c                 C  r   )Nc                 S  rO   r?   )__or__r   rJ   rJ   rK   r}   ;  r   z!DaskExpr.__or__.<locals>.<lambda>r   r   r   r   rJ   rJ   rK   r   9  r   zDaskExpr.__or__c                 C     |  dd dS )Nc                 S     |   S r?   )
__invert__r   rJ   rJ   rK   r}   ?  r   z%DaskExpr.__invert__.<locals>.<lambda>r   r   rQ   rJ   rJ   rK   r   >     zDaskExpr.__invert__c                 C  r   )Nc                 S     |    S r?   )mean	to_seriesr   rJ   rJ   rK   r}   B      zDaskExpr.mean.<locals>.<lambda>r   r   rQ   rJ   rJ   rK   r   A  r   zDaskExpr.meanc                   s(   ddl m  d	 fdd}|dS )
Nr   r   s	dx.Seriesr=   c                   s2   t | jjtj}| sd} ||   S )Nz<`median` operation not supported for non-numeric input type.)r   dtyperF   r   DASK
is_numericmedian_approximater   )r   r   r   r   rI   rJ   rK   r]   G  s
   zDaskExpr.median.<locals>.funcmedian)r   r   r=   r   )narwhals.exceptionsr   r   r   rJ   r   rK   r   D  s   zDaskExpr.medianc                 C  r   )Nc                 S  r   r?   )minr   r   rJ   rJ   rK   r}   Q  r   zDaskExpr.min.<locals>.<lambda>r   r   rQ   rJ   rJ   rK   r   P  r   zDaskExpr.minc                 C  r   )Nc                 S  r   r?   )maxr   r   rJ   rJ   rK   r}   T  r   zDaskExpr.max.<locals>.<lambda>r   r   rQ   rJ   rJ   rK   r   S  r   zDaskExpr.maxddofc                      | j  fdddd idS )Nc                      | j  d S Nr   )stdr   r   r   rJ   rK   r}   X      zDaskExpr.std.<locals>.<lambda>r   r   r-   r   rI   r   rJ   r   rK   r   V  
   
zDaskExpr.stdc                   r   )Nc                   r   r   )varr   r   r   rJ   rK   r}   _  r   zDaskExpr.var.<locals>.<lambda>r   r   r-   r   r   rJ   r   rK   r   ]  r   zDaskExpr.varc                 C  r   )Nc                 S  r   r?   )skewr   r   rJ   rJ   rK   r}   e  r   zDaskExpr.skew.<locals>.<lambda>r   r   rQ   rJ   rJ   rK   r   d  r   zDaskExpr.skewnc                      |   fdddS )Nc                   
   |   S r?   )shiftr   r   rJ   rK   r}   h  r   z DaskExpr.shift.<locals>.<lambda>r   r   )rI   r   rJ   r   rK   r   g     zDaskExpr.shiftreverseboolc                C      |rd}t || dd dS )Nz:`cum_sum(reverse=True)` is not supported with Dask backendc                 S  r   r?   )cumsumr   rJ   rJ   rK   r}   p  r   z"DaskExpr.cum_sum.<locals>.<lambda>cum_sumNotImplementedErrorr   rI   r   r   rJ   rJ   rK   r   j  s   zDaskExpr.cum_sumc                C  r   )Nz<`cum_count(reverse=True)` is not supported with Dask backendc                 S  s   |    t S r?   )isnaastyper2   r   r   rJ   rJ   rK   r}   x  r[   z$DaskExpr.cum_count.<locals>.<lambda>	cum_countr   r   rJ   rJ   rK   r   r  s   zDaskExpr.cum_countc                C  r   )Nz:`cum_min(reverse=True)` is not supported with Dask backendc                 S  r   r?   )cumminr   rJ   rJ   rK   r}     r   z"DaskExpr.cum_min.<locals>.<lambda>cum_minr   r   rJ   rJ   rK   r   {     zDaskExpr.cum_minc                C  r   )Nz:`cum_max(reverse=True)` is not supported with Dask backendc                 S  r   r?   )cummaxr   rJ   rJ   rK   r}     r   z"DaskExpr.cum_max.<locals>.<lambda>cum_maxr   r   rJ   rJ   rK   r     r   zDaskExpr.cum_maxc                C  r   )Nz;`cum_prod(reverse=True)` is not supported with Dask backendc                 S  r   r?   )cumprodr   rJ   rJ   rK   r}     r   z#DaskExpr.cum_prod.<locals>.<lambda>cum_prodr   r   rJ   rJ   rK   r     r   zDaskExpr.cum_prodwindow_sizemin_samplescenterc                     |   fdddS )Nc                      | j  d S N)windowmin_periodsr   )rollingsumr   r   r   r   rJ   rK   r}         z&DaskExpr.rolling_sum.<locals>.<lambda>rolling_sumr   rI   r   r   r   rJ   r   rK   r       zDaskExpr.rolling_sumc                  r   )Nc                   r   r   )r   r   r   r   rJ   rK   r}     r   z'DaskExpr.rolling_mean.<locals>.<lambda>rolling_meanr   r  rJ   r   rK   r    r  zDaskExpr.rolling_meanc                  ,   |dkr|   fdddS d}t|)Nr   c                   r   r   )r   r   r   r   rJ   rK   r}     r   z&DaskExpr.rolling_var.<locals>.<lambda>rolling_varz5Dask backend only supports `ddof=1` for `rolling_var`r   r   rI   r   r   r   r   r   rJ   r   rK   r       zDaskExpr.rolling_varc                  r  )Nr   c                   r   r   )r   r   r   r   rJ   rK   r}     r   z&DaskExpr.rolling_std.<locals>.<lambda>rolling_stdz5Dask backend only supports `ddof=1` for `rolling_std`r  r  rJ   r   rK   r
    r	  zDaskExpr.rolling_stdc                 C  r   )Nc                 S  r   r?   )r   r   r   rJ   rJ   rK   r}     r   zDaskExpr.sum.<locals>.<lambda>r   r   rQ   rJ   rJ   rK   r     r   zDaskExpr.sumc                 C  r   )Nc                 S  r   r?   )countr   r   rJ   rJ   rK   r}     r   z DaskExpr.count.<locals>.<lambda>r  r   rQ   rJ   rJ   rK   r    r   zDaskExpr.countdecimalsc                   r   )Nc                   r   r?   )roundr   r  rJ   rK   r}     r   z DaskExpr.round.<locals>.<lambda>r  r   )rI   r  rJ   r  rK   r    r   zDaskExpr.roundc                 C  r   )Nc                 S  r   r?   )uniquer   rJ   rJ   rK   r}     r   z!DaskExpr.unique.<locals>.<lambda>r  r   rQ   rJ   rJ   rK   r    r   zDaskExpr.uniquec                 C  r   )Nc                 S  r   r?   dropnar   rJ   rJ   rK   r}     r   z%DaskExpr.drop_nulls.<locals>.<lambda>
drop_nullsr   rQ   rJ   rJ   rK   r    r   zDaskExpr.drop_nullsc                 C  r   )Nc                 S  r   r?   )absr   rJ   rJ   rK   r}     r   zDaskExpr.abs.<locals>.<lambda>r  r   rQ   rJ   rJ   rK   r    r   zDaskExpr.absc                 C  r   )Nc                 S  s   | j d ddd d S )NTF)axisskipnasplit_everyout)allr   r   rJ   rJ   rK   r}     s    zDaskExpr.all.<locals>.<lambda>r  r   rQ   rJ   rJ   rK   r    s   zDaskExpr.allc                 C  r   )Nc                 S  s   | j dddd S )Nr   TF)r  r  r  )anyr   r   rJ   rJ   rK   r}     r[   zDaskExpr.any.<locals>.<lambda>r  r   rQ   rJ   rJ   rK   r    s   zDaskExpr.anyr   Self | NonNestedLiteralstrategyFillNullStrategy | Nonelimit
int | Nonec                   s   d fdd}|  |dS )Nr   r   r=   c                   s:   d ur|  }|S dkr| j dn| j d}|S )Nforward)r  )fillnaffillbfill)r   res_serr  r  r   rJ   rK   r]     s   

z DaskExpr.fill_null.<locals>.funcr   r   r   r=   r   r   )rI   r   r  r  r]   rJ   r$  rK   	fill_null  s   zDaskExpr.fill_nulllower_bound.Self | NumericLiteral | TemporalLiteral | Noneupper_boundc                 C  s   | j dd d||dS )Nc                 S  s   | j ||dS )N)lowerupper)clip)r   r'  r)  rJ   rJ   rK   r}     s    zDaskExpr.clip.<locals>.<lambda>r,  )r'  r)  r   )rI   r'  r)  rJ   rJ   rK   r,    s   zDaskExpr.clipc                 C  r   )Nc                 S  r   r?   )diffr   rJ   rJ   rK   r}     r   zDaskExpr.diff.<locals>.<lambda>r-  r   rQ   rJ   rJ   rK   r-    r   zDaskExpr.diffc                 C  r   )Nc                 S  s   | j dd S )NFr  )nuniquer   r   rJ   rJ   rK   r}     r   z#DaskExpr.n_unique.<locals>.<lambda>n_uniquer   rQ   rJ   rJ   rK   r/        zDaskExpr.n_uniquec                 C  r   )Nc                 S  r   r?   )r   r   rJ   rJ   rK   r}     r   z"DaskExpr.is_null.<locals>.<lambda>is_nullr   rQ   rJ   rJ   rK   r1    r   zDaskExpr.is_nullc                      d fdd}  |dS )Nr   r   r=   c                   s6   t | j j j}| r| | kS d| d}t|)Nz4`.is_nan` only supported for numeric dtypes and not z, did you mean `.is_null`?)r   r   rF   r,   r   r   )r   r   r   rQ   rJ   rK   r]   	  s   zDaskExpr.is_nan.<locals>.funcr1  r%  r   r   rJ   rQ   rK   is_nan     	zDaskExpr.is_nanc                 C  r   )Nc                 S  s
   | j  S r?   )sizer   r   rJ   rJ   rK   r}     r   zDaskExpr.len.<locals>.<lambda>r   r   rQ   rJ   rJ   rK   r     r   zDaskExpr.lenquantilefloatinterpolationr'   c                 C  s.   |dkrddd}| j |d|d	S d
}t|)Nlinearr   r   r6  r7  r=   c                 S  s(   | j dkrd}t|| j|dd S )Nr   zK`Expr.quantile` is not supported for Dask backend with multiple partitions.dask)qmethod)npartitionsr   r6  r   )r   r6  r   rJ   rJ   rK   r]     s   
zDaskExpr.quantile.<locals>.func)r6  zx`higher`, `lower`, `midpoint`, `nearest` - interpolation methods are not supported by Dask. Please use `linear` instead.)r   r   r6  r7  r=   r   r  )rI   r6  r8  r]   r   rJ   rJ   rK   r6    s
   
zDaskExpr.quantilec                   r2  )Nr   r   r=   c                   P   | j }td|gd}t|  | j j}|||di| }|| |S )N   n_bytesrk   r   	r   r   r   to_framerE   r,   groupbyaggisin)r   _name	col_tokenframefirst_distinct_indexrQ   rJ   rK   r]   *     z(DaskExpr.is_first_distinct.<locals>.funcis_first_distinctr%  r   r   rJ   rQ   rK   rL  )  r4  zDaskExpr.is_first_distinctc                   r2  )Nr   r   r=   c                   r>  )Nr?  r@  r   rB  )r   rG  rH  rI  last_distinct_indexrQ   rJ   rK   r]   6  rK  z'DaskExpr.is_last_distinct.<locals>.funcis_last_distinctr%  r   r   rJ   rQ   rK   rN  5  r4  zDaskExpr.is_last_distinctc                 C  s   ddd}|  |dS )Nr   r   r=   c                 S  s*   | j }|  j|ddjd|tfddkS )NFr  r5  )metar   )r   rC  rD  	transformr2   )r   rG  rJ   rJ   rK   r]   B  s   
z DaskExpr.is_unique.<locals>.func	is_uniquer%  r   r   rJ   rJ   rK   rQ  A  s   
	zDaskExpr.is_uniquec                   r   )Nc                   r   r?   )rF  r   r   rJ   rK   r}   N  r   z DaskExpr.is_in.<locals>.<lambda>is_inr   r   rJ   r   rK   rR  M  r   zDaskExpr.is_inc                 C  r   )Nc                 S  s   |     S r?   )r   r   r   r   rJ   rJ   rK   r}   R  r   z%DaskExpr.null_count.<locals>.<lambda>
null_countr   rQ   rJ   rJ   rK   rS  P  r0  zDaskExpr.null_countpartition_byr   order_bySequence[str] | Nonec              	     s   ddl m} sd usJ dfdd}n9 s!d	}t||}z|j|  W n tyF   d
| dd|j d}t|d w d fdd}j|j	d j
d jjjjdS )Nr   )PandasLikeGroupByrM   r   r=   rN   c                   s   | j  dddS )NF)
descending
nulls_last)sortr\   )rU  rI   rJ   rK   r]   b  s   zDaskExpr.over.<locals>.funczOnly elementary expressions are supported for `.over` in dask.

Please see: https://narwhals-dev.github.io/narwhals/pandas_like_concepts/improve_group_by_operation/zUnsupported function: z- in `over` context.

Supported functions are z, 
c                   s   t | g \}}t D tjddtd | j}dkr;t|dkr+d}t||j	fi j
|d }n|t| j	fi j
}W d    n1 sSw   Y  | |jtt||dj  fd	d
|D S )Nignorez.*`meta` is not specified)messagecategoryr5  r   z)Safety check failed, please report a bug.r   rj   c                   s   g | ]} | qS rJ   rJ   )rX   r   result_framerJ   rK   rZ     r[   z/DaskExpr.over.<locals>.func.<locals>.<listcomp>)r   warningscatch_warningsfilterwarningsUserWarningnativerD  r   AssertionErrorrP  rG   rC  list_with_nativerenamedictzip)rM   output_namesaliasesgroupedr   
res_native)dask_function_namerT  rI   r_  rK   r]   w  s@   

r   z->overrs   rM   r   r=   rN   )narwhals._pandas_like.group_byrW  _is_elementaryr   
_leaf_name_REMAP_AGGSro   joinr`   rA   rB   rC   rD   rE   rF   )rI   rT  rU  rW  r]   r   r3   rJ   )rp  rU  rT  rI   rK   overU  s8   


zDaskExpr.overr   DType | type[DType]c                   s   d fdd} |dS )Nr   r   r=   c                   s   t  j}| |S r?   )r   rF   r   )r   native_dtyper   rI   rJ   rK   r]     s   
zDaskExpr.cast.<locals>.funccastr%  r   )rI   r   r]   rJ   rz  rK   r{    s   zDaskExpr.castc                 C  s   dd l m} | |jdS )Nr   	is_finite)
dask.arrayarrayr   isfinite)rI   darJ   rJ   rK   r|    s   zDaskExpr.is_finiter   c                 C     t | S r?   r   rQ   rJ   rJ   rK   r4        zDaskExpr.strr   c                 C  r  r?   r
   rQ   rJ   rJ   rK   dt  r  zDaskExpr.dt)r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r)   r.   r<   r=   r>   rq  )r=   r>   )r=   r!   )rU   rV   r=   r   )
rc   rd   re   r6   rf   r*   r3   r4   r=   r   )rc   rd   rv   r2   rf   r*   r=   r   )rb   N)
r   r4   r.   r<   r/   r   r   r   r=   r   )r]   r8   r=   r   )r   r4   r=   r   )r   r   r=   r   )r   r+   r=   r   )r   r   r=   r   )r=   r   )r   r2   r=   r   )r   r2   r=   r   )r   r   r=   r   )r   r2   r   r2   r   r   r=   r   )
r   r2   r   r2   r   r   r   r2   r=   r   )r  r2   r=   r   )r   r  r  r  r  r  r=   r   )r'  r(  r)  r(  r=   r   )r6  r7  r8  r'   r=   r   )rT  r   rU  rV  r=   r   )r   rx  r=   r   )r=   r   )r=   r   )W__name__
__module____qualname__r   r   r,   __annotations__rL   rP   rR   rT   ra   classmethodru   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/  r1  r3  r   r6  rL  rN  rQ  rR  rS  rw  r{  r|  propertyr4   r  r   rg  structrankrJ   rJ   rJ   rK   r+   /   s   
 



!
 
































	




























G

r+   )r   r   );
__future__r   ra  typingr   r   r   r   r   narwhals._compliantr   narwhals._compliant.exprr	   narwhals._dask.expr_dtr   narwhals._dask.expr_strr   narwhals._dask.utilsr   r   r   narwhals._expression_parsingr   r   narwhals._pandas_like.utilsr   r   r   r   narwhals.utilsr   r   r   dask.dataframe.dask_expr	dataframe	dask_exprdxtyping_extensionsr   narwhals._compliant.typingr   r   r   narwhals._dask.dataframer   rS   r!   r"   narwhals.dtypesr#   narwhals.typingr$   r%   r&   r'   r(   r)   r*   r+   rJ   rJ   rJ   rK   <module>   sX    
