o
    Lh9                     @  s  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rfd dlmZ 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 d dlmZ d dlmZmZmZ d dlm Z  ddd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)	EagerExpr)!evaluate_output_names_and_aliases)PandasLikeGroupBy)PandasLikeSeries)generate_temporary_column_name)Sequence)Self)
AliasNames	EvalNames
EvalSeriesScalarKwargs)ExprMetadata)PandasLikeDataFramePandasLikeNamespace)ImplementationVersion_LimitedContext)PythonLiteralcumsumcummincummaxcumprodsummeanstdvarshiftrankdifffillnaquantile)cum_sumcum_mincum_maxcum_prod	cum_countrolling_sumrolling_meanrolling_stdrolling_varr   r    r!   	fill_nullr#   ewm_meanfunction_namestrkwargsr   returndict[str, PythonLiteral]c                 C  s  | dkrd|v s
J d|d i}|S | dkr8d|v sJ d|v s"J |d }|dkr,dn||d  d	d
d}|S |  drCddi}|S |  drhd|v sNJ d|v sTJ d|v sZJ |d |d |d d}|S | dv rzd|v srJ d|d i}|S | dkrd|v sJ d|v sJ |d |d d}|S | dkrd|v sJ d|v sJ |d |d d}|S |  drd|v sJ d|v sJ d |v sJ d!|v sJ d"|v sJ d|v sJ d#|v sJ |d |d |d  |d! |d" |d |d# d$}|S i }|S )%Nr   nperiodsr    method
descendingordinalfirstkeepF)r6   	ascending	na_optionpctcum_skipnaTrolling_min_sampleswindow_sizecenter)min_periodswindowrC   >   r   r   ddofr-   strategylimit)rG   rH   r#   interpolation)qrI   ewm_comspan	half_lifealphaadjustignore_nulls)rL   rM   halfliferO   rP   rD   	ignore_na)
startswith)r/   r1   pandas_kwargs_method rW   [/var/www/html/Persson_Maskin/env/lib/python3.10/site-packages/narwhals/_pandas_like/expr.py"window_kwargs_to_pandas_equivalent-   sz   83
,
' 
rY   c                   @  sf   e Zd Zddd9ddZd:ddZd;ddZeddd<d$d%Zed=d'd(Zd>d2d3Z	d?d7d8Z
dS )@PandasLikeExprNscalar_kwargscall1EvalSeries[PandasLikeDataFrame, PandasLikeSeries]depthintr/   r0   evaluate_output_namesEvalNames[PandasLikeDataFrame]alias_output_namesAliasNames | Noneimplementationr   versionr   r\   ScalarKwargs | Noner2   Nonec          	      C  s>   || _ || _|| _|| _|| _|| _|| _|pi | _d | _d S N)	_call_depth_function_name_evaluate_output_names_alias_output_names_implementation_version_scalar_kwargs	_metadata)	selfr]   r_   r/   ra   rc   re   rf   r\   rW   rW   rX   __init__n   s   

zPandasLikeExpr.__init__r   c                 C  s   ddl m} || j| jdS )Nr   r   )rf   )narwhals._pandas_like.namespacer   ro   rp   )rs   r   rW   rW   rX   __narwhals_namespace__   s   z%PandasLikeExpr.__narwhals_namespace__c                 C  s   d S ri   rW   )rs   rW   rW   rX   __narwhals_expr__   s    z PandasLikeExpr.__narwhals_expr__ )r/   cls
type[Self]evaluate_column_namescontextr   r
   c            	     s(   d	 fdd}| |d| d |j |jdS )
Ndfr   r2   list[PandasLikeSeries]c              
     sL   z fdd D W S  t y% } z   }r || d }~ww )Nc                   s$   g | ]}t  j|  j jd qS ))re   rf   )r   _native_framero   rp   ).0column_namer}   rW   rX   
<listcomp>   s    zBPandasLikeExpr.from_column_names.<locals>.func.<locals>.<listcomp>)KeyError_check_columns_exist)r}   eerrorr{   r   rX   func   s   
z.PandasLikeExpr.from_column_names.<locals>.funcr   r_   r/   ra   rc   re   rf   r}   r   r2   r~   )ro   rp   )ry   r{   r|   r/   r   rW   r   rX   from_column_names   s   	z PandasLikeExpr.from_column_namescolumn_indicesc             	     s.   d
 fdd}| |dd|   d |j|jd	S )Nr}   r   r2   r~   c                   s    j  fddD S )Nc                   s(   g | ]}t jjd d |f  dqS )N)r|   )r   from_nativeiloc)r   ir}   nativerW   rX   r      s    zDPandasLikeExpr.from_column_indices.<locals>.func.<locals>.<listcomp>)r   r   r   r   rX   r      s   z0PandasLikeExpr.from_column_indices.<locals>.funcr   nthr   r   )_eval_names_indicesro   rp   )ry   r|   r   r   rW   r   rX   from_column_indices   s   z"PandasLikeExpr.from_column_indicesrL   float | NonerM   rN   rO   rP   boolrA   rQ   c             
   C  s   | j d|||||||ddS )Nr.   )rL   rM   rN   rO   rP   rA   rQ   r[   )_reuse_series)rs   rL   rM   rN   rO   rP   rA   rQ   rW   rW   rX   r.      s   zPandasLikeExpr.ewm_meanpartition_bySequence[str]order_byc              	     s   ssJ dfdd}nF  sd}t|t t tj d u rCd  d	d
t dd
tj d}t|t j	d fdd}j
|jd jd jjjjdS )Nr}   r   r2   Sequence[PandasLikeSeries]c                   s`   t d| j}| j|d dj ddd} | j|gdd}| |}|D ]}||| q%|S )N   r   Fr7   
nulls_lastT)strict)r   columnswith_row_indexsortdrop
get_column_scatter_in_place)r}   tokenresultssorting_indicess)r   rs   rW   rX   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/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-djv s'J jd }n	djvs4J d}r`tt	|	}t
d|}| j| j|d dj||d} | |}n|rwtt	|}| j| td d d} | j}d	r|t| jd i }	d usJ d
v rdjv sJ t|	jd d}
nt|	 }
ndrj rЈj dk rdj  d}t||t| jd i }d usJ t| }
nmdkr,djv sJ djv sJ |t| }jd dkr|jjd d}
nBjd dkr&|jjd d}
n0d}t|dkrIt|dkr>d}t||d|d }
n|t| jfi }
|  |
!t"t#||  fdd|D }r}|D ]	}|$|| qq|S |rdd |D S |S )!Nr(   r>   reverseFr   r   r   rolling>   r   r   rF   )rF   ewm)      zpExponentially weighted calculation is not available in over context for pandas versions older than 1.2.0, found r   r-   rG   rH   forward)rH   backwardzF`fill_null` with `over` without `strategy` specified is not supported.lenr   z)Safety check failed, please report a bug.sizer   c                   s   g | ]}  |qS rW   )r   )r   nameresult_framerW   rX   r   J  s    z5PandasLikeExpr.over.<locals>.func.<locals>.<listcomp>c                 S  s   g | ]}| td d dqS )Nr   )_gather_sliceslice)r   r   rW   rW   rX   r   P  s    rW   )%r   rv   with_columnscolis_nullrT   rq   listsetunionr   simple_selectr   r   r   r   r   r   groupbyr   getattrro   	is_pandas_backend_versionNotImplementedErrorr   ffillbfillr   AssertionError	transformto_frame_with_nativerenamedictzipr   )r}   output_namesaliasesplxr   r   r   r   groupedr   
res_nativemsgr   
df_groupedr   r   r/   r   pandas_function_namerU   r   rs   r   rX   r     s   







r   z->overr   )r}   r   r2   r   )_is_elementaryr   r   
_leaf_name%WINDOW_FUNCTIONS_TO_PANDAS_EQUIVALENTget_REMAP_AGGSjoinrY   rq   	__class__rk   rl   rm   rn   ro   rp   )rs   r   r   r   r   rW   r   rX   over   s@   


RzPandasLikeExpr.over)r]   r^   r_   r`   r/   r0   ra   rb   rc   rd   re   r   rf   r   r\   rg   r2   rh   )r2   r   )r2   rh   )
ry   rz   r{   rb   r|   r   r/   r0   r2   r
   )r   r`   r|   r   r2   r
   )rL   r   rM   r   rN   r   rO   r   rP   r   rA   r`   rQ   r   r2   r
   )r   r   r   r   r2   r
   )__name__
__module____qualname__rt   rv   rw   classmethodr   r   r.   r   rW   rW   rW   rX   rZ   m   s    

!
rZ   r   N)r/   r0   r1   r   r2   r3   )$
__future__r   typingr   narwhals._compliantr   narwhals._expression_parsingr   narwhals._pandas_like.group_byr   narwhals._pandas_like.seriesr   narwhals._utilsr   collections.abcr	   typing_extensionsr
   narwhals._compliant.typingr   r   r   r   r   narwhals._pandas_like.dataframer   ru   r   r   r   r   narwhals.typingr   r   rY   rZ   rW   rW   rW   rX   <module>   sD    
@