
    -Ph4                        d dl mZ d dlZd dlZd dlmZmZmZmZm	Z	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mZ d d
lmZ  G d deddef                   ZdS )    )annotationsN)TYPE_CHECKINGAnyClassVarIteratorMappingSequence)EagerGroupBy)!evaluate_output_names_and_aliases)select_columns_by_name)find_stacklevel)NarwhalsAggregation)PandasLikeDataFrame)PandasLikeExprc                  L    e Zd ZU ddddddddd	d
d
Zded<   ddZddZ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[PandasLikeExpr] | Sequence[str]drop_null_keysboolreturnNonec              6   || _         || _        |                     ||          \  | _        | _        | _        t          | j        j        j	        j
                                      | j        j                  r!| j        j                            d          }n| j        j        }| j        j                                        r| j        j        dk     r|s` | j        j        | j         j                                                                                                        rd}t)          |          |                    t-          | j                  ddd          | _        d S |                    t-          | j                  dd|d          | _        d S )	N)r!   T)drop)   r)   z:Grouping by null values is not supported in pandas < 1.1.0F)sortas_indexobserved)r*   r+   dropnar,   )_df_drop_null_keys_parse_keys_compliant_frame_keys_output_key_namesset	compliantnativeindexnamesintersectioncolumnsreset_index_implementation	is_pandas_backend_versionsimple_selectisnaanyNotImplementedErrorgroupbylist_grouped)selfr    r!   r#   native_framemsgs         ^/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/narwhals/_pandas_like/group_by.py__init__zPandasLikeGroupBy.__init__    s    -DHDTDTT EU E
 E
Atz4+A
 t~$*011>>t~?UVV 	1>0<<$<GGLL>0LN*4466	/&88 #/0DN0$*=DIIKKOOQQUUWW/ S)#...(00TZ  utd 1  DMMM )00TZ  % 1  DMMM    exprsr   c                d   +,-  j         j        } j         j        } j                                        }d}g  j         j        R }D ]G}t          | j         |          \  }}	|                    |	                                |          sd}Hi }
t          j
        t                    }t                      }t          j
        d           }t          j
        d           }g }g -|rD ]%}t          | j         |          \  }}	|j        dk    r                     |j                  }|                    |           |	D ]b}|                     j        d          d|            | j        d                                      |           -                    |           c                                          |                    }|dk    }|dk    }|d	k    }t'          ||	          D ]\  }}|r||
|<   |rV|j        d
         x}dk    rC||         d                             |           ||         d                             |           f|rV|j        d
         x}dk    rC||         d                             |           ||         d                             |           |                    | d|            ||                             |           -                    |           |                    |           'g }|rt+          |          dk    r|                                x+dk    rnt+          |          dk    r[ t/           j        t          |                                                   +                      }+fd|j        D             |_        n0 j                            |          }d |j        D             |_        t          |j                  t          |          k    r%t+          |j                  t+          |          k    sd| d|j         d}t9          |          t          j
        t                    ,t;          |          D ] \  }},|                             |           !,fd|j        D             }-fd|D             |_        |                    |           |
r{ j        t          |
                                                                       d          }t          |
                                          |_        |                    |           |rZ|                                 D ]E\  }\  }}  j        |         !                    |          }!| |!_        |                    |!           F|rZ|                                 D ]E\  }\  }"}# j        |"         "                    |          }!|#|!_        |                    |!           F|rt          j#        d |D                       }$tI          d |$                                D                       rCd}|$                                 D ]\  }%}&|&dk    r|d|% d|& dz  }d| }tK          |           j         &                                }'|''                    |          }(n\ j         (                                )                    t           j        j*                                                   j                  }(|(+                    d            j         ,                    t[          |(|||                    .                    t_          t'           j         j                                      S  j         j0        j1        rd}tK          |          te          j3        d th          tk                      !           d( fd%})|6                                r#|d&k    r j        7                    |)d'          }*n j        7                    |)          }*|*+                    d            j         ,                    t[          |*|||                    .                    t_          t'           j         j                                      S ))NTFc                 
    g g fS N rP   rK   rI   <lambda>z'PandasLikeGroupBy.agg.<locals>.<lambda>_   
    RH rK   c                 
    g g fS rO   rP   rP   rK   rI   rQ   z'PandasLikeGroupBy.agg.<locals>.<lambda>b   rR   rK   r   _r   r   r   ddofr)   r   c                    g | ]	}| d  
S rT   rP   ).0a
agg_methods     rI   
<listcomp>z)PandasLikeGroupBy.agg.<locals>.<listcomp>   s4     2 2 2011++z++2 2 2rK   c                "    g | ]\  }}| d | S rW   rP   )rX   rY   bs      rI   r[   z)PandasLikeGroupBy.agg.<locals>.<listcomp>   s3     2 2 2'+q!1

q

2 2 2rK   z"Safety assertion failed, expected z got zH, please report a bug at https://github.com/narwhals-dev/narwhals/issuesc                F    g | ]}|                              d           S )r   )pop)rX   itemexpected_old_names_indicess     rI   r[   z)PandasLikeGroupBy.agg.<locals>.<listcomp>   s<     ( ( ( /t488;;( ( (rK   c                     g | ]
}|         S rP   rP   )rX   isimple_agg_new_namess     rI   r[   z)PandasLikeGroupBy.agg.<locals>.<listcomp>   s    -Y-Y-Y!.B1.E-Y-Y-YrK   )r-   )rU   c              3  $   K   | ]}|D ]}|V  d S rO   rP   )rX   framecs      rI   	<genexpr>z(PandasLikeGroupBy.agg.<locals>.<genexpr>   sG       ; ;; ;34A; ; ; ; ; ; ;rK   c              3  "   K   | ]
}|d k    V  dS )r)   NrP   )rX   vs     rI   rh   z(PandasLikeGroupBy.agg.<locals>.<genexpr>   s&      DDq1uDDDDDDrK    z
- 'z' z timesz"Expected unique output names, got:)r:   )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())

a)  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/concepts/improve_group_by_operation/)
stacklevelr    r   r%   c                Z   g }g }D ]i} |j                             |                     }|D ]A}|                    |j        j        d                    |                    |j                   Bjj                                         }|j                            |||          j        S )Nr   )r7   context)	r5   _with_nativeappendr6   ilocname__narwhals_namespace___seriesfrom_iterable)	r    	out_group	out_namesexprresults_keysresult_keysnsrL   rF   s	          rI   funcz#PandasLikeGroupBy.agg.<locals>.func   s    II 7 7#tDN$?$?$C$CDD#/ 7 7K$$[%7%<Q%?@@@$$[%566667 6688B:++IYPR+SSZZrK   )   r~   )include_groups)r    r   r%   r   )8r5   r<   r>   r2   copyr3   r   extend
_is_simplecollectionsdefaultdictrD   r4   _depth_remap_expr_name_function_nameaddrq   
_leaf_namezip_scalar_kwargsr   r_   getattrrE   r!   r:   aggAssertionError	enumeratevaluesr   itemsr   r   CounterrA   
ValueErrorrt   _concat_horizontal__native_namespace__	DataFramegroupsr;   rp   r   renamedictr6   emptywarningswarnUserWarningr   r=   apply).rF   rL   implementationbackend_version	new_namesall_aggs_are_simpleexcludery   rT   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_namerU   result_aggsresult_simple_aggsrH   idxr`   	index_mapresult_nunique_aggsstd_output_namesstd_aliases_aggregationvar_output_namesvar_aliasesoutput_names_counterkeyvalue	namespaceresultr}   result_complexrZ   ra   rd   s.   ``                                         @@@rI   r   zPandasLikeGroupBy.aggI   s	   7.9#z00	"8DJ8!788 	, 	,D:4QXYYJAwW%%%??4(( ,&+#
 (*,7,CD,I,I*-%% <G;R<
 <
 <G;R<
 <
 )+*, ~	D !A !A(I$.') )%g ;!##$($9$9$:M$N$NM)--m<<<!( ; ;*11TZ]2T2T]2T2TUUU#DJqM299-HHH,33E:::: !% 5 5dood6K6K L L+y8&%/&%/*-lG*D*D A A&K" A.9U++ 
AT-@-H%HTQ$N$N q)00=== q)007777 AT-@-H%HTQ$N$N q)00=== q)007777*11[2R2R=2R2RSSS#K077FFF,33E:::-11-@@@@A K (7 -..!33'<'@'@'B'BBvMMK((1,,*d;+;+;+=+=&>&>?* * * *&2 2 2 25G5O2 2 2&.. *.):):;)G)G&2 2/A/I2 2 2&. *233s;M7N7NNN.6773?Q;R;RRRa=O a a19a a a 
 )---  +D11 + "++=!>!> A AIC.t4;;C@@@@( ( ( ( 2 :( ( (	 .Z-Y-Y-Yy-Y-Y-Y"*""#5666 8&*mD9L9L9N9N4O4O&P&X&X  'Y ' '# /3<3D3D3F3F.G.G#+""#6777 5=E^^=M=M 5 59D9+[#'=1A#B#F#FD#F#Q#QL+6L(&&|4444 5=E^^=M=M 5 59D9+[#'=1A#B#F#FD#F#Q#QL+6L(&&|4444 '2': ; ;#.; ; ; ( ($ DD&:&A&A&C&CDDDDD *C&:&@&@&B&B ! !
U 199#?3#?#?%#?#?#??CC DsDDC$S//) NAACC	"55kBB <<>>HH-224455tz I  
 t,,,>..&vy/>ZZ fT#dj$*@AABBCCD > & 	"f  S//![
 &((	
 	
 	
 	
		[ 		[ 		[ 		[ 		[ 		[ 		[ ##%% 	7/V*C*C!]00e0LLNN!]0066N 	""4"000~**"	?N 
 
 &c$*d&<==>>
?
?		@rK   )Iterator[tuple[Any, PandasLikeDataFrame]]c              #    K   t          j                    5  t          j        ddt                     | j        D ]5\  }}| | j                            |          j        | j        j	         fV  6	 d d d            d S # 1 swxY w Y   d S )Nignorez#.*a length 1 tuple will be returned)messagecategory)
r   catch_warningsfilterwarningsFutureWarningrE   r5   rp   r?   r.   r:   )rF   r   groups      rI   __iter__zPandasLikeGroupBy.__iter__  s      $&& 	 	#=&    #m  
UDDN//66DdhFVW    	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   AA>>BBN)r    r   r!   r"   r#   r$   r%   r&   )rL   r   r%   r   )r%   r   )__name__
__module____qualname__r   __annotations__rJ   r   r   rP   rK   rI   r   r      s         @ @K    ' ' ' 'RN@ N@ N@ N@`     rK   r   r   r   )
__future__r   r   r   typingr   r   r   r   r   r	   narwhals._compliantr
   narwhals._expression_parsingr   narwhals._pandas_like.utilsr   narwhals._utilsr   narwhals._compliant.group_byr   narwhals._pandas_like.dataframer   narwhals._pandas_like.exprr   strr   rP   rK   rI   <module>r      s.   " " " " " "      L L L L L L L L L L L L L L L L , , , , , , J J J J J J > > > > > > + + + + + + :@@@@@@CCCCCC999999S S S S S%:<Lc%QR S S S S SrK   