
    g                    .   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r d d
lmZ d d
lZd d
lZd dlmZ d dlmZ d dlmZ ddZ	 d	 	 	 ddZ	 d	 	 	 ddZdddddeededd
Z G d d      Z	 	 	 	 	 	 	 	 	 	 	 	 ddZy
)     )annotations)copy)TYPE_CHECKING)Any)Callable)Sequence)is_simple_aggregation)parse_into_exprs)remove_prefixNDaskLazyFrame)IntoDaskExpr)CompliantExprc                 H    dd l m}  dd}dd} | j                  d||      S )Nr   c                &    | j                  d      S )NF)dropna)nunique)ss    L/var/www/openai/venv/lib/python3.12/site-packages/narwhals/_dask/group_by.pychunkzn_unique.<locals>.chunk   s    yyy&&    c                "    | j                         S )N)sum)s0s    r   aggzn_unique.<locals>.agg   s    vvxr   r   )namer   r   )r   %pd.core.groupby.generic.SeriesGroupByreturnint)r   r   r   r   )dask.dataframe	dataframeAggregation)ddr   r   s      r   n_uniquer$      s-    ' 2>> r   c                f    ddl m} dd l} ||j                  j                  j
                  |       S Nr   )partial)ddof)	functoolsr'   	dask_expr_groupbyGroupByvarr(   r'   dxs      r   r-   r-   '   '    
 "2;;&&**66r   c                f    ddl m} dd l} ||j                  j                  j
                  |       S r&   )r)   r'   r*   r+   r,   stdr.   s      r   r2   r2   3   r0   r   r   meanmedianmaxminsizecount)
r   r3   r4   r5   r6   r2   r-   lenr$   r8   c                  @    e Zd Z	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZddZy)DaskLazyGroupByc                   || _         || _        | j                   j                  j                  t	        | j                        |d      | _        y )NT)r   observed)_df_keys_native_framegroupbylist_grouped)selfdfkeysdrop_null_keyss       r   __init__zDaskLazyGroupBy.__init__N   sE     
..66! 7 
r   c                Z   t        |d| j                  j                         i|}t        | j                        }|D ]6  }|j
                  d}t        |      |j                  |j
                         8 t        | j                  | j                  || j                  | j                        S )N	namespacezAnonymous expressions are not supported in group_by.agg.
Instead of `nw.all()`, try using a named expression, such as `nw.col('a', 'b')`
)r
   r>   __narwhals_namespace__r   r?   _output_names
ValueErrorextendagg_daskrC   _from_native_frame)rD   aggs
named_aggsexprsoutput_namesexprmsgs          r   r   zDaskLazyGroupBy.aggY   s    
 !
hh557
 

 #'tzz"2D!!)+ 
 !o% 2 23  HHMMJJ##
 	
r   c                t    ddl m}  ||| j                  j                  | j                  j                        S )Nr   r   )backend_versionversion)narwhals._dask.dataframer   r>   _backend_version_version)rD   rE   r   s      r   rP   z"DaskLazyGroupBy._from_native_framew   s-    : 9 9488CTCT
 	
r   N)rE   r   rF   	list[str]rG   boolr   None)rQ   r   rR   r   r   r   )rE   r   r   r   )__name__
__module____qualname__rH   r   rP    r   r   r;   r;   M   sM    	
	
'0	
EI	
		


 #
 
	
<
r   r;   c           
        |s | j                   | j                  |      S d}|D ]-  }t        |      rt        |j                  d      t
        v r+d} n |ri }|D ]c  }|j                  dk(  rs|j                  d}t        |      t
        j                  |j                  |j                        }	|j                  |j                  D 
ci c]
  }
|
|d   |	f c}
       |j                  dk7  s|j                  |j                  d}t        |      t        |j                  d      }	|	dv rd	|j                  j                  d	d      ini }t
        j                  |	|	      }t        |      r |di |n|}|j                  t        |j                  |j                        D 
ci c]
  \  }}
|
||f c}
}       f  |j                  di |} ||j!                               S d
}t#        |      c c}
w c c}
}w )zThis should be the fastpath, but cuDF is too far behind to use it.

    - https://github.com/rapidsai/cudf/issues/15118
    - https://github.com/rapidsai/cudf/issues/15084
    )subsetTzcol->Fr   z_Safety assertion failed, please report a bug to https://github.com/narwhals-dev/narwhals/issues   >   r2   r-   r(   av  Non-trivial complex aggregation found.

Hint: you were probably trying to apply a non-elementary aggregation with a dask dataframe.
Please rewrite your query such that group-by aggregations are elementary. For example, instead of:

    df.group_by('a').agg(nw.col('b').round(2).mean())

use:

    df.with_columns(nw.col('b').round(2)).group_by('a').agg(nw.col('b').mean())

rc   )selectuniquer	   r   _function_namePOLARS_TO_DASK_AGGREGATIONS_depthrL   AssertionErrorgetupdate_root_names_kwargscallablezipr   reset_indexrM   )rE   groupedrS   rF   from_dataframeall_simple_aggsrU   simple_aggregationsrV   function_nameoutput_namekwargsagg_function	root_nameresult_simples                  r   rO   rO      sE    ryy$&&d&33O!$'d117;?ZZ#O  KMD{{a%%-{C(-- ; ? ?'')<)<! $** ,0+=+=+=K $d1g}%==+=  q D$4$4$<@R@R@Zw$S)))$*=*=wGM !N2 ))&!45  7::=-XL +3<*@&v&l   && 36(($*<*<33.	;  )\!::3M \ $:&9:m779::	^  S/a8s   G9
*G>)r   zdd.Aggregation)rf   )r(   r   r   zXCallable[[pd.core.groupby.generic.SeriesGroupBy], pd.core.groupby.generic.SeriesGroupBy])rE   r   rt   r   rS   z)Sequence[CompliantExpr[dask_expr.Series]]rF   r]   ru   zCallable[[Any], DaskLazyFrame]r   r   )
__future__r   r   typingr   r   r   r   narwhals._expression_parsingr	   r
   narwhals.utilsr   r    r!   r#   r*   pandaspdrZ   r   narwhals._dask.typingr   narwhals.typingr   r$   r-   r2   rj   r;   rO   rc   r   r   <module>r      s    "       > 9 (62-" 	7
	7	7 	7
	7	7  /
 /
dVVV 5V 	V
 3V Vr   