o
    h                     @  s4  U 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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Z esejdkrd dlmZ nd dlmZ nd dlmZ g dZeddddZ ed Z!d e"d!< e#d"Z$d#e"d$< G d%d& d&eeef Z%G d'd( d(e%eef eeef Z&G d)d* d*e%eef eeee f Z'G d+d, d,e'eee(f e&eef eeef Z)G d-d. d.e%eef eeeef Z*dS )/    )annotationsN)TYPE_CHECKING)Any)Callable)ClassVar)Iterable)Iterator)Literal)Mapping)Sequence)TypeVar)CompliantDataFrameT_co)CompliantExprT_contra)CompliantFrameT_co)CompliantLazyFrameT_co)DepthTrackingExprAny)DepthTrackingExprT_contra)EagerExprT_contra)LazyExprT_contra)NativeExprT_co)	TypeAlias)   	   )Protocol)Generic)CompliantGroupByDepthTrackingGroupByEagerGroupByLazyGroupByNarwhalsAggregationNativeAggregationT_cozstr | Callable[..., Any]T)bound	covariant)
summeanmedianmaxminstdvarlenn_uniquecountr   r   z(\w+->)zre.Pattern[str]_RE_LEAF_NAMEc                   @  s@   e Zd ZU ded< ded< edddZdddZdddZdS )r   r   _compliant_frameSequence[str]_keysreturnr   c                 C  s   | j S N)r.   self r5   P/var/www/vscode/kcb/lib/python3.10/site-packages/narwhals/_compliant/group_by.py	compliant?   s   zCompliantGroupBy.compliantcompliant_framekeysdrop_null_keysboolNonec               C     d S r2   r5   )r4   r8   r9   r:   r5   r5   r6   __init__C   s   zCompliantGroupBy.__init__exprsr   c                 G  r=   r2   r5   )r4   r?   r5   r5   r6   aggL       zCompliantGroupBy.aggN)r1   r   )r8   r   r9   r/   r:   r;   r1   r<   )r?   r   r1   r   )__name__
__module____qualname____annotations__propertyr7   r>   r@   r5   r5   r5   r6   r   ;   s   
 
	r   c                   @  s   e Zd ZdddZdS )DataFrameGroupByr1   ,Iterator[tuple[Any, CompliantDataFrameT_co]]c                 C  r=   r2   r5   r3   r5   r5   r6   __iter__S   rA   zDataFrameGroupBy.__iter__N)r1   rH   )rB   rC   rD   rI   r5   r5   r5   r6   rG   O   s    rG   c                   @  sP   e Zd ZU dZded< 	 ddd	ZedddZedddZedddZ	dS )r   zf`CompliantGroupBy` variant, deals with `Eager` and other backends that utilize `CompliantExpr._depth`.z+ClassVar[Mapping[NarwhalsAggregation, Any]]_REMAP_AGGSr?   #Sequence[DepthTrackingExprT_contra]r1   r<   c                 C  s:   |D ]}|  |s| jjj }d|d}t|qd S )NzsNon-trivial complex aggregation found.

Hint: you were probably trying to apply a non-elementary aggregation with az table.
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())

)
_is_simpler7   _implementationnamelower
ValueError)r4   r?   exprrN   msgr5   r5   r6   _ensure_all_simplec   s   

z'DepthTrackingGroupBy._ensure_all_simplerQ   r   r;   c                C  s   |  o| || jv S )zNReturn `True` is we can efficiently use `expr` in a native `group_by` context.)_is_elementary
_leaf_namerJ   clsrQ   r5   r5   r6   rL   s   s   zDepthTrackingGroupBy._is_simplerN   NarwhalsAggregation | Anyr    c                C  s   | j ||S )zReplace `name`, with some native representation.

        Arguments:
            name: Name of a `nw.Expr` aggregation method.

        Returns:
            A native compatible representation.
        )rJ   get)rW   rN   r5   r5   r6   _remap_expr_namex   s   z%DepthTrackingGroupBy._remap_expr_namec                C  s   t d|jS )z=Return the last function name in the chain defined by `expr`. )r-   sub_function_namerV   r5   r5   r6   rU      s   zDepthTrackingGroupBy._leaf_nameN)r?   rK   r1   r<   )rQ   r   r1   r;   )rN   rX   r1   r    )rQ   r   r1   rX   )
rB   rC   rD   __doc__rE   rS   classmethodrL   rZ   rU   r5   r5   r5   r6   r   V   s   
 
r   c                   @  s   e Zd ZdS )r   N)rB   rC   rD   r5   r5   r5   r6   r      s    r   c                   @  s    e Zd ZdddZdd	d
ZdS )r   rQ   r   r1   Iterator[NativeExprT_co]c                c  s    | | j}|jr||n|}|| j}| r3t|||D ]\}}}|| jvr0||V  q d S t||D ]
\}}||V  q8d S r2   )_evaluate_output_namesr7   _alias_output_names_is_multi_output_unnamedzipr0   alias)r4   rQ   output_namesaliasesnative_exprsnative_exprrN   re   r5   r5   r6   _evaluate_expr   s    

zLazyGroupBy._evaluate_exprr?   Iterable[LazyExprT_contra]c                c  s     |D ]
}|  |E d H  qd S r2   )rj   )r4   r?   rQ   r5   r5   r6   _evaluate_exprs   s   zLazyGroupBy._evaluate_exprsN)rQ   r   r1   r`   )r?   rk   r1   r`   )rB   rC   rD   rj   rl   r5   r5   r5   r6   r      s    
r   )+
__future__r   resystypingr   r   r   r   r   r   r	   r
   r   r   narwhals._compliant.typingr   r   r   r   r   r   r   r   r   typing_extensionsr   version_infor   
Protocol38r   __all__r    r   rE   compiler-   r   rG   r   strr   r   r5   r5   r5   r6   <module>   sn    






6



