
    }ioh                       d dl mZ d dlZd dlmZmZmZm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mZmZmZ d dlmZmZ d d	lmZ d d
lmZmZ d dlmZm Z m!Z!m"Z" d dl#m$Z$ erGd dl%m&Z& d dl'm(c m)Z* d dl+m,Z, d dl-m.Z.m/Z/m0Z0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7 d dlm8Z8m9Z9 d dl:m;Z;m<Z<m=Z=m>Z> d"dZ?d"dZ@d"dZAd#dZB G d d ed!         ed!                   ZCdS )$    )annotationsN)TYPE_CHECKINGAnyCallablecast)DepthTrackingExprLazyExprDaskExprDateTimeNamespaceDaskExprStringNamespace)add_row_indexalign_series_full_broadcastmake_group_by_kwargsnarwhals_to_native_dtype)evaluate_nodes!evaluate_output_names_and_aliases)"window_kwargs_to_pandas_equivalent)get_dtype_backendnative_to_narwhals_dtype)Implementationgenerate_temporary_column_name
no_defaultnot_implementedInvalidOperationError)Sequence)Self)
AliasNames	EvalNames
EvalSeriesNarwhalsAggregation)DaskLazyFrameDaskNamespace)	NoDefault)Version_LimitedContext)FillNullStrategy	IntoDTypeModeKeepStrategyRollingInterpolationMethodattrstrreturnr   c                      fdS )Nc                8    |                      fd          S )Nc                T     t          |           di                                 S N )getattr	to_seriesexprr-   kwargss    G/home/jrussi/.local/lib/python3.11/site-packages/narwhals/_dask/expr.py<lambda>z6simple_aggregation.<locals>.<lambda>.<locals>.<lambda>7   s.    (WT4((22622<<>>     _with_callableselfr9   r-   s    `r:   r;   z$simple_aggregation.<locals>.<lambda>6   s'    $"5"5>>>>># # r<   r4   r-   s   `r:   simple_aggregationrB   4           r<   c                      fdS )Nc                8    |                      fd          S )Nc                0     t          |           di S r3   r5   r7   s    r:   r;   z1simple_method.<locals>.<lambda>.<locals>.<lambda>>   s"    (WT4((22622 r<   r=   r?   s    `r:   r;   zsimple_method.<locals>.<lambda>=   s'    $"5"522222# # r<   r4   rA   s   `r:   simple_methodrH   ;   rC   r<   c                      fdS )Nc                0    |                      |          S N)
_binary_op)r@   otherr-   s     r:   r;   zsimple_binary.<locals>.<lambda>D   s    ttU;; r<   r4   rA   s   `r:   simple_binaryrN   B   s    ;;;;;r<   opCallable[..., dx.Series]c                      fdS )Nc                0    |                      |          S rK   )_reverse_binary_op)r@   rM   rO   s     r:   r;   z&trivial_binary_right.<locals>.<lambda>I   s    t66r5AA r<   r4   )rO   s   `r:   trivial_binary_rightrT   G   s    AAAAAr<   c                     e Zd ZU ej        Zded<    ed          Z ed          Z	 ed          Z
 ed          Z ed          Z ed          Z ed	          Z ed
          Z ed          Z ed          Z ed          Z ed          Z ed          Z ed          Z ed           Z ed           Z ed           Z ed           Z ed          Z ed          Z ed          Z ed          Z ed          Z  ed          Z! ed          Z" ed          Z# ed          Z$ ed          Z% ed          Z& e'd           Z( e'd!          Z) e'd"          Z* e'd#          Z+ e'd$          Z, e'd%          Z- e'd&          Z.dd1Z/dd5Z0dd7Z1dd9Z2e3dd?            Z4e3ddB            Z5ddEZ6ddGZ7ddKZ8ddNZ9ddPZ:ddQZ;ddRZ<ddSZ=ddUZ>ddXZ?ddYZ@ddZZAdd[ZBdd\ZCdd`ZDddaZEddcZFdddZGddeZHddfZIddiZJddoZKddrZLddsZMddtZNdduZOddvZPddwZQdd|ZRdd}ZSdd~ZTddZUddZVddZWddZXddZYddZZddZ[ddZ\ddZ]ddZ^ddZ_ddZ`ddZaddZbecdd            Zdecdd            Ze ef            Zg ef            Zh ef            Zi ef            Zj ef            Zk ef            Zlded<    ef            Zmded<   dS )DaskExprr   _implementation__add____sub____mul____truediv____pow____mod____eq____ne____gt____ge____lt____le____and____or__c                    | |z
  S rK   r4   xys     r:   r;   zDaskExpr.<lambda>b   
    Q r<   c                    | |z  S rK   r4   rg   s     r:   r;   zDaskExpr.<lambda>c   s
    QU r<   c                    | |z  S rK   r4   rg   s     r:   r;   zDaskExpr.<lambda>d   s
    A r<   c                    | |z  S rK   r4   rg   s     r:   r;   zDaskExpr.<lambda>e   rj   r<   allanycountkurtosismaxmeanminskewstdsumvar
__invert__absdiffdropnaisnarounduniquecall$EvalSeries[DaskLazyFrame, dx.Series]evaluate_output_namesEvalNames[DaskLazyFrame]alias_output_namesAliasNames | Noneversionr'   r/   Nonec               >    || _         || _        || _        || _        d S rK   )_call_evaluate_output_names_alias_output_names_version)r@   r   r   r   r   s        r:   __init__zDaskExpr.__init__y   s&     
&;##5 r<   dfr#   Sequence[dx.Series]c                ,    |                      |          S rK   )r   )r@   r   s     r:   __call__zDaskExpr.__call__   s    zz"~~r<   r%   c                0    ddl m}  || j                  S )Nr   r$   )r   )narwhals._dask.namespacer%   r   )r@   r%   s     r:   __narwhals_namespace__zDaskExpr.__narwhals_namespace__   s)    ::::::}T]3333r<   r   c                `     d fd}                      | j         j         j                  S )Nr   r#   r/   list[dx.Series]c                .    d  |           D             S )Nc                4    g | ]}|j         d          d          S )r   )loc).0results     r:   
<listcomp>z4DaskExpr.broadcast.<locals>.func.<locals>.<listcomp>   s#    <<<FJqM!$<<<r<   r4   )r   r@   s    r:   funcz DaskExpr.broadcast.<locals>.func   s!     =<4488<<<<r<   r   r   r   r   r#   r/   r   	__class__r   r   r   r@   r   s   ` r:   	broadcastzDaskExpr.broadcast   sR    	= 	= 	= 	= 	= 	=
 ~~"&"=#7M	  
 
 	
r<   cls
type[Self]evaluate_column_namescontextr(   c              8    dfd} | |d |j                   S )Nr   r#   r/   r   c                     	  fd            D             S # t           $ r)}                                           x}r|| d }~ww xY w)Nc                *    g | ]}j         |         S r4   )_native_frame)r   column_namer   s     r:   r   z<DaskExpr.from_column_names.<locals>.func.<locals>.<listcomp>   s1       # $[1  r<   )KeyError_check_columns_exist)r   eerrorr   s   `  r:   r   z(DaskExpr.from_column_names.<locals>.func   s       '<'<R'@'@       334I4I"4M4MNNN5 'Q&s    
A$A		Ar   r   )r   )r   r   r   r   s    `  r:   from_column_nameszDaskExpr.from_column_names   sK    		 		 		 		 		 		 s"7#$	
 
 
 	
r<   column_indicesintc               ^    dfd} | ||                                d |j                  S )Nr   r#   r/   r   c                "      fdD             S )Nc                <    g | ]}j         j        d d |f         S rK   )nativeiloc)r   ir   s     r:   r   z>DaskExpr.from_column_indices.<locals>.func.<locals>.<listcomp>   s*    AAAQBIN111a4(AAAr<   r4   )r   r   s   `r:   r   z*DaskExpr.from_column_indices.<locals>.func   s    AAAA.AAAAr<   r   r   )_eval_names_indicesr   )r   r   r   r   s     ` r:   from_column_indiceszDaskExpr.from_column_indices   s_    	B 	B 	B 	B 	B 	B s"%"9"9."I"I#$	
 
 
 	
r<   rP   expressifiable_argsc               h     d fd}                      | j         j         j                  S )Nr   r#   r/   r   c                     g }                                } fd                                D             }|D ] } |fi |}|                    |           !|S )Nc                B    i | ]\  }}|                     |          S r4   _evaluate_single_output_expr)r   keyvaluer   s      r:   
<dictcomp>z9DaskExpr._with_callable.<locals>.func.<locals>.<dictcomp>   s=     # # #C R44U;;# # #r<   )r   itemsappend)	r   native_resultsnative_series_listother_native_seriesnative_seriesresult_nativer   r   r@   s	   `     r:   r   z%DaskExpr._with_callable.<locals>.func   s    .0N!%B# # # #"5";";"="=# # # "4 5 5 $] J J6I J J%%m4444!!r<   r   r   r   )r@   r   r   r   s   ``` r:   r>   zDaskExpr._with_callable   s^    
	" 
	" 
	" 
	" 
	" 
	" 
	" 
	" ~~"&"=#7M	  
 
 	
r<   r   c                   | j         d n	nfd} t          |           | j        | j        || j                  S )Nc                ,      |                     S rK   r4   )output_namescurrent_alias_output_namesr   s    r:   r;   z3DaskExpr._with_alias_output_names.<locals>.<lambda>   s    dd+E+El+S+S&T&T r<   )r   r   r   r   )r   typer   r   r   )r@   r   r   r   s    ` @r:   _with_alias_output_namesz!DaskExpr._with_alias_output_names   sr    %)%=" | D *1 TTTTT 	 tDzz"&"=1M	
 
 
 	
r<   %Callable[[dx.Series, Any], dx.Series]rM   r   c                0    |                      ||          S )N)rM   r=   )r@   r   rM   s      r:   _with_binaryzDaskExpr._with_binary   s     ""4u"555r<   op_namer.   c                6    |                      fd|          S )Nc                6     t          |           |          S rK   rG   )r8   rM   r   s     r:   r;   z%DaskExpr._binary_op.<locals>.<lambda>   s    5KWT75K5KE5R5R r<   )r   )r@   r   rM   s    ` r:   rL   zDaskExpr._binary_op   s$      !R!R!R!RTYZZZr<   operator_funcc                \    |                      fd|                              d          S )Nc                     ||           S rK   r4   )r8   rM   r   s     r:   r;   z-DaskExpr._reverse_binary_op.<locals>.<lambda>   s    eT : : r<   literal)r   alias)r@   r   rM   s    ` r:   rS   zDaskExpr._reverse_binary_op   s8       ::::E
 

%	

	r<   c                p     ddd fd	}                      | j         j         j        
          S )Nr   r#   series	dx.SeriesrM   r/   c                    t          | ||          \  }}|                    |                              |dk    d           S Nr   r   __floordiv__wherer   r   rM   s      r:   	_floordivz(DaskExpr.__floordiv__.<locals>._floordiv   sA     8FEJJMFE''..55eqj$GGGr<   r   c                d                                      fd            D             S )Nc                *    g | ]} |          S r4   r4   )r   r   r   r   other_seriess     r:   r   z7DaskExpr.__floordiv__.<locals>.func.<locals>.<listcomp>  s'    OOOFIIb&,77OOOr<   r   )r   r   r   rM   r@   s   `@r:   r   z#DaskExpr.__floordiv__.<locals>.func  s@    ::5AALOOOOOOdd2hhOOOOr<   r   r   r#   r   r   rM   r   r/   r   r   r   )r@   rM   r   r   s   `` @r:   r   zDaskExpr.__floordiv__   s~    	H 	H 	H 	H	P 	P 	P 	P 	P 	P 	P 	P ~~"&"=#7M	  
 
 	
r<   c                     ddd fd	}                      | j         j         j        
                              d          S )Nr   r#   r   r   rM   r/   c                    t          | ||          \  }}|                    |                              |dk    d           S r   r   r   s      r:   
_rfloordivz*DaskExpr.__rfloordiv__.<locals>._rfloordiv  sA     8FEJJMFE&&v..55fk4HHHr<   r   c                d                                      fd            D             S )Nc                *    g | ]} |          S r4   r4   )r   r   r   r   other_natives     r:   r   z8DaskExpr.__rfloordiv__.<locals>.func.<locals>.<listcomp>  s'    PPPVJJr6<88PPPr<   r   )r   r   r   rM   r@   s   `@r:   r   z$DaskExpr.__rfloordiv__.<locals>.func  s@    ::5AALPPPPPPttBxxPPPPr<   r   r   r   r   )r   r   r   r   r   )r@   rM   r   r   s   `` @r:   __rfloordiv__zDaskExpr.__rfloordiv__  s    	I 	I 	I 	I	Q 	Q 	Q 	Q 	Q 	Q 	Q 	Q ~~"&"=#7M	  
 

 %	

	r<   c                J     ddl m d fd}                     |          S )Nr   r   sr   r/   c                    t          | j        j        t          j                  }|                                sd} |          |                                                                 S )Nz<`median` operation not supported for non-numeric input type.)r   dtyper   r   DASK
is_numericmedian_approximater6   )r   r   msgr   r@   s      r:   r   zDaskExpr.median.<locals>.func!  sc    ,QWdm^EXYYE##%% 1T++C000''))33555r<   )r   r   r/   r   )narwhals.exceptionsr   r>   )r@   r   r   s   ` @r:   medianzDaskExpr.median  sO    ======	6 	6 	6 	6 	6 	6 	6 ""4(((r<   nc                4    |                      fd          S )Nc                .    |                                S rK   )shift)r8   r   s    r:   r;   z DaskExpr.shift.<locals>.<lambda>+  s    

1 r<   r=   )r@   r   s    `r:   r   zDaskExpr.shift*  s!    ""#=#=#=#=>>>r<   reverseboolc               T    |rd}t          |          |                     d           S )Nz:`cum_sum(reverse=True)` is not supported with Dask backendc                *    |                                  S rK   )cumsumr8   s    r:   r;   z"DaskExpr.cum_sum.<locals>.<lambda>3       r<   NotImplementedErrorr>   r@   r   r   s      r:   cum_sumzDaskExpr.cum_sum-  s5     	+NC%c***""#=#=>>>r<   c               T    |rd}t          |          |                     d           S )Nz<`cum_count(reverse=True)` is not supported with Dask backendc                    |                                                       t                                                    S rK   )r}   astyper   r  r  s    r:   r;   z$DaskExpr.cum_count.<locals>.<lambda>:  s*    $))++0E0Ec0J0J0Q0Q0S0S r<   r  r	  s      r:   	cum_countzDaskExpr.cum_count5  s5     	+PC%c***""#S#STTTr<   c               T    |rd}t          |          |                     d           S )Nz:`cum_min(reverse=True)` is not supported with Dask backendc                *    |                                  S rK   )cumminr  s    r:   r;   z"DaskExpr.cum_min.<locals>.<lambda>A  r  r<   r  r	  s      r:   cum_minzDaskExpr.cum_min<  5     	+NC%c***""#=#=>>>r<   c               T    |rd}t          |          |                     d           S )Nz:`cum_max(reverse=True)` is not supported with Dask backendc                *    |                                  S rK   )cummaxr  s    r:   r;   z"DaskExpr.cum_max.<locals>.<lambda>H  r  r<   r  r	  s      r:   cum_maxzDaskExpr.cum_maxC  r  r<   c               T    |rd}t          |          |                     d           S )Nz;`cum_prod(reverse=True)` is not supported with Dask backendc                *    |                                  S rK   )cumprodr  s    r:   r;   z#DaskExpr.cum_prod.<locals>.<lambda>O  s     r<   r  r	  s      r:   cum_prodzDaskExpr.cum_prodJ  s5     	+OC%c***""#>#>???r<   window_sizemin_samplescenterc               <    |                      fd          S )Nc                X    |                                                                S N)windowmin_periodsr  )rollingrw   r8   r  r  r  s    r:   r;   z&DaskExpr.rolling_sum.<locals>.<lambda>S  s-    "F &  cee r<   r=   r@   r  r  r  s    ```r:   rolling_sumzDaskExpr.rolling_sumQ  s;    ""     
 
 	
r<   c               <    |                      fd          S )Nc                X    |                                                                S r!  )r$  rs   r%  s    r:   r;   z'DaskExpr.rolling_mean.<locals>.<lambda>Z  s-    "F &  dff r<   r=   r&  s    ```r:   rolling_meanzDaskExpr.rolling_meanX  s;    ""     
 
 	
r<   ddofc               j    |dk    r|                      fd          S d}t          |          )N   c                X    |                                                                S r!  )r$  rx   r%  s    r:   r;   z&DaskExpr.rolling_var.<locals>.<lambda>d  -    T\\&K *  #%% r<   z5Dask backend only supports `ddof=1` for `rolling_var`r>   r  r@   r  r  r  r+  r   s    ```  r:   rolling_varzDaskExpr.rolling_var_  \     199&&       
 F!#&&&r<   c               j    |dk    r|                      fd          S d}t          |          )Nr-  c                X    |                                                                S r!  )r$  rv   r%  s    r:   r;   z&DaskExpr.rolling_std.<locals>.<lambda>p  r/  r<   z5Dask backend only supports `ddof=1` for `rolling_std`r0  r1  s    ```  r:   rolling_stdzDaskExpr.rolling_stdk  r3  r<   c                B    dd l m} |                     |j                  S r   )
dask.arrayarrayr>   floorr@   das     r:   r:  zDaskExpr.floorw  s*    ""28,,,r<   c                B    dd l m} |                     |j                  S r   )r8  r9  r>   ceilr;  s     r:   r>  zDaskExpr.ceil|  *    ""27+++r<   r   float | Nonec                     |t           j        n||t          d          n|d fd}                     |          S )Nnanr8   r   r/   c                    t          d| | k              }|                    d          }t          | j        j                  rn}|                     ||          S )Nr   F)r   fillnar   r   rW   mask)r8   rE  fillr@   value_nullablevalue_numpys      r:   r   zDaskExpr.fill_nan.<locals>.func  sb    TT\22D;;u%%D %TZ1EFF!  
 99T4(((r<   r8   r   r/   r   )pdNAfloatr>   )r@   r   r   rG  rH  s   `  @@r:   fill_nanzDaskExpr.fill_nan  se    "'-U&+meElll		) 		) 		) 		) 		) 		) 		) 		) ""4(((r<   Self | NonestrategyFillNullStrategy | Nonelimit
int | Nonec                B    dfd}|                      |          S )Nr8   r   r/   c                    |                                }n2dk    r|                               n|                               }|S )Nforward)rQ  )rD  ffillbfill)r8   res_serrQ  rO  r   s     r:   r   z DaskExpr.fill_null.<locals>.func  s\     ++e,,  9,, JJUJ+++%00 
 Nr<   rI  r=   )r@   r   rO  rQ  r   s    ``` r:   	fill_nullzDaskExpr.fill_null  sC    		 		 		 		 		 		 		 		 ""4(((r<   lower_boundupper_boundc                4    |                      d ||          S )Nc                0    |                      ||          S )N)lowerupperclip)r8   rZ  r[  s      r:   r;   zDaskExpr.clip.<locals>.<lambda>  s    499! 4= 4 4 r<   )rZ  r[  r=   )r@   rZ  r[  s      r:   ra  zDaskExpr.clip  s1    ""  $# # 
 
 	
r<   c                2    |                      d |          S )Nc                .    |                      |          S )N)r^  r`  )r8   rZ  s     r:   r;   z%DaskExpr.clip_lower.<locals>.<lambda>      diiki&B&B r<   )rZ  r=   )r@   rZ  s     r:   
clip_lowerzDaskExpr.clip_lower  (    ""BB# # 
 
 	
r<   c                2    |                      d |          S )Nc                .    |                      |          S )N)r_  r`  )r8   r[  s     r:   r;   z%DaskExpr.clip_upper.<locals>.<lambda>  rd  r<   )r[  r=   )r@   r[  s     r:   
clip_upperzDaskExpr.clip_upper  rf  r<   c                .    |                      d           S )Nc                R    |                      d                                          S )NF)r|   )nuniquer6   r  s    r:   r;   z#DaskExpr.n_unique.<locals>.<lambda>  s     E0J0J0T0T0V0V r<   r=   r@   s    r:   n_uniquezDaskExpr.n_unique  s    ""#V#VWWWr<   c                :     d fd}                      |          S )Nr8   r   r/   c                    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   r   rW   r   r   )r8   r   r   r@   s      r:   r   zDaskExpr.is_nan.<locals>.func  s^    ,
DM4+? E !! $t|#jjjjC',,,r<   rI  r=   r   s   ` r:   is_nanzDaskExpr.is_nan  s7    	- 	- 	- 	- 	- 	- ""4(((r<   c                .    |                      d           S )Nc                4    | j                                         S rK   )sizer6   r  s    r:   r;   zDaskExpr.len.<locals>.<lambda>  s    	0C0C0E0E r<   r=   rm  s    r:   lenzDaskExpr.len  s    ""#E#EFFFr<   quantilerL  interpolationr,   c                h    |dk    rdfd}|                      |          S d}t          |          )Nlinearr8   r   r/   c                    | j         dk    rd}t          |          |                     d                                          S )Nr-  zK`Expr.quantile` is not supported for Dask backend with multiple partitions.dask)qmethod)npartitionsr  rv  r6   )r8   r   rv  s     r:   r   zDaskExpr.quantile.<locals>.func  sM    #a''gC-c222}}v %  )++r<   zx`higher`, `lower`, `midpoint`, `nearest` - interpolation methods are not supported by Dask. Please use `linear` instead.rI  r0  )r@   rv  rw  r   r   s    `   r:   rv  zDaskExpr.quantile  sZ     H$$      &&t,,, I!#&&&r<   c                4    dd}|                      |          S )Nr8   r   r/   c                "   | j         }t          d|gd          }t          |                                 |          }t	          d          } |j        |fi |                    |di          |         }||                             |          S )N   
row_index_n_bytescolumnsprefixFdrop_null_keysrt   namer   r   to_framer   groupbyaggisin)r8   _name	col_tokenframegroup_by_kwargsfirst_distinct_indexs         r:   r   z(DaskExpr.is_first_distinct.<locals>.func  s    IE6E7<  I "$--//9==E2%HHHO#05=#J#J/#J#J#N#NE"$ $$  #(()=>>>r<   rI  r=   r   s     r:   is_first_distinctzDaskExpr.is_first_distinct  s,    
	? 
	? 
	? 
	? ""4(((r<   c                4    dd}|                      |          S )Nr8   r   r/   c                "   | j         }t          d|gd          }t          |                                 |          }t	          d          } |j        |fi |                    |di          |         }||                             |          S )Nr  r  r  Fr  rr   r  )r8   r  r  r  r  last_distinct_indexs         r:   r   z'DaskExpr.is_last_distinct.<locals>.func  s    IE6E7<  I "$--//9==E2%HHHO"/%-"I"I"I"I"M"ME"# ## #(()<===r<   rI  r=   r   s     r:   is_last_distinctzDaskExpr.is_last_distinct  s,    
	> 
	> 
	> 
	> ""4(((r<   c                4    dd}|                      |          S )Nr8   r   r/   c                    | j         }t          d          } |                                 j        |fi |                    d|t
          f          dk    S )NFr  rt  )metar-  )r  r   r  r  	transformr   )r8   r  r  s      r:   r   z DaskExpr.is_unique.<locals>.func  sf    IE2%HHHO3 3"13 3655r<   rI  r=   r   s     r:   	is_uniquezDaskExpr.is_unique  s,    	 	 	 	 ""4(((r<   c                4    |                      fd          S )Nc                .    |                                S rK   )r  )r8   rM   s    r:   r;   z DaskExpr.is_in.<locals>.<lambda>  s    		%0@0@ r<   r=   )r@   rM   s    `r:   is_inzDaskExpr.is_in  s!    ""#@#@#@#@AAAr<   c                .    |                      d           S )Nc                r    |                                                                                                  S rK   )r}   rw   r6   r  s    r:   r;   z%DaskExpr.null_count.<locals>.<lambda>	  s$    		0A0A0K0K0M0M r<   r=   rm  s    r:   
null_countzDaskExpr.null_count  s    ""#M#MNNNr<   order_bySequence[str]c                d     d fd}                      | j         j         j                  S )Nr   r#   r/   r   c                2      | j         ddd          S )NF)
descending
nulls_last)sort)r   r  r@   s    r:   r   z1DaskExpr._over_without_partition_by.<locals>.func  s&    4eNNNOOOr<   r   r   r#   r/   r   r   )r@   r  r   s   `` r:   _over_without_partition_byz#DaskExpr._over_without_partition_by  s_    	P 	P 	P 	P 	P 	P 	P ~~"&"=#7M	  
 
 	
r<   partition_byc                   	
 s|sJ                       |          S ddlm}  j        
r$
j        
j        j        sd}t          |          |rd}t          |          t          t          t           j        	                                                              d         }t          d|j                  }	 |j        |         n?# t          $ r2 d| dd	                    |j                   d
}t          |          d w xY wt          ||j                  	d	
 fd}                     | j         j         j                  S )Nr   )PandasLikeGroupByzOnly elementary expressions are supported for `.over` in dask backend when `partition_by` is specified.

Please see: https://narwhals-dev.github.io/narwhals/concepts/improve_group_by_operation/z4`over` with `order_by` is not yet supported in Dask.r"   zUnsupported function: z- in `over` context.

Supported functions are z, 
r   r#   r/   r   c           
                                         }j        9|                     t          dt	          d d         |                              } t          | g           \  }}t          j                    5  t          j        ddt                     t          d          } | j        j        fi |}	dk    rLt          |          d	k    rd
}t          |           |j        	fi 
                    |d                   }n! |t#          |                   j        	fi 
}d d d            n# 1 swxY w Y   |                     |          j        fd|D             S )NrV   r  ignorez.*`meta` is not specified)messagecategoryFr  rt  r-  z)Safety check failed, please report a bug.r   c                     g | ]
}|         S r4   r4   )r   r  result_frames     r:   r   z/DaskExpr.over.<locals>.func.<locals>.<listcomp>^  s    ;;;4L&;;;r<   )r   prevwith_columnsr   r   r   warningscatch_warningsfilterwarningsUserWarningr   r   r  ru  AssertionErrorr  r  list_with_native)r   plx_aliasesr  groupedr   
res_nativer  dask_function_namedask_kwargsr  nodesr  r@   s           @r:   r   zDaskExpr.over.<locals>.funcE  s   --//Cy$__T*nU3B3ZQT6U6U%V%VWW:4RHHJAw(**  '&AK    #7e"L"L"L+")+LLLOLL%//7||q((I,S111!2!2*" ".9" "hwqz** J "Bg!7!A*" ".9" "J              $ ??:66=L;;;;7;;;;s   >B3D==EEr   r  )r  narwhals._pandas_like.group_byr  	_metadatar  is_elementwiser  r  reversediter_nodes_reversedr   r  _REMAP_AGGSr   joinr   r9   r   r   r   r   )r@   r  r  r  r   	leaf_nodefunction_namer   r  r  r  r  s   ``      @@@@r:   overzDaskExpr.over  s    	=OOO228<<<DDDDDD ~ 		+I!$)*B!_  &c*** 	+HC%c***Xd4>#E#E#G#GHHIIJJ"I	2INCC	5!2!>}!M 	5 	5 	5X X X+/995F5R+S+SX X X  &c**4	5 9	HXYY	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	<6 ~~"&"=#7M	  
 
 	
s   C <Dr   r*   c                >     d fd}                      |          S )Nr8   r   r/   c                X    t          j                  }|                     |          S rK   )r   r   r  )r8   native_dtyper   r@   s     r:   r   zDaskExpr.cast.<locals>.funch  s&    3E4=IIL;;|,,,r<   rI  r=   )r@   r   r   s   `` r:   r   zDaskExpr.castg  s=    	- 	- 	- 	- 	- 	- 	- ""4(((r<   c                B    dd l m} |                     |j                  S r   )r8  r9  r>   isfiniter;  s     r:   	is_finitezDaskExpr.is_finiten  s*    ""2;///r<   basec                J    dd l m dfd}|                     |          S )Nr   r8   r   r/   c                Z                         |                                          z  S rK   )log)r8   r  r<  s    r:   _logzDaskExpr.log.<locals>._logv  s"    66$<<"&&,,..r<   rI  )r8  r9  r>   )r@   r  r  r<  s    ` @r:   r  zDaskExpr.logs  sO    	/ 	/ 	/ 	/ 	/ 	/ 	/ ""4(((r<   c                B    dd l m} |                     |j                  S r   )r8  r9  r>   expr;  s     r:   r  zDaskExpr.exp{  *    ""26***r<   c                B    dd l m} |                     |j                  S r   )r8  r9  r>   sinr;  s     r:   r  zDaskExpr.sin  r  r<   c                B    dd l m} |                     |j                  S r   )r8  r9  r>   cosr;  s     r:   r  zDaskExpr.cos  r  r<   c                B    dd l m} |                     |j                  S r   )r8  r9  r>   sqrtr;  s     r:   r  zDaskExpr.sqrt  r?  r<   keepr+   c               :    dfd}|                      |          S )Nr8   r   r/   c                    | j         }|                                                                 |         }dk    r|                    d          n|S )Nro   r-  )r  r  modehead)r8   r  r   r  s      r:   r   zDaskExpr.mode.<locals>.func  sD    IE]]__))++E2F%)U]]6;;q>>>>r<   rI  r=   )r@   r  r   s    ` r:   r  zDaskExpr.mode  s7    	? 	? 	? 	? 	? 	?
 ""4(((r<   defaultDaskExpr | NoDefaultoldSequence[Any]newreturn_dtypeIntoDType | Nonec                    t           u rd}t          |          t          t          ||                    t	          |          d fd}                     | j         j         j                  S )	NzK`replace_strict` requires an explicit value for `default` for dask backend.r   r#   r/   r   c                    |                                fd |           D             }r#t          j                  fd|D             S |S )Nc                    g | ]>}|                                                   |                                        ?S r4   )replacer   r  )r   r   default_seriesmappingold_s     r:   r   z9DaskExpr.replace_strict.<locals>.func.<locals>.<listcomp>  sQ        w''--fkk$.?.?PP  r<   c                :    g | ]}|                               S r4   )r  )r   resr  s     r:   r   z9DaskExpr.replace_strict.<locals>.func.<locals>.<listcomp>  s%    DDDS

<00DDDr<   )r   r   r   )	r   resultsr  r  r  r  r  r  r@   s	     @@r:   r   z%DaskExpr.replace_strict.<locals>.func  s    <<WEEN     "d2hh  G
  E7dmTTDDDDGDDDDNr<   r   r   )	r   
ValueErrordictzipr  r   r   r   r   )	r@   r  r  r  r  r   r   r  r  s	   ``  `  @@r:   replace_strictzDaskExpr.replace_strict  s     j  _CS//!s3}}%%Cyy	 	 	 	 	 	 	 	 	 	 ~~"&"=#7M	  
 
 	
r<   r   c                     t          |           S rK   r   rm  s    r:   r.   zDaskExpr.str  s    &t,,,r<   r   c                     t          |           S rK   r
   rm  s    r:   dtzDaskExpr.dt  s    (...r<   r   r  structN)
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   rP   r   r   r/   r   )r   r   r/   r   )r   r   rM   r   r/   r   )r   r.   rM   r   r/   r   )r   rP   rM   r   r/   r   )rM   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   rN  rO  rP  rQ  rR  r/   r   )rZ  r   r[  r   r/   r   )rZ  r   r/   r   )r[  r   r/   r   )rv  rL  rw  r,   r/   r   )r  r  r/   r   )r  r  r  r  r/   r   )r   r*   r/   r   )r  rL  r/   r   )r  r+   r/   r   )
r  r  r  r  r  r  r  r  r/   r   )r/   r   )r/   r   )n__name__
__module____qualname__r   r   rW   __annotations__rN   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rT   __rsub____rtruediv____rpow____rmod__rB   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   rH   ry   rz   r{   
drop_nullsis_nullr~   r   r   r   r   r   classmethodr   r   r>   r   r   rL   rS   r   r   r   r   r
  r  r  r  r  r'  r*  r2  r6  r:  r>  rM  rY  ra  re  ri  rn  rq  ru  rv  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r   propertyr.   r  r   	any_valuefilterfirstranklastr  r  r4   r<   r:   rV   rV   L   sR         '5&9O9999 mI&&GmI&&GmI&&G-..KmI&&GmI&&G]8$$F]8$$F]8$$F]8$$F]8$$F]8$$FmI&&G]8$$F##$6$677H''(:(:;;L##$5$566H##$6$677H

U
#
#C

U
#
#Cw''E!!*--H

U
#
#Cf%%D

U
#
#Cf%%D

U
#
#C

U
#
#C

U
#
#C|,,J
-

C=  Dx((JmF##GM'""E]8$$F          4 4 4 4

 
 
 
 
 
 
 [
2 	
 	
 	
 [	

 
 
 
4
 
 
 
 6 6 6 6
[ [ [ [   
 
 
 
$   $
) 
) 
) 
)? ? ? ?? ? ? ?U U U U? ? ? ?? ? ? ?@ @ @ @
 
 
 

 
 
 

' 
' 
' 
'
' 
' 
' 
'- - - -
, , , ,
) ) ) )") ) ) ) 
 
 
 

 
 
 

 
 
 
X X X X
) 
) 
) 
)G G G G' ' ' '") ) ) )) ) ) )) ) ) )B B B BO O O O
 
 
 
M
 M
 M
 M
^) ) ) )0 0 0 0
) ) ) )+ + + +
+ + + +
+ + + +
, , , ,
) ) ) )!
 !
 !
 !
F - - - X- / / / X/  !!I_FOE?D?D ,O--D-----o//F//////r<   rV   )r#   r   )r-   r.   r/   r   )rO   rP   r/   r   )D
__future__r   r  typingr   r   r   r   pandasrJ  narwhals._compliantr   r	   narwhals._dask.expr_dtr   narwhals._dask.expr_strr   narwhals._dask.utilsr   r   r   r   narwhals._expression_parsingr   r   narwhals._pandas_like.exprr   narwhals._pandas_like.utilsr   r   narwhals._utilsr   r   r   r   r   r   collections.abcr   dask.dataframe.dask_expr	dataframe	dask_exprdxtyping_extensionsr   narwhals._compliant.typingr   r    r!   r"   narwhals._dask.dataframer#   r   r%   narwhals._typingr&   r'   r(   narwhals.typingr)   r*   r+   r,   rB   rH   rN   rT   rV   r4   r<   r:   <module>r+     s   " " " " " "  5 5 5 5 5 5 5 5 5 5 5 5     ; ; ; ; ; ; ; ; < < < < < < ; ; ; ; ; ;            [ Z Z Z Z Z Z Z I I I I I I S S S S S S S S            6 5 5 5 5 5 (((((()))))))))&&&&&&            766666666666******88888888                 < < < <
B B B B
~	0 ~	0 ~	0 ~	0 ~	0)*23~	0 ~	0 ~	0 ~	0 ~	0r<   