o
    h%8                     @  sD  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 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dddddddddd d!Z"d-d'd(Z#G d)d* d*ed+ef Z$d,S ).    )annotations)TYPE_CHECKING)Any)Sequence)	EagerExpr)!evaluate_output_names_and_aliases)PandasLikeGroupBy)PandasLikeSeries)ColumnNotFoundError)generate_temporary_column_name)Self)
AliasNames)	EvalNames)
EvalSeries)ExprMetadata)PandasLikeDataFramePandasLikeNamespace)
RankMethod)Implementation)Version)_FullContextcumsumcummincummaxcumprodsummeanstdvarshiftrankdiff)cum_sumcum_mincum_maxcum_prod	cum_countrolling_sumrolling_meanrolling_stdrolling_varr    r!   r"   function_namestrkwargsdict[str, object]returnc                 C  s   | dkrd|d i}|S | dkr&|d }|dkrdn||d  d	d
d}|S |  dr1ddi}|S |  drD|d |d |d d}|S |}|S )Nr    periodsnr!   methodordinalfirst
descendingkeepF)r3   	ascending	na_optionpctcum_skipnaTrolling_min_sampleswindow_sizecenter)min_periodswindowr@   )
startswith)r,   r.   pandas_kwargs_method rF   N/var/www/vscode/kcb/lib/python3.10/site-packages/narwhals/_pandas_like/expr.py"window_kwargs_to_pandas_equivalent/   s,   
	
rH   c                   @  s   e Zd ZdddZddZd[ddZd\ddZeddd]d&d'Zed^d)d*Zd_d4d5Z	d`d7d8Z
dad:d;Zdbd@dAZd`dBdCZd`dDdEZd`dFdGZd`dHdIZdcdLdMZdcdNdOZdddQdRZdddSdTZdedXdYZdS )fPandasLikeExprNcall_kwargscall1EvalSeries[PandasLikeDataFrame, PandasLikeSeries]depthintr,   r-   evaluate_output_namesEvalNames[PandasLikeDataFrame]alias_output_namesAliasNames | Noneimplementationr   backend_versiontuple[int, ...]versionr   rK   dict[str, Any] | Noner0   Nonec          
      C  sD   || _ || _|| _|| _|| _|| _|| _|| _|	pi | _d | _	d S N)
_call_depth_function_name_evaluate_output_names_alias_output_names_implementation_backend_version_version_call_kwargs	_metadata)
selfrL   rN   r,   rP   rR   rT   rU   rW   rK   rF   rF   rG   __init__J   s   

zPandasLikeExpr.__init__r   c                 C  s    ddl m} || j| j| jdS )Nr   r   )rW   )narwhals._pandas_like.namespacer   r`   ra   rb   )re   r   rF   rF   rG   __narwhals_namespace__b   s   z%PandasLikeExpr.__narwhals_namespace__c                 C  s   d S rZ   rF   )re   rF   rF   rG   __narwhals_expr__i   s    z PandasLikeExpr.__narwhals_expr__ )r,   cls
type[Self]evaluate_column_namescontextr   r   c            
     s,   d	 fdd}| |d| d |j |j|jdS )
Ndfr   r0   list[PandasLikeSeries]c              
     sZ   z fdd D W S  t y, } z fdd D }tj| jd|d }~ww )Nc                   s(   g | ]}t  j|  j j jd qS )rT   rU   rW   )r	   _native_framer`   ra   rb   ).0column_namero   rF   rG   
<listcomp>v   s    zBPandasLikeExpr.from_column_names.<locals>.func.<locals>.<listcomp>c                   s   g | ]	}| j vr|qS rF   columns)rs   xru   rF   rG   rv      s    )missing_columnsavailable_columns)KeyErrorr
   'from_missing_and_available_column_namesrx   )ro   erz   rm   ru   rG   funct   s    
	
z.PandasLikeExpr.from_column_names.<locals>.funcr   rN   r,   rP   rR   rT   rU   rW   ro   r   r0   rp   r`   ra   rb   )rk   rm   rn   r,   r   rF   r   rG   from_column_namesk   s   	z PandasLikeExpr.from_column_namescolumn_indicesc             
     s4   d fdd}| |dd fd	d
d |j |j|jdS )Nro   r   r0   rp   c                       fddD S )Nc                   s2   g | ]}t  jjd d |f  j j jdqS )Nrq   )r	   rr   ilocr`   ra   rb   )rs   column_indexru   rF   rG   rv      s    zDPandasLikeExpr.from_column_indices.<locals>.func.<locals>.<listcomp>rF   ru   r   ru   rG   r      s   
z0PandasLikeExpr.from_column_indices.<locals>.funcr   nthc                   r   )Nc                   s   g | ]} j | qS rF   rw   )rs   iru   rF   rG   rv          zHPandasLikeExpr.from_column_indices.<locals>.<lambda>.<locals>.<listcomp>rF   ru   r   ru   rG   <lambda>   s    z4PandasLikeExpr.from_column_indices.<locals>.<lambda>r   r   r   )rk   rn   r   r   rF   r   rG   from_column_indices   s   
z"PandasLikeExpr.from_column_indicescomfloat | Nonespan	half_lifealphaadjustboolr>   ignore_nullsc             
   C  s   | j d|||||||dS )Newm_mean)r   r   r   r   r   r>   r   _reuse_series)re   r   r   r   r   r   r>   r   rF   rF   rG   r      s   zPandasLikeExpr.ewm_meanreversec                C     | j dd|idS )Nr#   r   rJ   r   re   r   rF   rF   rG   r#         zPandasLikeExpr.cum_sumr2   c                 C  r   )Nr    r2   rJ   r   )re   r2   rF   rF   rG   r       r   zPandasLikeExpr.shiftpartition_bySequence[str]order_bySequence[str] | Nonec              
     s   sd usJ dfdd}nF  sd}t|t t tj d u rEd  d	d
t dd
tj d}t|t j	d fdd}j
|jd jd jjjjjdS )Nro   r   r0   Sequence[PandasLikeSeries]c                   s\   t d| j}| |j ddd} | j|gdd}| |}|D ]}||| q#|S )N   Fr6   
nulls_lastT)strict)r   rx   with_row_indexsortdrop
get_column_scatter_in_place)ro   tokenresultssorting_indicess)r   re   rF   rG   r      s   

z!PandasLikeExpr.over.<locals>.funczOnly elementary expressions are supported for `.over` in pandas-like backends.

Please see: https://narwhals-dev.github.io/narwhals/pandas_like_concepts/improve_group_by_operation/zUnsupported function: z- in `over` context.

Supported functions are z, z
and .c                   s  t | g \}}dkr }| |j|   } dr&jd }n	djvs-J d}rWtt	|	}t
d|}| j| |j||d} | |}n|rntt	|}| j| td d d} | j}dr|t| jdi }	d usJ d	v rt|	jd
 d}
n/t|	 }
n(dkrt|dkrd}t||d|d }
n|t| jfi }
| |
tt||  fdd|D }r|D ]}||| q|S |rdd |D S |S )Nr'   r;   r   Fr   r   rolling>   r   r   ddof)r   len   z)Safety check failed, please report a bug.sizer   c                   s   g | ]}  |qS rF   )r   )rs   nameresult_framerF   rG   rv   "  r   z5PandasLikeExpr.over.<locals>.func.<locals>.<listcomp>c                 S  s   g | ]}| td d dqS )Nr   )_gather_sliceslice)rs   r   rF   rF   rG   rv   (  s    rF   )r   rh   with_columnscolis_nullrC   rc   listsetunionr   simple_selectr   r   r   r   r   rr   groupbyr   getattrr   AssertionError	transformto_frame_with_nativerenamedictzipr   )ro   output_namesaliasesplxr   rx   r   r   groupedr   
res_nativemsgr   r   r,   r   pandas_function_namerD   r   re   r   rG   r      sd   



r   z->overr   )ro   r   r0   r   )_is_elementaryNotImplementedErrorr   
_leaf_name%WINDOW_FUNCTIONS_TO_PANDAS_EQUIVALENTget_REMAP_AGGSjoinrH   rc   	__class__r\   r]   r^   r_   r`   ra   rb   )re   r   r   r   r   rF   r   rG   over   sB   


7zPandasLikeExpr.overc                C  r   )Nr'   r   rJ   r   r   rF   rF   rG   r'   6  r   zPandasLikeExpr.cum_countc                C  r   )Nr$   r   rJ   r   r   rF   rF   rG   r$   9  r   zPandasLikeExpr.cum_minc                C  r   )Nr%   r   rJ   r   r   rF   rF   rG   r%   <  r   zPandasLikeExpr.cum_maxc                C  r   )Nr&   r   rJ   r   r   rF   rF   rG   r&   ?  r   zPandasLikeExpr.cum_prodr?   r@   c                C     | j d|||ddS )Nr(   r?   r>   r@   rJ   r   re   r?   r>   r@   rF   rF   rG   r(   B     zPandasLikeExpr.rolling_sumc                C  r   )Nr)   r   rJ   r   r   rF   rF   rG   r)   L  r   zPandasLikeExpr.rolling_meanr   c                C     | j d||||ddS )Nr*   r?   r>   r@   r   rJ   r   re   r?   r>   r@   r   rF   rF   rG   r*   V     zPandasLikeExpr.rolling_stdc                C  r   )Nr+   r   rJ   r   r   rF   rF   rG   r+   c  r   zPandasLikeExpr.rolling_varr3   r   r6   c                C  s   | j d||ddS )Nr!   )r3   r6   rJ   r   )re   r3   r6   rF   rF   rG   r!   p  s   
zPandasLikeExpr.rank)rL   rM   rN   rO   r,   r-   rP   rQ   rR   rS   rT   r   rU   rV   rW   r   rK   rX   r0   rY   )r0   r   )r0   rY   )
rk   rl   rm   rQ   rn   r   r,   r-   r0   r   )rk   rl   r   rO   rn   r   r0   r   )r   r   r   r   r   r   r   r   r   r   r>   rO   r   r   r0   r   )r   r   r0   r   )r2   rO   r0   r   )r   r   r   r   r0   r   )r?   rO   r>   rO   r@   r   r0   r   )
r?   rO   r>   rO   r@   r   r   rO   r0   r   )r3   r   r6   r   r0   r   )__name__
__module____qualname__rf   rh   ri   classmethodr   r   r   r#   r    r   r'   r$   r%   r&   r(   r)   r*   r+   r!   rF   rF   rF   rG   rI   I   s.    

'




m








rI   r   N)r,   r-   r.   r/   r0   r/   )%
__future__r   typingr   r   r   narwhals._compliantr   narwhals._expression_parsingr   narwhals._pandas_like.group_byr   narwhals._pandas_like.seriesr	   narwhals.exceptionsr
   narwhals.utilsr   typing_extensionsr   narwhals._compliant.typingr   r   r   r   narwhals._pandas_like.dataframer   rg   r   narwhals.typingr   r   r   r   r   rH   rI   rF   rF   rF   rG   <module>   sJ    
