o
    h43                     @  s   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 erdd dlmZ d dlmZ d dlmZ G dd ded ZdS )    )annotationsN)TYPE_CHECKING)Any)ClassVar)Iterator)Mapping)Sequence)EagerGroupBy)!evaluate_output_names_and_aliases)select_columns_by_name)set_columns)find_stacklevel)NarwhalsAggregation)PandasLikeDataFrame)PandasLikeExprc                   @  sN   e Zd ZU ddddddddd	d
d
Zded< d ddZd!ddZd"ddZdS )#PandasLikeGroupBysummeanmedianmaxminstdvarsizenuniquecount)
r   r   r   r   r   r   r   lenn_uniquer   z+ClassVar[Mapping[NarwhalsAggregation, Any]]_REMAP_AGGSdfr   keysSequence[str]drop_null_keysboolreturnNonec               C  s   || _ t|| _t|jjj|jr|jj	dd}n|j}| j
j rO| j
jdk rO|s@| j
j| j j   r@d}t||jt| jdddd| _d S |jt| jdd|dd| _d S )NT)drop)   r'   z:Grouping by null values is not supported in pandas < 1.1.0F)sortas_indexobserved)r(   r)   dropnar*   )_compliant_framelist_keyssetnativeindexnamesintersectioncolumnsreset_index	compliant_implementation	is_pandas_backend_versionsimple_selectisnaanyNotImplementedErrorgroupby_grouped)selfr   r    r"   native_framemsg rC   R/var/www/vscode/kcb/lib/python3.10/site-packages/narwhals/_pandas_like/group_by.py__init__&   s6   

zPandasLikeGroupBy.__init__exprsr   c           #        s$  j jj jj }d}D ]}t|j j\}}|| |s)d}qi }t	t
}t }	t	dd }
t	dd }g }g |rKD ]}t|j j\}}|jdkr|j}|	| |D ]}|jd  d|  |jd  | | qiqK|}|dk}|d	k}|d
k}t||D ]b\}}|r|||< q|r|jd  }dkr|
| d | |
| d | q|r|jd  }dkr|| d | || d | q|| d|  || | | |	| qqKg }|rt|	dkr;|	   dkr;t|dkr;tjt
|    } fdd|jD |_nj|}dd |jD |_t|jt|kr^t|jt|ksld| d|j d}t|t	t
t|D ]\}}| | qufdd|jD }fdd|D |_|| |rjt
|  jdd}t
| |_|| |
r|fdd|
 D  |r|fdd| D  |r)t dd |D }t!dd | D rd}| D ]\}}|dkr|d| d| d7 }q	 qd | }t"|j # }|$|} nj % j&t
jj' jd!} | j(dd" j )t*| |S j j+j,rWd#}t"|t-j.d$t/t0 d% d-fd)d*}!1 r{d+kr{jj2|!dd,}"nj2|!}"|"j(dd" j )t*|"|S ).NTFc                   S     g g fS NrC   rC   rC   rC   rD   <lambda>f       z'PandasLikeGroupBy.agg.<locals>.<lambda>c                   S  rG   rH   rC   rC   rC   rC   rD   rI   i   rJ   r   _r   r   r   ddofr'   r   c                   s   g | ]	}| d   qS rK   rC   ).0a)
agg_methodrC   rD   
<listcomp>   s    z)PandasLikeGroupBy.agg.<locals>.<listcomp>c                 S  s   g | ]\}}| d | qS rM   rC   )rN   rO   brC   rC   rD   rQ      s    z"Safety assertion failed, expected z got zH, please report a bug at https://github.com/narwhals-dev/narwhals/issuesc                   s   g | ]	} |  d qS )r   )pop)rN   item)expected_old_names_indicesrC   rD   rQ      s    c                   s   g | ]} | qS rC   rC   )rN   i)simple_agg_new_namesrC   rD   rQ      s    )r+   c                 3  6    | ]\}\}}t j| j|d | dV  qdS )rL   )r4   implementationbackend_versionN)r   r?   r   )rN   rL   std_output_namesstd_aliasesr[   rZ   r@   rC   rD   	<genexpr>       

z(PandasLikeGroupBy.agg.<locals>.<genexpr>c                 3  rX   rY   )r   r?   r   )rN   rL   var_output_namesvar_aliasesr^   rC   rD   r_      r`   c                 s  s    | ]
}|D ]}|V  qqd S rH   rC   )rN   framecrC   rC   rD   r_      s    c                 s  s    | ]}|d kV  qdS )r'   NrC   )rN   vrC   rC   rD   r_      s     z
- 'z' z timesz"Expected unique output names, got:)r4   )inplaceau  No results for group-by aggregation.

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

a5  Found complex group-by expression, which can't be expressed efficiently with the pandas API. If you can, please rewrite your query such that group-by aggregations are simple (e.g. mean, std, min, max, ...). 

Please see: https://narwhals-dev.github.io/narwhals/pandas_like_concepts/improve_group_by_operation/)
stacklevelr   r   r$   c                   sh   g }g } D ]}|j | }|D ]}||jjd  ||j qqj  }|jj|||djS )Nr   )r1   context)	r6   _with_nativeappendr0   ilocname__narwhals_namespace___seriesfrom_iterable)r   	out_group	out_namesexprresults_keysresult_keysns)rF   r@   rC   rD   func  s   
z#PandasLikeGroupBy.agg.<locals>.func)   rx   )include_groups)r   r   r$   r   )3r6   r7   r9   r.   copyr
   extend
_is_simplecollectionsdefaultdictr-   r/   _depth_remap_expr_name_function_nameaddrk   
_leaf_namezip_call_kwargsr   rS   getattrr?   r    r4   aggAssertionError	enumeratevaluesr   itemsCounterr<   
ValueErrorrn   _concat_horizontal__native_namespace__	DataFramegroupsr5   rj   r   r0   emptywarningswarnUserWarningr   r8   apply)#r@   rF   	new_namesall_aggs_are_simplers   rK   aliasesnunique_aggssimple_aggssimple_aggs_functionsstd_aggsvar_aggsexpected_old_namesoutput_namesfunction_namealiasis_n_uniqueis_stdis_varoutput_namerL   result_aggsresult_simple_aggsrB   idxrT   	index_mapresult_nunique_aggsoutput_names_counterkeyvalue	namespaceresultrw   result_complexrC   )rP   r[   rU   rF   rZ   r@   rW   rD   r   O   s  














	







zPandasLikeGroupBy.agg)Iterator[tuple[Any, PandasLikeDataFrame]]c                 c  sb    t  " t jddtd | jD ]\}}|| j|fV  qW d    d S 1 s*w   Y  d S )Nignorez#.*a length 1 tuple will be returned)messagecategory)r   catch_warningsfilterwarningsFutureWarningr?   r6   rj   )r@   r   grouprC   rC   rD   __iter__)  s   
"zPandasLikeGroupBy.__iter__N)r   r   r    r!   r"   r#   r$   r%   )rF   r   r$   r   )r$   r   )__name__
__module____qualname__r   __annotations__rE   r   r   rC   rC   rC   rD   r      s    
 

) [r   )r   r   )
__future__r   r}   r   typingr   r   r   r   r   r   narwhals._compliantr	   narwhals._expression_parsingr
   narwhals._pandas_like.utilsr   r   narwhals.utilsr   narwhals._compliant.group_byr   narwhals._pandas_like.dataframer   narwhals._pandas_like.exprr   r   rC   rC   rC   rD   <module>   s&    