
    }i^B                    B   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r4d 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%Z( G 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                   | dk    rd|v sJ d|d         i}n| dk    r,d|v sJ d|v sJ |d         }|dk    rdn||d          d	d
d}n|                      d          rddi}ni| dk    rdd
i}n]|                      d          r,d|v sJ d|v sJ d|v sJ |d         |d         |d         d}n| dv rd|v sJ d|d         i}n| dk    rd|v sJ d|v sJ |d         |d         d}n| dk    rd|v sJ d|v sJ |d         |d         d}n|                      d          r_d |v sJ d!|v sJ d"|v sJ d#|v sJ d$|v sJ d|v sJ d%|v sJ |d          |d!         |d"         |d#         |d$         |d         |d%         d&}nJ| d'v rD|                    d%          rd(}t          |          dt          t	          d)|                    i}n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windowrL   >   r"   r#   ddofr2   strategylimit)rP   rQ   r(   interpolation)qrR   ewm_comspan	half_lifealphaadjustignore_nulls)rU   rV   halfliferX   rY   rM   	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   )r4   r6   pandas_kwargs_methodmsgs        N/home/jrussi/.local/lib/python3.11/site-packages/narwhals/_pandas_like/expr.py"window_kwargs_to_pandas_equivalentrf   3   s3    f}}}}3<fSk2J	&	 	 6!!!!v%%%%"!(I!5!5gg7#L11	
 
 
	!	!&	)	) 8!4(	*	$	$!5)		!	!*	-	- 4&&&&&&&&6!!!!!-0]+X&
 

 
.	(	(0	+	%	%V####&    %+J%7&/RR	*	$	$V####&((((
##O4
 
 
	!	!&	)	) f$$$$&    6!!!!&&&&'''' %=6N{+G_X&!-0/
 
 
8	8	8::n%% 	+3  &c***%d+@-&P&PQ
     c                  f    e Zd Zd*dZd+dZed,d            Zed-d            Zd.d#Zd/d&Z	d0d(Z
d)S )1PandasLikeExprcall1EvalSeries[PandasLikeDataFrame, PandasLikeSeries]evaluate_output_namesEvalNames[PandasLikeDataFrame]alias_output_namesAliasNames | Noneimplementationr   versionr   r8   Nonec               L    || _         || _        || _        || _        || _        d S )N)_call_evaluate_output_names_alias_output_names_implementation_version)selfrj   rl   rn   rp   rq   s         re   __init__zPandasLikeExpr.__init__   s.     
&;##5 -rg   r   c                <    ddl m}  || j        | j                  S )Nr   r   )rq   )narwhals._pandas_like.namespacer   rw   rx   )ry   r   s     re   __narwhals_namespace__z%PandasLikeExpr.__narwhals_namespace__   s/    GGGGGG""4#7OOOOrg   cls
type[Self]evaluate_column_namescontextr   r   c              D    dfd} | |d |j         |j                  S )Ndfr   r8   list[PandasLikeSeries]c                     	  fd            D             S # t           $ r)}                                           x}r|| d }~ww xY w)Nc                ^    g | ])}t          j        |         j        j                   *S ))rp   rq   )r   _native_framerw   rx   ).0column_namer   s     re   
<listcomp>zBPandasLikeExpr.from_column_names.<locals>.func.<locals>.<listcomp>   sP        $ %(5')'9 "    rg   )KeyError_check_columns_exist)r   eerrorr   s   `  re   funcz.PandasLikeExpr.from_column_names.<locals>.func   s        (='<R'@'@       334I4I"4M4MNNN5 'Q&s    
A$A		Arl   rn   rp   rq   r   r   r8   r   )rw   rx   )r~   r   r   r   s    `  re   from_column_namesz PandasLikeExpr.from_column_names   sQ    	 	 	 	 	 	 s"7#"2$
 
 
 	
rg   column_indicesintc               j    dfd} | ||                                d |j        |j                  S )Nr   r   r8   r   c                4      j          fdD             S )Nc                Z    g | ]'}t          j        j        d d |f                   (S )N)r   )r   from_nativeiloc)r   ir   natives     re   r   zDPandasLikeExpr.from_column_indices.<locals>.func.<locals>.<listcomp>   sH        !,V[A->KKK  rg   )r   )r   r   r   s   `@re   r   z0PandasLikeExpr.from_column_indices.<locals>.func   s<    YF    '   rg   r   r   )_eval_names_indicesrw   rx   )r~   r   r   r   s     ` re   from_column_indicesz"PandasLikeExpr.from_column_indices   s_    	 	 	 	 	 	 s"%"9"9."I"I#"2$
 
 
 	
rg   rU   float | NonerV   rW   rX   rY   boolrJ   rZ   c          
     <    |                      d|||||||          S )Nr3   )rU   rV   rW   rX   rY   rJ   rZ   )_reuse_series)ry   rU   rV   rW   rX   rY   rJ   rZ   s           re   r3   zPandasLikeExpr.ewm_mean   s9     !!#% " 	
 	
 		
rg   order_bySequence[str]c                p     d fd}                      | j         j         j         j                  S )Nr   r   r8   Sequence[PandasLikeSeries]c                   t          d| j                  } |                     |d           j        ddd}  	|                     |gd                    }	j        }|;|j        r4| j        j        	j	        
                                fd|D             S |                     |          }|D ]}|                    ||d           |S )	N   r   Fr>   
nulls_lastT)strictc           	         g | ]D}|                                         |                                |j                             ES ))indexname)_with_nativeSeriesitemr   )r   sr   nss     re   r   zKPandasLikeExpr._over_without_partition_by.<locals>.func.<locals>.<listcomp>   sQ        NN299QVVXXU9#P#PQQ  rg   in_place)r   columnswith_row_indexsortdrop	_metadatais_scalar_liker   r   rw   to_native_namespace
get_columnscatter)
r   tokenresultsmetasorting_indicesr   r   r   r   ry   s
         @@re   r   z7PandasLikeExpr._over_without_partition_by.<locals>.func   s   21bjAAE=""54"88=e  B d277E7478899G>DD$7 	)==??    $   
 !mmE22O = =		/1t	<<<<Nrg   r   r   r   r8   r   )	__class__ru   rv   rw   rx   )ry   r   r   s   `` re   _over_without_partition_byz)PandasLikeExpr._over_without_partition_by   s^    	 	 	 	 	 	 	, ~~"&"=#7/M  
 
 	
rg   partition_byc           
        	
 ssJ                                 S  j        r$j        j        j        sd}t	          |          t          t          t           j                                                                      		d         }|j        t          j
                            t          d                    }t                              |          

Pd dd                    t                     dd                    t          j
                   d}t	          |          |j        t!                    d	
 f	d}                     | j         j         j         j                  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   r8   r   c           
     
  	 J                                  }j        9|                     t          dt	          d d         |                              } t          | g           \  }}dk    r0|                      |j        |                                            }                     d          rdv sJ d         }ndvsJ d}rt          t                                        |                                                  }t          d|          }  | j        |                     |d           j        ||d	} |                     |          }n]|r[t          t                                        |                    } | j        |                     t%          d d d                    } t'          d
          } | j        j        fi |}	                    d          rf |	t          |                   j        d)i }
dv r(dv sJ  t/          |
          d                   }n t/          |
                      }n|                    d          rj                                        rIj                                        dk     r,dj                                         d}t7          |           |	t          |                   j        d)i }J  t/          |                      }nǉdk    rdv sJ dv sJ |	t          |                   }d         dk    r|                    d                   }nvd         dk    r|                    d                   }nLd}t7          |          dk    rSt?          |          dk    rd}tA          |          |	!                    d          "                    |d                   }ndv rtG          j$                    5  tG          j%        d d!"            t/          |	g |                   d)i }d d d            n# 1 swxY w Y   |&                    d#d#$           t                    }| j'        |         (                    ||%          t          |                   }n! |	t          |                   j!        fi }| )                    |          fd&|D             }r`tG          j$                    5  tG          j%        d d!"           |D ]}|*                    ||d#'           |cd d d            S # 1 swxY w Y   |rd( |D             S |S )*Nri   r   r-   rE   reverseFr   r   r   )drop_null_keysrolling>   r"   r#   rO   )rO   ewm)      zpExponentially weighted calculation is not available in over context for pandas versions older than 1.2.0, found r   r2   rP   rQ   forward)rQ   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                :    g | ]}                     |          S  )r   )r   r   result_frames     re   r   z5PandasLikeExpr.over.<locals>.func.<locals>.<listcomp>}  s'    III|..t44IIIrg   r   c           	     V    g | ]&}|                     t          d d d                    'S )Nr   )_gather_sliceslice)r   r   s     re   r   z5PandasLikeExpr.over.<locals>.func.<locals>.<listcomp>  s0    PPP1dD"(=(=>>PPPrg   r   )+r}   prevwith_columnsr   r   r	   colis_nullr_   listsetunionr   simple_selectr   r   r   r   r   r   r   groupbyr   getattrrw   	is_pandas_backend_versionra   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_nativerd   r   
df_grouped_aggkeysr   r   r   r4   r   nodesr   pandas_function_namerb   r   scalar_kwargsry   s                      @re   r   z!PandasLikeExpr.over.<locals>.func'  s   '333--//Cy$__)>%*c+J+JKK  ;4RHHJAw++__gcgw&7&?&?&A&A%ABB''//   M1111'	2 5555 Us<0066w??EEhOOPP6q'BB$B$g.#^ED^998GM M M 
 #%--"6"6 Us<0066w??@@%R%w/==eD$PR>S>STT2%HHHO.b&.|OOOOG''	22 48'$w--08II=II'>99!]2222!G2F!G!G*62" " "JJ "H2F!G!G!I!IJJ))%00 +'1133 3(99;;9 9zOSOcOtOtOvOvz z z  .c2220gd7mm,0AA=AA+777?WS*>??AA

+--!]2222-////$T']]3
 ,	99!+!1!1g8N!1!O!OJJ":.*<<!+!1!1g8N!1!O!OJJ cC-c222%''w<<1$$EC(---$..v66??
KK

"@@@,.. ' '+H>STTTT7 9, 9 9:<P  ' '%' 'D' ' ' ' ' ' ' ' ' ' ' ' ' ' '   dD 999L))Yt_224D2AA$w--P

=WT']]3=( ,9 
 ??:66LIIIIIIIG #,.. # #+H>STTTT$ E E		/1t	DDDD"# # # # # # # # # # # # # # # #  QPPPPPPNs$   7QQQ5UUUr   r   )r   r   r   is_elementwisera   r   reversediter_nodes_reversedr   r   _REMAP_AGGSr`   r   %WINDOW_FUNCTIONS_TO_PANDAS_EQUIVALENTjoinr6   rf   r   ru   rv   rw   rx   )ry   r   r   rd   	leaf_node
pandas_aggr   r4   r   r   r   rb   r   s   ```    @@@@@@re   overzPandasLikeExpr.over   s     	=OOO228<<< ~ 	+TY249;S2_  &c***Xd4>#E#E#G#GHHIIJJ"I	!&266&66
 

  EHH: 
  
  'C C C+/995Z+[+[C Cyy!2!>??C C C 
 &c***!(:=-XX`	 `	 `	 `	 `	 `	 `	 `	 `	 `	 `	 `	 `	 `	D ~~"&"=#7/M  
 
 	
rg   N)rj   rk   rl   rm   rn   ro   rp   r   rq   r   r8   rr   )r8   r   )r~   r   r   rm   r   r   r8   r   )r   r   r   r   r8   r   )rU   r   rV   r   rW   r   rX   r   rY   r   rJ   r   rZ   r   r8   r   )r   r   r8   r   )r   r   r   r   r8   r   )__name__
__module____qualname__rz   r}   classmethodr   r   r3   r   r	  r   rg   re   ri   ri      s               P P P P
 
 
 
 [
< 
 
 
 [
 
 
 
 
, 
  
  
  
DS
 S
 S
 S
 S
 S
rg   ri   r   )r4   r5   r6   r7   r8   r9   )*
__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   r|   r   r   r   r   narwhals.typingr   r  rf   ri   r   rg   re   <module>r     s   " " " " " "  + + + + + + + + + + ) ) ) ) ) ) Z Z Z Z Z Z Z Z R R R R R R R R 9 9 9 9 9 9 < < < < < < : : : : : : .((((((&&&&&&            DCCCCCCCCCCCHHHHHHHHHH------  %) ) %,I I I IXP
 P
 P
 P
 P
Y46FFG P
 P
 P
 P
 P
rg   