
    WhxY                       d dl mZ d dlmZmZ d dlmZ d dlmZm	Z	m
Z
mZmZ d dlmZmZ d dlmZmZmZ d dlmZmZ erBd dlmZ d d	lmZmZ d d
lmZmZ d dl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*m+Z+m,Z,  ed      Z-d"dZ.d#dZ/d$dZ0	 	 	 	 d%dZ1d&dZ2	 	 	 	 	 	 	 	 d'dZ3 G d de      Z4	 	 	 	 d(dZ5 G d de      Z6 G d d      Z7	 	 	 	 	 	 	 	 	 	 d)dZ8d*dZ9d+dZ:	 	 	 	 	 	 	 	 	 	 d,d Z;y!)-    )annotations)Enumauto)chain)TYPE_CHECKINGAnyCallableLiteralTypeVar)is_compliant_expr
zip_strict)is_narwhals_seriesis_numpy_arrayis_numpy_array_1d)InvalidOperationErrorMultiOutputExpressionError)Sequence)NeverTypeIs)CompliantExprCompliantFrameT)
AliasNamesCompliantExprAnyCompliantFrameAnyCompliantNamespaceAny	EvalNamesExprSeries)IntoExprNonNestedLiteral_1DArrayTc                &    ddl m} t        | |      S )'Check whether `obj` is a Narwhals Expr.r   r   )narwhals.exprr   
isinstance)objr   s     V/var/www/html/jupyter_env/lib/python3.12/site-packages/narwhals/_expression_parsing.pyis_exprr+   #   s    "c4      c                &    ddl m} t        | |      S )r&   r   r   )narwhals.seriesr    r(   )r)   r    s     r*   	is_seriesr/   *   s    &c6""r,   c                Z    ddl m} ddlm} t	        | ||t
        f      xs t        |       S )Nr   r   r   )r'   r   r.   r    r(   strr   )r)   r   r    s      r*   is_into_expr_eagerr2   1   s'    "&cFD#./I3DS3IIr,   c                 j     t         d         sdt         d          d}t        |      d fd}|S )Nr   z3Safety assertion failed, expected expression, got: z. Please report a bug.c                2    d   j                  |       d d S Nr      )_evaluate_output_names)dfexprss    r*   evaluate_output_namesz<combine_evaluate_output_names.<locals>.evaluate_output_namesA   s    Qx..r22A66r,   )r8   r   returnSequence[str])r   typeAssertionError)r9   msgr:   s   `  r*   combine_evaluate_output_namesr@   8   sA    
 U1X&CDqNCSSijS!!7 ! r,   c                 4      d   j                   y d fd}|S )Nr   c                2    d   j                  |       d d S r5   _alias_output_names)namesr9   s    r*   alias_output_namesz6combine_alias_output_names.<locals>.alias_output_namesM   s    Qx++E22A66r,   )rE   r<   r;   r<   rC   )r9   rF   s   ` r*   combine_alias_output_namesrG   G   s%     Qx##+7 r,   c                :   | j                  |      }| j                  |n| j                  |      }|r`| j                  J | j                  j                  j	                         r.t        t        ||      D cg c]  \  }}||vr||f c}} \  }}||fS c c}}w N)r7   rD   	_metadataexpansion_kindis_multi_unnamedr   )exprr8   excludeoutput_namesaliasesxaliass          r*   !evaluate_output_names_and_aliasesrS   S   s     ..r2L ##+ 	%%l3 
 ~~)))>>((99;$. %/|W$E 5' J%!L'   s   9B
c                     e Zd ZdZ e       Z	  e       Z	  e       Z	  e       Z	  e       Z		  e       Z
	  e       Z	  e       Z	  e       Z	  e       Z	 edd       Zedd       Zedd       Ze	 	 	 	 	 	 d	d       Zy)
ExprKindz6Describe which kind of expression we are dealing with.c                F    | t         j                  t         j                  hv S rI   )rU   LITERALAGGREGATIONselfs    r*   is_scalar_likezExprKind.is_scalar_like   s    (((*>*>???r,   c                F    | t         j                  t         j                  hv S rI   )rU   ORDERABLE_WINDOWORDERABLE_AGGREGATIONrY   s    r*   is_orderable_windowzExprKind.is_orderable_window   s    1183Q3QRRRr,   c                    |j                   }|j                  rt        j                  S |j                  rt        j
                  S |j                  rt        j                  S t        j                  S rI   )	rJ   
is_literalrU   rW   r[   rX   is_elementwiseELEMENTWISEUNKNOWN)clsr)   metas      r*   	from_exprzExprKind.from_expr   sT    }}??###''''''r,   c                   t        |      r| j                  |      S t        |      st        |      st	        |t
              r|st        j                  S t        j                  S rI   )	r+   rg   r   r   r(   r1   rU   rc   rW   )re   r)   
str_as_lits      r*   from_into_exprzExprKind.from_into_expr   sN     3<==%%s#c"3$Z'''r,   Nr;   bool)r)   r   r;   rU   )r)   &IntoExpr | NonNestedLiteral | _1DArrayri   rl   r;   rU   )__name__
__module____qualname____doc__r   rW   rX   r^   rc   r]   WINDOW
FILTRATIONORDERABLE_FILTRATIONOVERrd   propertyr[   r_   classmethodrg   rj    r,   r*   rU   rU   i   s    @fG&KY FX&KgvHVFNJG6=6D5fGL@ @ S S      8 IM 	   r,   rU   c                    | j                   S rI   r[   )r)   s    r*   r[   r[      s     r,   c                  X    e Zd ZdZ e       Z	  e       Z	  e       Z	 ddZddZ	ddZ
y)ExpansionKindz8Describe what kind of expansion the expression performs.c                &    | t         j                  u S rI   )r|   MULTI_UNNAMEDrY   s    r*   rL   zExpansionKind.is_multi_unnamed   s    }2222r,   c                F    | t         j                  t         j                  hv S rI   )r|   MULTI_NAMEDr~   rY   s    r*   is_multi_outputzExpansionKind.is_multi_output   s    11=3N3NOOOr,   c                    | t         j                  u r"|t         j                  u rt         j                  S d|  d| d}t        |      )Nz+Unsupported ExpansionKind combination, got z and z, please report a bug.)r|   r~   r>   )rZ   otherr?   s      r*   __and__zExpansionKind.__and__   sI    =...5M<W<W3W ...;D6ugMcdS!!r,   Nrk   )r   r|   r;   z$Literal[ExpansionKind.MULTI_UNNAMED])rn   ro   rp   rq   r   SINGLEr   r~   rL   r   r   rx   r,   r*   r|   r|      s3    BVF9&K!FM'3P"r,   r|   c                  6   e Zd ZdZdZddddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZddZdd	Zedd
       Z	d dZ
d dZd dZd dZd dZd dZd dZd dZd dZed d       Zed d       Zed d       Zed d       Zed d       Zed!d       Zed"d       Zy)#ExprMetadataa  Expression metadata.

    Parameters:
        expansion_kind: What kind of expansion the expression performs.
        has_windows: Whether it already contains window functions.
        is_elementwise: Whether it can operate row-by-row without context
            of the other rows around it.
        is_literal: Whether it is just a literal wrapped in an expression.
        is_scalar_like: Whether it is a literal or an aggregation.
        last_node: The ExprKind of the last node.
        n_orderable_ops: The number of order-dependent operations. In the
            lazy case, this number must be `0` by the time the expression
            is evaluated.
        preserves_length: Whether the expression preserves the input length.
    )rK   has_windowsrb   ra   r[   	last_noden_orderable_opspreserves_lengthFr   Tr   r   r   rb   r[   ra   c                   |r|sJ |r|sJ || _         || _        || _        || _        || _        || _        || _        || _        y rI   rK   r   r   r   rb   r   r[   ra   )	rZ   rK   r   r   r   r   rb   r[   ra   s	            r*   __init__zExprMetadata.__init__   sY     !!>###-;#,!,$3$2&6$2 *r,   c               6    d| j                   }t        |      )NzCannot subclass )rn   	TypeError)re   argskwdsr?   s       r*   __init_subclass__zExprMetadata.__init_subclass__  s      01nr,   c                    d| j                    d| j                   d| j                   d| j                   d| j                   d| j
                   d| j                   d| j                   d	S )
Nz ExprMetadata(
  expansion_kind: z,
  last_node: z,
  has_windows: z,
  n_orderable_ops: z,
  is_elementwise: z,
  preserves_length: z,
  is_scalar_like: z,
  is_literal: z,
)r   rY   s    r*   __repr__zExprMetadata.__repr__  s    !!%!4!4 5 6 NN+ ,"../ 0""&"6"6!7 8!!%!4!4 5 6##'#8#8"9 :!!%!4!4 5 6!__- .		
r,   c                :    | j                    xr | j                   S rI   )r   r[   rY   s    r*   is_filtrationzExprMetadata.is_filtration  s    (((D1D1D-DDr,   c           
         | j                   rd}t        |      t        | j                  t        j
                  | j                  | j                  dddd      S )N4Can't apply aggregations to scalar-like expressions.FTr   )r[   r   r   rK   rU   rX   r   r   rZ   r?   s     r*   with_aggregationzExprMetadata.with_aggregation  sX    HC',,  (( 00" 	
 		
r,   c           
         | j                   rd}t        |      t        | j                  t        j
                  | j                  | j                  dz   dddd      S )Nr   r6   FTr   )r[   r   r   rK   rU   r^   r   r   r   s     r*   with_orderable_aggregationz'ExprMetadata.with_orderable_aggregation'  s]    HC',,**(( 0014" 	
 		
r,   c           
         t        | j                  t        j                  | j                  | j
                  | j                  | j                  | j                  | j                        S )Nr   )
r   rK   rU   rc   r   r   r   rb   r[   ra   rY   s    r*   with_elementwise_opz ExprMetadata.with_elementwise_op7  sU      (( 00!22....	
 		
r,   c           
         | j                   rd}t        |      t        | j                  t        j
                  | j                  | j                  | j                  ddd      S )Nz;Can't apply window (e.g. `rank`) to scalar-like expression.Fr   )	r[   r   r   rK   rU   rr   r   r   r   r   s     r*   with_windowzExprMetadata.with_windowC  s^    OC',,OO(( !00!22  
 	
r,   c           
         | j                   rd}t        |      t        | j                  t        j
                  | j                  | j                  dz   | j                  ddd      S )NzNCan't apply orderable window (e.g. `diff`, `shift`) to scalar-like expression.r6   Fr   )	r[   r   r   rK   rU   r]   r   r   r   r   s     r*   with_orderable_windowz"ExprMetadata.with_orderable_windowU  sc    bC',,%%(( 0014!22  	
 		
r,   c           
     x   | j                   rd}t        |      | j                  s| j                  rd}t        |      | j                  }|s)| j
                  t        j                  urd}t        |      | j
                  j                  r|dz  }t        | j                  t        j                  d|dddd      S )NCannot nest `over` statements.oCannot use `over` on expressions which are elementwise
(e.g. `abs`) or which change length (e.g. `drop_nulls`).aP  Cannot use `order_by` in `over` on expression which isn't orderable.
If your expression is orderable, then make sure that `over(order_by=...)`
comes immediately after the order-dependent expression.

Hint: instead of
  - `(nw.col('price').diff() + 1).over(order_by='date')`
write:
  + `nw.col('price').diff().over(order_by='date') + 1`
r6   TFr   )r   r   rb   r   r   r   rU   rr   r_   r   rK   ru   )rZ   r?   r   s      r*   with_ordered_overzExprMetadata.with_ordered_overe  s    2C',,$"4"4K  (,,..4>>#HK  (,,>>--q OMM+!  	
 		
r,   c           
         | j                   rd}t        |      | j                  s| j                  rd}t        |      t	        | j
                  t        j                  d| j                  dddd      S )Nr   r   TFr   )	r   r   rb   r   r   rK   rU   ru   r   r   s     r*   with_partitioned_overz"ExprMetadata.with_partitioned_over  sy    2C',,$"4"4K  (,,MM 00!  	
 		
r,   c           
         | j                   rd}t        |      t        | j                  t        j
                  | j                  | j                  dddd      S )NECan't apply filtration (e.g. `drop_nulls`) to scalar-like expression.Fr   )r[   r   r   rK   rU   rs   r   r   r   s     r*   with_filtrationzExprMetadata.with_filtration  sX    YC',,(( 00"  	
 		
r,   c           
         | j                   rd}t        |      t        | j                  t        j
                  | j                  | j                  dz   dddd      S )Nr   r6   Fr   )r[   r   r   rK   rU   rt   r   r   r   s     r*   with_orderable_filtrationz&ExprMetadata.with_orderable_filtration  s]    YC',,))(( 0014"  	
 		
r,   c                 Z    t        t        j                  t        j                  ddd      S )NFT)rb   r   r[   )r   r|   r   rU   rX   rx   r,   r*   aggregationzExprMetadata.aggregation  s*         "
 	
r,   c                 \    t        t        j                  t        j                  dddd      S )NFT)rb   r   ra   r[   )r   r|   r   rU   rW   rx   r,   r*   literalzExprMetadata.literal  s-       "
 	
r,   c                 R    t        t        j                  t        j                        S rI   )r   r|   r   rU   rc   rx   r,   r*   selector_singlezExprMetadata.selector_single  s     M00(2F2FGGr,   c                 R    t        t        j                  t        j                        S rI   )r   r|   r   rU   rc   rx   r,   r*   selector_multi_namedz!ExprMetadata.selector_multi_named  s     M55x7K7KLLr,   c                 R    t        t        j                  t        j                        S rI   )r   r|   r~   rU   rc   rx   r,   r*   selector_multi_unnamedz#ExprMetadata.selector_multi_unnamed  s     M779M9MNNr,   c               "    t        ||ddd      S )NTFri   allow_multi_outputto_single_outputcombine_metadata)re   lhsrhss      r*   from_binary_opzExprMetadata.from_binary_op  s      %RW
 	
r,   c                    t        |ddddS )NFTr   r   )re   r9   s     r*   from_horizontal_opzExprMetadata.from_horizontal_op  s    uPT
 	
r,   N)rK   r|   r   rU   r   rl   r   intr   rl   rb   rl   r[   rl   ra   rl   r;   None)r   r   r   r   r;   r   )r;   r1   rk   )r;   r   )r   r   r   r!   r;   r   )r9   r!   r;   r   )rn   ro   rp   rq   	__slots__r   r   r   rv   r   r   r   r   r   r   r   r   r   r   staticmethodr   r   r   r   r   rw   r   r   rx   r,   r*   r   r      s_    	I  " !%#$ +%+ +
 + + + + + + 
+2
 E E

 


$
 !
F
*

 
 
 
 
 H H M M O O 
 
 
 
r,   r   c           
        d}t         j                  }d}d}d}d}	d}
d}t        |      D ]  \  }}t        |t              r| rt        |      rd}d}
d}*t        |      s6|j                  }|j                  j                         r.|j                  }|dkD  r|sd}t        |      |s|dkD  r||z  n|}||j                  z  }||j                  z  }||j                  z  }|	|j                  z  }	|
|j                  z  }
||j                   z  }|t#        |j$                        z  } |dkD  rd}t'        |      |r|rd}t'        |      t)        |t*        j,                  ||||	|
|      S )	a  Combine metadata from `args`.

    Arguments:
        args: Arguments, maybe expressions, literals, or Series.
        str_as_lit: Whether to interpret strings as literals or as column names.
        allow_multi_output: Whether to allow multi-output inputs.
        to_single_output: Whether the result is always single-output, regardless
            of the inputs (e.g. `nw.sum_horizontal`).
    r   FTz]Multi-output expressions (e.g. nw.col('a', 'b'), nw.all()) are not supported in this context.r6   zXLength-changing expressions can only be used in isolation, or followed by an aggregationzVCannot combine length-changing expressions with length-preserving ones or aggregationsr   )r|   r   	enumerater(   r1   r/   r+   rJ   rK   r   r   r   r   r   rb   r[   ra   r   r   r   r   rU   rc   )ri   r   r   r   n_filtrationsresult_expansion_kindresult_has_windowsresult_n_orderable_opsresult_preserves_lengthresult_is_elementwiseresult_is_scalar_likeresult_is_literaliargmetadatarK   r?   s                    r*   r   r     s    M)00#  D/ 93sC 	#&*#$)! %S\}}H&&668!)!8!8q5!3=  5S99' q5 .>+ * ("6"66"h&>&>>"#x'@'@@#!X%<%<<!!X%<%<<!!4!44S!7!788M;9> qh#C((=f#C((&.0,,$
 
r,   c                \    ddl m t        fd|D              sd|  d}t        |      y )Nr   r   c              3     K   | ];  }t        |      xr |j                  j                  xs t        |t        f       = y wrI   )r+   rJ   r   r(   r1   ).0rQ   r    s     r*   	<genexpr>z4check_expressions_preserve_length.<locals>.<genexpr>C  s?       
	444UAV}9UUs   AAzBExpressions which aggregate or change length cannot be passed to 'z'.)r.   r    allr   )function_namer   r?   r    s      @r*   !check_expressions_preserve_lengthr   =  sA     '   SS`Raacd#C((r,   c                 Z    t        | |j                               }t        d |D              S )Nc              3  b   K   | ]'  }t        |      xr |j                  j                   ) y wrI   )r+   rJ   r[   )r   rQ   s     r*   r   z,all_exprs_are_scalar_like.<locals>.<genexpr>P  s&     HQwqz8akk888Hs   -/)r   valuesr   )r   kwargsr9   s      r*   all_exprs_are_scalar_liker   K  s'     $(EH%HHHr,   c                   | j                   fd|D        }|D cg c]  }t        j                  |       }}t        d |D              fdt	        ||      D        } || S c c}w )Nc              3  2   K   | ]  } |         yw)ri   Nrx   )r   intoparseri   s     r*   r   z(apply_n_ary_operation.<locals>.<genexpr>Z  s     QduTj99Qs   r   c              3  6   K   | ]  }|j                      y wrI   rz   )r   kinds     r*   r   z(apply_n_ary_operation.<locals>.<genexpr>`  s     >+++>s   c              3  z   K   | ]2  \  }}r't        |      rt        |      r|j                  |      n| 4 y wrI   )r   r[   	broadcast)r   compliant_exprr   r   s      r*   r   z(apply_n_ary_operation.<locals>.<genexpr>a  sF       !ND *>:~d?S 	  &	s   8;)parse_into_exprrU   rj   anyr   )	plxn_ary_functionri   
comparandscompliant_exprs	comparandkindsr   r   s	     `    @@r*   apply_n_ary_operationr   S  s     EQjQO $ 		jAE 
 >>>I %/$F	O ?++s   A,N)r)   r   r;   zTypeIs[Expr])r)   r   r;   zTypeIs[Series[Any]])r)   r   r;   z+TypeIs[Expr | Series[Any] | str | _1DArray])r9   z#CompliantExpr[CompliantFrameT, Any]r;   zEvalNames[CompliantFrameT])r9   r   r;   zAliasNames | None)rM   r   r8   r   rN   r<   r;   z#tuple[Sequence[str], Sequence[str]])r)   rU   r;   z7TypeIs[Literal[ExprKind.LITERAL, ExprKind.AGGREGATION]])
r   zIntoExpr | object | Noneri   rl   r   rl   r   rl   r;   r   )r   r!   r   r1   r;   r   )r   r!   r   r!   r;   rl   )
r   r   r   zCallable[..., CompliantExprAny]r   rm   ri   rl   r;   r   )<
__future__r   enumr   r   	itertoolsr   typingr   r   r	   r
   r   narwhals._utilsr   r   narwhals.dependenciesr   r   r   narwhals.exceptionsr   r   collections.abcr   typing_extensionsr   r   narwhals._compliantr   r   narwhals._compliant.typingr   r   r   r   r   r'   r   r.   r    narwhals.typingr!   r"   r#   r$   r+   r/   r2   r@   rG   rS   rU   r[   r|   r   r   r   r   r   rx   r,   r*   <module>r     sS  
 #   A A 9 W W Q(/B  #&DDA!#J!/!!	!
! 1!<I!(!,@ t @ F	<"D "6^
 ^
B	L#LL L 	L
 L^)I,	,3, 8, 	,
 ,r,   