o
    $&]iTB                     @  s.  d dl mZ d dlZd dlmZmZmZ d dlmZ d dl	m
Z
mZ d dlmZmZ d dlmZ d dlmZ d d	lmZ errd 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"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 )+    )annotationsN)TYPE_CHECKINGAnycast)	EagerExpr)evaluate_nodes!evaluate_output_names_and_aliases)_REMAP_ORDERED_INDEXPandasLikeGroupBy)PandasLikeSeries)make_group_by_kwargs)generate_temporary_column_name)Sequence)Self)
AliasNames	EvalNames
EvalSeriesNarwhalsAggregation)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kwargsdict[str, Any]returndict[str, PythonLiteral]c                 C  sH  | 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krMdd
i}|S |  drrd|v sXJ d|v s^J d|v sdJ |d |d |d d}|S | dv rd|v s|J 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rd |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 | d'v r |d%rd(}t|dttd)|  i}|S i }|S )*Nr#   nperiodsr$   method
descendingordinalfirstkeepF)r;   	ascending	na_optionpctcum_skipnaTn_uniquedropnarolling_min_sampleswindow_sizecenter)min_periodswindowrJ   >   r!   r"   ddofr1   strategylimit)rN   rO   r'   interpolation)qrP   ewm_comspan	half_lifealphaadjustignore_nulls)rS   rT   halfliferV   rW   rK   	ignore_na>   lastr>   	any_valueza`Expr.any_value(ignore_nulls=True)` is not supported in a `over` context for pandas-like backend.r   )
startswithgetNotImplementedErrorr	   r   )r3   r5   pandas_kwargs_methodmsg rc   X/var/www/html/IGF-ODF-V3/venv/lib/python3.10/site-packages/narwhals/_pandas_like/expr.py"window_kwargs_to_pandas_equivalent3   s   D?
86
1*&"
re   c                   @  sZ   e Zd Zd1ddZd2ddZed3ddZed4ddZd5d'd(Zd6d+d,Z	d7d.d/Z
d0S )8PandasLikeExprcall1EvalSeries[PandasLikeDataFrame, PandasLikeSeries]evaluate_output_namesEvalNames[PandasLikeDataFrame]alias_output_namesAliasNames | Noneimplementationr   versionr   r7   Nonec                C  s"   || _ || _|| _|| _|| _d S )N)_call_evaluate_output_names_alias_output_names_implementation_version)selfrg   ri   rk   rm   rn   rc   rc   rd   __init__   s
   	
zPandasLikeExpr.__init__r   c                 C  s   ddl m} || j| jdS )Nr   r   )rn   )narwhals._pandas_like.namespacer   rs   rt   )ru   r   rc   rc   rd   __narwhals_namespace__   s   z%PandasLikeExpr.__narwhals_namespace__cls
type[Self]evaluate_column_namescontextr   r   c                 s$   d fdd}| | d |j |jdS )	Ndfr   r7   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 ))rm   rn   )r   _native_framers   rt   ).0column_namer}   rc   rd   
<listcomp>   s    zBPandasLikeExpr.from_column_names.<locals>.func.<locals>.<listcomp>)KeyError_check_columns_exist)r}   eerrorr{   r   rd   func   s   
z.PandasLikeExpr.from_column_names.<locals>.funcri   rk   rm   rn   r}   r   r7   r~   )rs   rt   )ry   r{   r|   r   rc   r   rd   from_column_names   s   z PandasLikeExpr.from_column_namescolumn_indicesintc                  s*   d fdd}| ||   d |j|jdS )	Nr}   r   r7   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}   nativerc   rd   r          zDPandasLikeExpr.from_column_indices.<locals>.func.<locals>.<listcomp>)r   r   r   r   rd   r      s   z0PandasLikeExpr.from_column_indices.<locals>.funcr   r   )_eval_names_indicesrs   rt   )ry   r|   r   r   rc   r   rd   from_column_indices   s   z"PandasLikeExpr.from_column_indicesrS   float | NonerT   rU   rV   rW   boolrH   rX   c             
   C  s   | j d|||||||dS )Nr2   )rS   rT   rU   rV   rW   rH   rX   )_reuse_series)ru   rS   rT   rU   rV   rW   rH   rX   rc   rc   rd   r2      s   zPandasLikeExpr.ewm_meanorder_bySequence[str]c                   s,   d fdd}j |jjjjdS )	Nr}   r   r7   Sequence[PandasLikeSeries]c                   s   t d| j}| j|d djddd} | j|gdd}j}|d ur;|jr;| jj j	
  fdd|D S | |}|D ]}||| qB|S )	N   r   Fr<   
nulls_lastT)strictc              	     s(   g | ]}| j|  |jd qS ))indexname)_with_nativeSeriesitemr   r   sr   nsrc   rd   r      r   zKPandasLikeExpr._over_without_partition_by.<locals>.func.<locals>.<listcomp>)r   columnswith_row_indexsortdrop	_metadatais_scalar_liker   r   rs   to_native_namespace
get_column_scatter_in_place)r}   tokenresultsmetasorting_indicesr   r   ru   r   rd   r      s    

z7PandasLikeExpr._over_without_partition_by.<locals>.funcr   r}   r   r7   r   )	__class__rq   rr   rs   rt   )ru   r   r   rc   r   rd   _over_without_partition_by   s   z)PandasLikeExpr._over_without_partition_bypartition_byc              
     s   ssJ  S jrjd urjjsd}t|tttj d }|j t	j
td }t |d u r[d  ddt ddt	j
 d}t||jt d f	dd}j|jjjjdS )NzOnly elementary expressions are supported for `.over` in pandas-like backends when `partition_by` is specified.

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

Supported functions are z, z
and .r}   r   r7   r   c                   s  d usJ 	  }jd ur| tdtd d |} t	| g \}}dkr5| |j|   } drEdv s@J d }ndvsKJ d}rwt	t
|}td|}| j| j|d dj||d	} | |}n|rt	t
|}| j| td d d} tdd
}| jjfi |}	dr|	t	| jd)i }
dv rdv sJ t|
d d}nt|
 }ndr	j r	j dk rd	j  d}t||	t	| jd)i }d usJ t| }ndkrAdv sJ dv sJ |	t	| }d dkr+|jd d}nd dkr;|jd d}n{d}t|dkr^t|dkrSd}t ||	!d"|d }nXdv rt#$  t#j%d d!d" t|	g | d)i }W d    n	1 sw   Y  |j&d#d#d$ t	}| j'| j(||d%t	| }n|	t	| j!fi }| )|  fd&d'|D }rt#$  t#j%d d!d" |D ]	}|*|| q|W  d    S 1 sw   Y  |rd(d' |D S |S )*Nrf   r   r,   rC   reverseFr   r   r   )drop_null_keysrolling>   r!   r"   rM   )rM   ewm)      zpExponentially weighted calculation is not available in over context for pandas versions older than 1.2.0, found r   r1   rN   rO   forward)rO   backwardzF`fill_null` with `over` without `strategy` specified is not supported.lenr   z)Safety check failed, please report a bug.sizer   >   r[   r>   r\   ignorez
.*copy of a slice)messageT)r   inplace)onc                   s   g | ]}  |qS rc   )r   )r   r   result_framerc   rd   r   }  s    z5PandasLikeExpr.over.<locals>.func.<locals>.<listcomp>c                 S  s   g | ]}| td d dqS )Nr   )_gather_sliceslicer   rc   rc   rd   r     s    rc   )+rx   prevwith_columnsr   r   r   colis_nullr]   listsetunionr   simple_selectr   r   r   r   r   r   r   groupbyr   getattrrs   	is_pandas_backend_versionr_   r   ffillbfillr   AssertionError	transformto_framewarningscatch_warningsfilterwarningsreset_indexr   merger   r   )r}   plx_aliasesr   r   r   r   group_by_kwargsgroupedr   
res_nativerb   r   
df_grouped_aggkeysr   r   	r3   r   nodesr   pandas_function_namer`   r   scalar_kwargsru   r   rd   r   '  s   












"z!PandasLikeExpr.over.<locals>.funcr   r   )r   r   r   is_elementwiser_   r   reversediter_nodes_reversedr   r
   _REMAP_AGGSr^   r   %WINDOW_FUNCTIONS_TO_PANDAS_EQUIVALENTjoinr5   re   r   rq   rr   rs   rt   )ru   r   r   rb   	leaf_node
pandas_aggr   rc   r   rd   over   sF   
	

bzPandasLikeExpr.overN)rg   rh   ri   rj   rk   rl   rm   r   rn   r   r7   ro   )r7   r   )ry   rz   r{   rj   r|   r   r7   r   )r   r   r|   r   r7   r   )rS   r   rT   r   rU   r   rV   r   rW   r   rH   r   rX   r   r7   r   )r   r   r7   r   )r   r   r   r   r7   r   )__name__
__module____qualname__rv   rx   classmethodr   r   r2   r   r   rc   rc   rc   rd   rf      s    



"rf   r   )r3   r4   r5   r6   r7   r8   )*
__future__r   r   typingr   r   r   narwhals._compliantr   narwhals._expression_parsingr   r   narwhals._pandas_like.group_byr	   r
   narwhals._pandas_like.seriesr   narwhals._pandas_like.utilsr   narwhals._utilsr   collections.abcr   typing_extensionsr   narwhals._compliant.typingr   r   r   r   narwhals._pandas_like.dataframer   rw   r   r   r   r   narwhals.typingr   r   re   rf   rc   rc   rc   rd   <module>   sF    
L