o
    L¾±hü  ã                   @  sÌ   d dl mZ d dlmZmZmZmZ d dlmZ d dl	m
Z
mZ d dlmZ d dlmZ erJd dlmZmZmZ d dlmZ d d	lmZ d d
lmZ edddZG dd„ dee ƒZG dd„ dee ƒZdS )é    )Úannotations)ÚTYPE_CHECKINGÚAnyÚGenericÚTypeVar)Úall_exprs_are_scalar_like)ÚflattenÚtupleify)ÚInvalidOperationError)Ú
DataFrameT)ÚIterableÚIteratorÚSequence)ÚCompliantExprAny)Ú	LazyFrame)ÚExprÚ
LazyFrameTzLazyFrame[Any])Úboundc                   @  s*   e Zd Zdd	d
„Zddd„Zddd„ZdS )ÚGroupByÚdfr   Úkeysú*Sequence[str] | Sequence[CompliantExprAny]Údrop_null_keysÚboolÚreturnÚNonec               C  ó&   || _ || _| j jj| j|d| _d S ©N)r   ©Ú_dfÚ_keysÚ_compliant_frameÚgroup_byÚ_grouped©Úselfr   r   r   © r&   úR/var/www/html/Persson_Maskin/env/lib/python3.10/site-packages/narwhals/group_by.pyÚ__init__   ó
   ÿzGroupBy.__init__ÚaggsúExpr | Iterable[Expr]Ú
named_aggsr   c                   ór   t t|ƒƒ}t|i |¤Žsd}t|ƒ‚| j ¡ ‰ g ‡ fdd„|D ƒ¢‡ fdd„| ¡ D ƒ¢R }| j | jj	|Ž ¡S )u¿  Compute aggregations for each group of a group by operation.

        Arguments:
            aggs: Aggregations to compute for each group of the group by operation,
                specified as positional arguments.
            named_aggs: Additional aggregations, specified as keyword arguments.

        Examples:
            Group by one column or by multiple columns and call `agg` to compute
            the grouped sum of another column.

            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame(
            ...     {
            ...         "a": ["a", "b", "a", "b", "c"],
            ...         "b": [1, 2, 1, 3, 3],
            ...         "c": [5, 4, 3, 2, 1],
            ...     }
            ... )
            >>> df = nw.from_native(df_native)
            >>>
            >>> df.group_by("a").agg(nw.col("b").sum()).sort("a")
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”
            |Narwhals DataFrame|
            |------------------|
            |        a  b      |
            |     0  a  2      |
            |     1  b  5      |
            |     2  c  3      |
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
            >>>
            >>> df.group_by("a", "b").agg(nw.col("c").sum()).sort("a", "b").to_native()
               a  b  c
            0  a  1  8
            1  b  2  4
            2  b  3  2
            3  c  3  1
        úÒFound expression which does not aggregate.

All expressions passed to GroupBy.agg must aggregate.
For example, `df.group_by('a').agg(nw.col('b').sum())` is valid,
but `df.group_by('a').agg(nw.col('b'))` is not.c                 3  ó    | ]}|  ˆ ¡V  qd S ©N©Ú_to_compliant_expr©Ú.0Úx©Úplxr&   r'   Ú	<genexpr>V   ó   € zGroupBy.agg.<locals>.<genexpr>c                 3  ó$    | ]\}}|  |¡ ˆ ¡V  qd S r0   ©Úaliasr2   ©r4   ÚkeyÚvaluer6   r&   r'   r8   W   ó
   € ÿ
ÿ©
Útupler   r   r
   r   Ú__narwhals_namespace__ÚitemsÚ_with_compliantr#   Úagg©r%   r*   r,   Ú	flat_aggsÚmsgÚcompliant_aggsr&   r6   r'   rF   #   s   (ÿ
ÿ
þþzGroupBy.aggú Iterator[tuple[Any, DataFrameT]]c                 #  s$    ‡ fdd„ˆ j  ¡ D ƒE d H  d S )Nc                 3  s(    | ]\}}t |ƒˆ j |¡fV  qd S r0   )r	   r   rE   )r4   r>   r   ©r%   r&   r'   r8   _   s
   € ÿ
ÿz#GroupBy.__iter__.<locals>.<genexpr>)r#   Ú__iter__rL   r&   rL   r'   rM   ^   s   €
þzGroupBy.__iter__N)r   r   r   r   r   r   r   r   )r*   r+   r,   r   r   r   )r   rK   )Ú__name__Ú
__module__Ú__qualname__r(   rF   rM   r&   r&   r&   r'   r      s    

;r   c                   @  s    e Zd Zdd	d
„Zddd„ZdS )ÚLazyGroupByr   r   r   r   r   r   r   r   c               C  r   r   r   r$   r&   r&   r'   r(   f   r)   zLazyGroupBy.__init__r*   r+   r,   r   c                   r-   )u­  Compute aggregations for each group of a group by operation.

        Arguments:
            aggs: Aggregations to compute for each group of the group by operation,
                specified as positional arguments.
            named_aggs: Additional aggregations, specified as keyword arguments.

        Examples:
            Group by one column or by multiple columns and call `agg` to compute
            the grouped sum of another column.

            >>> import polars as pl
            >>> import narwhals as nw
            >>> from narwhals.typing import IntoFrameT
            >>> lf_native = pl.LazyFrame(
            ...     {
            ...         "a": ["a", "b", "a", "b", "c"],
            ...         "b": [1, 2, 1, 3, 3],
            ...         "c": [5, 4, 3, 2, 1],
            ...     }
            ... )
            >>> lf = nw.from_native(lf_native)
            >>>
            >>> nw.to_native(lf.group_by("a").agg(nw.col("b").sum()).sort("a")).collect()
            shape: (3, 2)
            â”Œâ”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”
            â”‚ a   â”† b   â”‚
            â”‚ --- â”† --- â”‚
            â”‚ str â”† i64 â”‚
            â•žâ•â•â•â•â•â•ªâ•â•â•â•â•â•¡
            â”‚ a   â”† 2   â”‚
            â”‚ b   â”† 5   â”‚
            â”‚ c   â”† 3   â”‚
            â””â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”˜
            >>>
            >>> lf.group_by("a", "b").agg(nw.sum("c")).sort("a", "b").collect()
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”
            |Narwhals DataFrame |
            |-------------------|
            |shape: (4, 3)      |
            |â”Œâ”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”|
            |â”‚ a   â”† b   â”† c   â”‚|
            |â”‚ --- â”† --- â”† --- â”‚|
            |â”‚ str â”† i64 â”† i64 â”‚|
            |â•žâ•â•â•â•â•â•ªâ•â•â•â•â•â•ªâ•â•â•â•â•â•¡|
            |â”‚ a   â”† 1   â”† 8   â”‚|
            |â”‚ b   â”† 2   â”† 4   â”‚|
            |â”‚ b   â”† 3   â”† 2   â”‚|
            |â”‚ c   â”† 3   â”† 1   â”‚|
            |â””â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”˜|
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        r.   c                 3  r/   r0   r1   r3   r6   r&   r'   r8   ´   r9   z"LazyGroupBy.agg.<locals>.<genexpr>c                 3  r:   r0   r;   r=   r6   r&   r'   r8   µ   r@   rA   rG   r&   r6   r'   rF   t   s   5ÿ
ÿ
þþzLazyGroupBy.aggN)r   r   r   r   r   r   r   r   )r*   r+   r,   r   r   r   )rN   rO   rP   r(   rF   r&   r&   r&   r'   rQ   e   s    
rQ   N)Ú
__future__r   Útypingr   r   r   r   Únarwhals._expression_parsingr   Únarwhals._utilsr   r	   Únarwhals.exceptionsr
   Únarwhals.typingr   Úcollections.abcr   r   r   Únarwhals._compliant.typingr   Únarwhals.dataframer   Únarwhals.exprr   r   r   rQ   r&   r&   r&   r'   Ú<module>   s    Q