Ë
    z�h…™ ã                  ój  — U 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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lm Z  d dl!m"Z" d dl#m$Z$ d dl#m%Z% d dl#m&Z& er‡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m0Z0 d d#l1m2Z2 d d$l1m3Z3 d d%l1m4Z4 d d&l1m5Z5 d d'l1m6Z6 d d(l1m7Z7 d d)l1m8Z8 d d*l1m9Z9  e*d+«      Z: e'd,«      Z;ee/eef   ge.eef   f   Z<d-e=d.<    G d/„ d0«      Z>d0gZ?y1)2é    )Úannotations)ÚTYPE_CHECKING)ÚAny)ÚCallable)ÚIterable)ÚMapping)ÚSequence)ÚExprKind)ÚExprMetadata)Ú
WindowKind©Úapply_n_ary_operation)Úcombine_metadata)Úextract_compliant)Ú_validate_dtype)ÚInvalidOperationError)ÚLengthChangingExprError©ÚExprCatNamespace©ÚExprDateTimeNamespace©ÚExprListNamespace©ÚExprNameNamespace©ÚExprStringNamespace©ÚExprStructNamespace)Ú	to_native)Ú_validate_rolling_arguments)Úflatten)Úissue_deprecation_warning)ÚTypeVar)ÚConcatenate)Ú	ParamSpec)ÚSelf)Ú	TypeAlias)ÚCompliantExpr)ÚCompliantNamespace)ÚDType)ÚClosedInterval)ÚFillNullStrategy)ÚIntoExpr)ÚNonNestedLiteral)ÚNumericLiteral)Ú
RankMethod)ÚRollingInterpolationMethod)ÚTemporalLiteralÚPSÚRr(   Ú_ToCompliantc                  óØ  — e Zd Zdpd„Zdqd„Zdqd„Z	 	 	 	 dqd„Zdqd„Zdrd„Zdsd„Z	dtd„Z
	 	 	 	 	 	 	 	 dud	„Zdvd
„Zdwd„Zdwd„Zdxd„Zdxd„Zdxd„Zdxd„Zdxd„Zdxd„Zdxd„Zdxd„Zdxd„Zdxd„Zdxd„Zdxd„Zdxd„Zdxd„Zdxd„Zdxd„Zdxd„Zdxd„Z dxd„Z!dxd „Z"dxd!„Z#dxd"„Z$dsd#„Z%dsd$„Z&dsd%„Z'd&d&d&d&d'd(d)d*œ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dyd+„Z(dsd,„Z)dsd-„Z*d(d.œdzd/„Z+d(d.œdzd0„Z,	 d{	 	 	 	 	 d|d1„Z-dsd2„Z.d}d3„Z/dsd4„Z0dsd5„Z1dsd6„Z2dsd7„Z3dsd8„Z4dsd9„Z5dsd:„Z6dsd;„Z7d)d<œd~d=„Z8dsd>„Z9dd?„Z:	 d{d&d@œ	 	 	 	 	 	 	 d€dA„Z;d)d)dBœd�dC„Z<	 d‚	 	 	 	 	 	 	 dƒdD„Z=dxdE„Z>d„dF„Z?dsdG„Z@dsdH„ZAdsdI„ZB	 	 	 d…	 	 	 	 	 	 	 d†dJ„ZCdsdK„ZD	 d{d&d)d&dLœ	 	 	 	 	 	 	 	 	 d‡dM„ZEd&dNœ	 	 	 	 	 dˆdO„ZFdsdP„ZGdsdQ„ZHdsdR„ZIdsdS„ZJdsdT„ZK	 	 	 	 	 	 d‰dU„ZLdŠddV„ZMdŠddW„ZNd‹dŒdX„ZOdsdY„ZPd‹d�dZ„ZQ	 	 dŽ	 	 	 	 	 d�d[„ZRdsd\„ZSdsd]„ZTd)d<œd~d^„ZUd)d<œd~d_„ZVd)d<œd~d`„ZWd)d<œd~da„ZXd&d)dbœ	 	 	 	 	 	 	 d�dc„ZYd&d)dbœ	 	 	 	 	 	 	 d�dd„ZZd&d)d(deœ	 	 	 	 	 	 	 	 	 d‘df„Z[d&d)d(deœ	 	 	 	 	 	 	 	 	 d‘dg„Z\d’d)dhœd“di„Z]e^d”dj„«       Z_e^d•dk„«       Z`e^d–dl„«       Zae^d—dm„«       Zbe^d˜dn„«       Zce^d™do„«       Zdy&)šÚExprc                ó2   ‡ ‡— dˆ ˆfd„}|‰ _         |‰ _        y )Nc                ó:   •—  ‰| «      }‰j                   |_         |S ©N©Ú	_metadata)ÚplxÚresultÚselfÚto_compliant_exprs     €€úK/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/narwhals/expr.pyÚfunczExpr.__init__.<locals>.func<   s   ø€ Ù& sÓ+ˆFØ#Ÿ~™~ˆFÔØˆMó    )r>   zCompliantNamespace[Any, Any]ÚreturnúCompliantExpr[Any, Any])Ú_to_compliant_exprr=   )r@   rA   ÚmetadatarC   s   ``  rB   Ú__init__zExpr.__init__:   s   ù€ ö	ð
 15ˆÔØ!ˆ�rD   c                óô   — | j                   j                  j                  «       r9| j                  || j                   j	                  t
        j                  «      «      S | j                  || j                   «      S r;   )r=   ÚkindÚ	is_windowÚ	__class__Ú with_kind_and_uncloseable_windowr
   Ú	TRANSFORM)r@   rA   s     rB   Ú_with_callablezExpr._with_callableD   s`   € ð �>‰>×Ñ×(Ñ(Ô*ð —>‘>Ø!Ø—‘×?Ñ?Ä×@RÑ@RÓSóð ð �~‰~Ð/°·±Ó@Ð@rD   c                óÖ   — | j                   j                  j                  «       rd}t        |«      ‚| j	                  || j                   j                  t        j                  «      «      S ©Nz9Aggregations can't be applied to scalar-like expressions.)r=   rK   Úis_scalar_liker   rM   Ú	with_kindr
   ÚAGGREGATION©r@   rA   Úmsgs      rB   Ú_with_aggregationzExpr._with_aggregationP   sS   € Ø�>‰>×Ñ×-Ñ-Ô/ØMˆCÜ'¨Ó,Ð,Ø�~‰~Ø˜tŸ~™~×7Ñ7¼×8LÑ8LÓMó
ð 	
rD   c                óÖ   — | j                   j                  j                  «       rd}t        |«      ‚| j	                  || j                   j                  t        j                  «      «      S rR   )r=   rK   rS   r   rM   Úwith_kind_and_closeable_windowr
   rU   rV   s      rB   Ú!_with_order_dependent_aggregationz&Expr._with_order_dependent_aggregationX   sV   € ð �>‰>×Ñ×-Ñ-Ô/ØMˆCÜ'¨Ó,Ð,Ø�~‰~ØØ�N‰N×9Ñ9¼(×:NÑ:NÓOó
ð 	
rD   c                óÖ   — | j                   j                  j                  «       rd}t        |«      ‚| j	                  || j                   j                  t        j                  «      «      S )Nz<Length-changing can't be applied to scalar-like expressions.)r=   rK   rS   r   rM   rT   r
   Ú
FILTRATIONrV   s      rB   Ú_with_filtrationzExpr._with_filtrationc   sS   € Ø�>‰>×Ñ×-Ñ-Ô/ØPˆCÜ'¨Ó,Ð,Ø�~‰~Ø˜tŸ~™~×7Ñ7¼×8KÑ8KÓLó
ð 	
rD   c                ó"   — d| j                   › d�S )NzNarwhals Expr
metadata: ú
r<   ©r@   s    rB   Ú__repr__zExpr.__repr__k   s   € Ø*¨4¯>©>Ð*:¸"Ð=Ð=rD   c                ó,   ‡ — ‰ j                  ˆ fd„«      S )Nc                ó^   •— ‰j                  | «      j                  «       j                  «       S r;   )rG   ÚabsÚsum©r>   r@   s    €rB   ú<lambda>z$Expr._taxicab_norm.<locals>.<lambda>r   s$   ø€ ˜×/Ñ/°Ó4×8Ñ8Ó:×>Ñ>Ó@€ rD   ©rX   ra   s   `rB   Ú_taxicab_normzExpr._taxicab_normn   s   ø€ ð ×%Ñ%Û@ó
ð 	
rD   c                ó0   ‡ ‡— ‰ j                  ˆˆ fd„«      S )uÄ  Rename the expression.

        Arguments:
            name: The new name.

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1, 2], "b": [4, 5]})
            >>> df = nw.from_native(df_native)
            >>> df.select((nw.col("b") + 10).alias("c"))
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |Narwhals DataFrame|
            |------------------|
            |          c       |
            |      0  14       |
            |      1  15       |
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óD   •— ‰j                  | «      j                  ‰«      S r;   )rG   Úalias)r>   Únamer@   s    €€rB   rh   zExpr.alias.<locals>.<lambda>�   s   ø€ ¨t×/FÑ/FÀsÓ/K×/QÑ/QÐRVÓ/W€ rD   ©rP   )r@   rn   s   ``rB   rm   z
Expr.aliasv   s   ù€ ð. ×"Ñ"Ô#WÓXÐXrD   c                ó   —  || g|¢­i |¤ŽS )uŽ  Pipe function call.

        Arguments:
            function: Function to apply.
            args: Positional arguments to pass to function.
            kwargs: Keyword arguments to pass to function.

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1, 2, 3, 4]})
            >>> df = nw.from_native(df_native)
            >>> df.with_columns(a_piped=nw.col("a").pipe(lambda x: x + 1))
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |Narwhals DataFrame|
            |------------------|
            |     a  a_piped   |
            |  0  1        2   |
            |  1  2        3   |
            |  2  3        4   |
            |  3  4        5   |
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        © )r@   ÚfunctionÚargsÚkwargss       rB   Úpipez	Expr.pipe�   s   € ñ@ ˜Ð.˜tÒ. vÑ.Ð.rD   c                óF   ‡ ‡— t        ‰«       ‰ j                  ˆˆ fd„«      S )u=  Redefine an object's data type.

        Arguments:
            dtype: Data type that the object will be cast into.

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"foo": [1, 2, 3], "bar": [6.0, 7.0, 8.0]})
            >>> df = nw.from_native(df_native)
            >>> df.select(nw.col("foo").cast(nw.Float32), nw.col("bar").cast(nw.UInt8))
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |Narwhals DataFrame|
            |------------------|
            |      foo  bar    |
            |   0  1.0    6    |
            |   1  2.0    7    |
            |   2  3.0    8    |
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óD   •— ‰j                  | «      j                  ‰«      S r;   )rG   Úcast)r>   Údtyper@   s    €€rB   rh   zExpr.cast.<locals>.<lambda>Ê   s   ø€ ¨t×/FÑ/FÀsÓ/K×/PÑ/PÐQVÓ/W€ rD   )r   rP   )r@   ry   s   ``rB   rx   z	Expr.cast±   s   ù€ ô0 	˜ÔØ×"Ñ"Ô#WÓXÐXrD   c                óZ   ‡ ‡— ‰ j                  ˆˆ fd„t        j                  ‰ ‰«      «      S )Nc                ó&   •— t        | d„ ‰‰d¬«      S )Nc                ó   — | |k(  S r;   rq   ©ÚxÚys     rB   rh   z/Expr.__eq__.<locals>.<lambda>.<locals>.<lambda>Ð   ó
   €  ! q¡&€ rD   T©Ú
str_as_litr   ©r>   Úotherr@   s    €€rB   rh   zExpr.__eq__.<locals>.<lambda>Ï   ó   ø€ Ô-ØÑ(¨$°À$ô€ rD   ©rM   r   Úfrom_binary_op©r@   r„   s   ``rB   Ú__eq__zExpr.__eq__Í   ó+   ù€ Ø�~‰~ôô ×'Ñ'¨¨eÓ4ó	
ð 	
rD   c                óZ   ‡ ‡— ‰ j                  ˆˆ fd„t        j                  ‰ ‰«      «      S )Nc                ó&   •— t        | d„ ‰‰d¬«      S )Nc                ó   — | |k7  S r;   rq   r}   s     rB   rh   z/Expr.__ne__.<locals>.<lambda>.<locals>.<lambda>Ø   r€   rD   Tr�   r   rƒ   s    €€rB   rh   zExpr.__ne__.<locals>.<lambda>×   r…   rD   r†   rˆ   s   ``rB   Ú__ne__zExpr.__ne__Õ   rŠ   rD   c                óZ   ‡ ‡— ‰ j                  ˆˆ fd„t        j                  ‰ ‰«      «      S )Nc                ó&   •— t        | d„ ‰‰d¬«      S )Nc                ó   — | |z  S r;   rq   r}   s     rB   rh   z0Expr.__and__.<locals>.<lambda>.<locals>.<lambda>à   ó
   €  ! a¡%€ rD   Tr�   r   rƒ   s    €€rB   rh   zExpr.__and__.<locals>.<lambda>ß   ó   ø€ Ô-ØÑ'¨¨uÀô€ rD   r†   rˆ   s   ``rB   Ú__and__zExpr.__and__Ý   rŠ   rD   c                ó*   — | |z  j                  d«      S ©NÚliteral©rm   rˆ   s     rB   Ú__rand__zExpr.__rand__å   ó   € Ø�u‘×#Ñ# IÓ.Ð.rD   c                óZ   ‡ ‡— ‰ j                  ˆˆ fd„t        j                  ‰ ‰«      «      S )Nc                ó&   •— t        | d„ ‰‰d¬«      S )Nc                ó   — | |z  S r;   rq   r}   s     rB   rh   z/Expr.__or__.<locals>.<lambda>.<locals>.<lambda>ë   r’   rD   Tr�   r   rƒ   s    €€rB   rh   zExpr.__or__.<locals>.<lambda>ê   r“   rD   r†   rˆ   s   ``rB   Ú__or__zExpr.__or__è   rŠ   rD   c                ó*   — | |z  j                  d«      S r–   r˜   rˆ   s     rB   Ú__ror__zExpr.__ror__ð   rš   rD   c                óZ   ‡ ‡— ‰ j                  ˆˆ fd„t        j                  ‰ ‰«      «      S )Nc                ó&   •— t        | d„ ‰‰d¬«      S )Nc                ó   — | |z   S r;   rq   r}   s     rB   rh   z0Expr.__add__.<locals>.<lambda>.<locals>.<lambda>ö   r’   rD   Tr�   r   rƒ   s    €€rB   rh   zExpr.__add__.<locals>.<lambda>õ   r“   rD   r†   rˆ   s   ``rB   Ú__add__zExpr.__add__ó   rŠ   rD   c                ó*   — | |z   j                  d«      S r–   r˜   rˆ   s     rB   Ú__radd__zExpr.__radd__û   rš   rD   c                óZ   ‡ ‡— ‰ j                  ˆˆ fd„t        j                  ‰ ‰«      «      S )Nc                ó&   •— t        | d„ ‰‰d¬«      S )Nc                ó   — | |z
  S r;   rq   r}   s     rB   rh   z0Expr.__sub__.<locals>.<lambda>.<locals>.<lambda>  r’   rD   Tr�   r   rƒ   s    €€rB   rh   zExpr.__sub__.<locals>.<lambda>   r“   rD   r†   rˆ   s   ``rB   Ú__sub__zExpr.__sub__þ   rŠ   rD   c                óZ   ‡ ‡— ‰ j                  ˆˆ fd„t        j                  ‰ ‰«      «      S )Nc                ó&   •— t        | d„ ‰‰d¬«      S )Nc                ó$   — | j                  |«      S r;   )Ú__rsub__r}   s     rB   rh   z1Expr.__rsub__.<locals>.<lambda>.<locals>.<lambda>
  ó   € ˜QŸZ™Z¨›]€ rD   Tr�   r   rƒ   s    €€rB   rh   zExpr.__rsub__.<locals>.<lambda>  ó   ø€ Ô-ØÙ*ØØØô€ rD   r†   rˆ   s   ``rB   r®   zExpr.__rsub__  ó+   ù€ Ø�~‰~ôô ×'Ñ'¨¨eÓ4ó	
ð 		
rD   c                óZ   ‡ ‡— ‰ j                  ˆˆ fd„t        j                  ‰ ‰«      «      S )Nc                ó&   •— t        | d„ ‰‰d¬«      S )Nc                ó   — | |z  S r;   rq   r}   s     rB   rh   z4Expr.__truediv__.<locals>.<lambda>.<locals>.<lambda>  r’   rD   Tr�   r   rƒ   s    €€rB   rh   z"Expr.__truediv__.<locals>.<lambda>  r“   rD   r†   rˆ   s   ``rB   Ú__truediv__zExpr.__truediv__  rŠ   rD   c                óZ   ‡ ‡— ‰ j                  ˆˆ fd„t        j                  ‰ ‰«      «      S )Nc                ó&   •— t        | d„ ‰‰d¬«      S )Nc                ó$   — | j                  |«      S r;   )Ú__rtruediv__r}   s     rB   rh   z5Expr.__rtruediv__.<locals>.<lambda>.<locals>.<lambda>  s   € ˜QŸ^™^¨AÓ.€ rD   Tr�   r   rƒ   s    €€rB   rh   z#Expr.__rtruediv__.<locals>.<lambda>  s   ø€ Ô-ØÙ.ØØØô€ rD   r†   rˆ   s   ``rB   r¹   zExpr.__rtruediv__  r±   rD   c                óZ   ‡ ‡— ‰ j                  ˆˆ fd„t        j                  ‰ ‰«      «      S )Nc                ó&   •— t        | d„ ‰‰d¬«      S )Nc                ó   — | |z  S r;   rq   r}   s     rB   rh   z0Expr.__mul__.<locals>.<lambda>.<locals>.<lambda>)  r’   rD   Tr�   r   rƒ   s    €€rB   rh   zExpr.__mul__.<locals>.<lambda>(  r“   rD   r†   rˆ   s   ``rB   Ú__mul__zExpr.__mul__&  rŠ   rD   c                ó*   — | |z  j                  d«      S r–   r˜   rˆ   s     rB   Ú__rmul__zExpr.__rmul__.  rš   rD   c                óZ   ‡ ‡— ‰ j                  ˆˆ fd„t        j                  ‰ ‰«      «      S )Nc                ó&   •— t        | d„ ‰‰d¬«      S )Nc                ó   — | |k  S r;   rq   r}   s     rB   rh   z/Expr.__le__.<locals>.<lambda>.<locals>.<lambda>4  r€   rD   Tr�   r   rƒ   s    €€rB   rh   zExpr.__le__.<locals>.<lambda>3  r…   rD   r†   rˆ   s   ``rB   Ú__le__zExpr.__le__1  rŠ   rD   c                óZ   ‡ ‡— ‰ j                  ˆˆ fd„t        j                  ‰ ‰«      «      S )Nc                ó&   •— t        | d„ ‰‰d¬«      S )Nc                ó   — | |k  S r;   rq   r}   s     rB   rh   z/Expr.__lt__.<locals>.<lambda>.<locals>.<lambda><  r’   rD   Tr�   r   rƒ   s    €€rB   rh   zExpr.__lt__.<locals>.<lambda>;  r“   rD   r†   rˆ   s   ``rB   Ú__lt__zExpr.__lt__9  rŠ   rD   c                óZ   ‡ ‡— ‰ j                  ˆˆ fd„t        j                  ‰ ‰«      «      S )Nc                ó&   •— t        | d„ ‰‰d¬«      S )Nc                ó   — | |kD  S r;   rq   r}   s     rB   rh   z/Expr.__gt__.<locals>.<lambda>.<locals>.<lambda>D  r’   rD   Tr�   r   rƒ   s    €€rB   rh   zExpr.__gt__.<locals>.<lambda>C  r“   rD   r†   rˆ   s   ``rB   Ú__gt__zExpr.__gt__A  rŠ   rD   c                óZ   ‡ ‡— ‰ j                  ˆˆ fd„t        j                  ‰ ‰«      «      S )Nc                ó&   •— t        | d„ ‰‰d¬«      S )Nc                ó   — | |k\  S r;   rq   r}   s     rB   rh   z/Expr.__ge__.<locals>.<lambda>.<locals>.<lambda>L  r€   rD   Tr�   r   rƒ   s    €€rB   rh   zExpr.__ge__.<locals>.<lambda>K  r…   rD   r†   rˆ   s   ``rB   Ú__ge__zExpr.__ge__I  rŠ   rD   c                óZ   ‡ ‡— ‰ j                  ˆˆ fd„t        j                  ‰ ‰«      «      S )Nc                ó&   •— t        | d„ ‰‰d¬«      S )Nc                ó   — | |z  S r;   rq   r}   s     rB   rh   z0Expr.__pow__.<locals>.<lambda>.<locals>.<lambda>T  s
   €  ! Q¡$€ rD   Tr�   r   rƒ   s    €€rB   rh   zExpr.__pow__.<locals>.<lambda>S  s   ø€ Ô-ØÑ&¨¨eÀô€ rD   r†   rˆ   s   ``rB   Ú__pow__zExpr.__pow__Q  rŠ   rD   c                óZ   ‡ ‡— ‰ j                  ˆˆ fd„t        j                  ‰ ‰«      «      S )Nc                ó&   •— t        | d„ ‰‰d¬«      S )Nc                ó$   — | j                  |«      S r;   )Ú__rpow__r}   s     rB   rh   z1Expr.__rpow__.<locals>.<lambda>.<locals>.<lambda>]  r¯   rD   Tr�   r   rƒ   s    €€rB   rh   zExpr.__rpow__.<locals>.<lambda>[  r°   rD   r†   rˆ   s   ``rB   r×   zExpr.__rpow__Y  r±   rD   c                óZ   ‡ ‡— ‰ j                  ˆˆ fd„t        j                  ‰ ‰«      «      S )Nc                ó&   •— t        | d„ ‰‰d¬«      S )Nc                ó   — | |z  S r;   rq   r}   s     rB   rh   z5Expr.__floordiv__.<locals>.<lambda>.<locals>.<lambda>h  r€   rD   Tr�   r   rƒ   s    €€rB   rh   z#Expr.__floordiv__.<locals>.<lambda>g  r…   rD   r†   rˆ   s   ``rB   Ú__floordiv__zExpr.__floordiv__e  rŠ   rD   c                óZ   ‡ ‡— ‰ j                  ˆˆ fd„t        j                  ‰ ‰«      «      S )Nc                ó&   •— t        | d„ ‰‰d¬«      S )Nc                ó$   — | j                  |«      S r;   )Ú__rfloordiv__r}   s     rB   rh   z6Expr.__rfloordiv__.<locals>.<lambda>.<locals>.<lambda>q  s   € ˜QŸ_™_¨QÓ/€ rD   Tr�   r   rƒ   s    €€rB   rh   z$Expr.__rfloordiv__.<locals>.<lambda>o  s   ø€ Ô-ØÙ/ØØØô€ rD   r†   rˆ   s   ``rB   rß   zExpr.__rfloordiv__m  r±   rD   c                óZ   ‡ ‡— ‰ j                  ˆˆ fd„t        j                  ‰ ‰«      «      S )Nc                ó&   •— t        | d„ ‰‰d¬«      S )Nc                ó   — | |z  S r;   rq   r}   s     rB   rh   z0Expr.__mod__.<locals>.<lambda>.<locals>.<lambda>|  r’   rD   Tr�   r   rƒ   s    €€rB   rh   zExpr.__mod__.<locals>.<lambda>{  r“   rD   r†   rˆ   s   ``rB   Ú__mod__zExpr.__mod__y  rŠ   rD   c                óZ   ‡ ‡— ‰ j                  ˆˆ fd„t        j                  ‰ ‰«      «      S )Nc                ó&   •— t        | d„ ‰‰d¬«      S )Nc                ó$   — | j                  |«      S r;   )Ú__rmod__r}   s     rB   rh   z1Expr.__rmod__.<locals>.<lambda>.<locals>.<lambda>…  r¯   rD   Tr�   r   rƒ   s    €€rB   rh   zExpr.__rmod__.<locals>.<lambda>ƒ  r°   rD   r†   rˆ   s   ``rB   rç   zExpr.__rmod__�  r±   rD   c                ó,   ‡ — ‰ j                  ˆ fd„«      S )Nc                óB   •— ‰j                  | «      j                  «       S r;   )rG   Ú
__invert__rg   s    €rB   rh   z!Expr.__invert__.<locals>.<lambda>�  s   ø€ ¨t×/FÑ/FÀsÓ/K×/VÑ/VÓ/X€ rD   ro   ra   s   `rB   rê   zExpr.__invert__Ž  s   ø€ Ø×"Ñ"Ó#XÓYÐYrD   c                ó,   ‡ — ‰ j                  ˆ fd„«      S )u™  Return whether any of the values in the column are `True`.

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [True, False], "b": [True, True]})
            >>> df = nw.from_native(df_native)
            >>> df.select(nw.col("a", "b").any())
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |Narwhals DataFrame|
            |------------------|
            |        a     b   |
            |  0  True  True   |
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óB   •— ‰j                  | «      j                  «       S r;   )rG   Úanyrg   s    €rB   rh   zExpr.any.<locals>.<lambda>¤  ó   ø€ °$×2IÑ2IÈ#Ó2N×2RÑ2RÓ2T€ rD   ri   ra   s   `rB   rí   zExpr.any‘  ó   ø€ ð& ×%Ñ%Ó&TÓUÐUrD   c                ó,   ‡ — ‰ j                  ˆ fd„«      S )u’  Return whether all values in the column are `True`.

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [True, False], "b": [True, True]})
            >>> df = nw.from_native(df_native)
            >>> df.select(nw.col("a", "b").all())
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |Narwhals DataFrame|
            |------------------|
            |         a     b  |
            |  0  False  True  |
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óB   •— ‰j                  | «      j                  «       S r;   )rG   Úallrg   s    €rB   rh   zExpr.all.<locals>.<lambda>¹  rî   rD   ri   ra   s   `rB   rò   zExpr.all¦  rï   rD   NTé   F©ÚcomÚspanÚ	half_lifeÚalphaÚadjustÚmin_samplesÚignore_nullsc          
     óH   ‡ ‡‡‡‡‡‡‡— ‰ j                  ˆˆˆˆˆˆˆ ˆfd„«      S )u)  Compute exponentially-weighted moving average.

        Arguments:
            com: Specify decay in terms of center of mass, $\gamma$, with <br> $\alpha = \frac{1}{1+\gamma}\forall\gamma\geq0$
            span: Specify decay in terms of span, $\theta$, with <br> $\alpha = \frac{2}{\theta + 1} \forall \theta \geq 1$
            half_life: Specify decay in terms of half-life, $\tau$, with <br> $\alpha = 1 - \exp \left\{ \frac{ -\ln(2) }{ \tau } \right\} \forall \tau > 0$
            alpha: Specify smoothing factor alpha directly, $0 < \alpha \leq 1$.
            adjust: Divide by decaying adjustment factor in beginning periods to account for imbalance in relative weightings

                - When `adjust=True` (the default) the EW function is calculated
                  using weights $w_i = (1 - \alpha)^i$
                - When `adjust=False` the EW function is calculated recursively by
                  $$
                  y_0=x_0
                  $$
                  $$
                  y_t = (1 - \alpha)y_{t - 1} + \alpha x_t
                  $$
            min_samples: Minimum number of observations in window required to have a value, (otherwise result is null).
            ignore_nulls: Ignore missing values when calculating weights.

                - When `ignore_nulls=False` (default), weights are based on absolute
                  positions.
                  For example, the weights of $x_0$ and $x_2$ used in
                  calculating the final weighted average of $[x_0, None, x_2]$ are
                  $(1-\alpha)^2$ and $1$ if `adjust=True`, and
                  $(1-\alpha)^2$ and $\alpha$ if `adjust=False`.
                - When `ignore_nulls=True`, weights are based
                  on relative positions. For example, the weights of
                  $x_0$ and $x_2$ used in calculating the final weighted
                  average of $[x_0, None, x_2]$ are
                  $1-\alpha$ and $1$ if `adjust=True`,
                  and $1-\alpha$ and $\alpha$ if `adjust=False`.

        Returns:
            Expr

        Examples:
            >>> import pandas as pd
            >>> import polars as pl
            >>> import narwhals as nw
            >>> from narwhals.typing import IntoFrameT
            >>>
            >>> data = {"a": [1, 2, 3]}
            >>> df_pd = pd.DataFrame(data)
            >>> df_pl = pl.DataFrame(data)

            We define a library agnostic function:

            >>> def agnostic_ewm_mean(df_native: IntoFrameT) -> IntoFrameT:
            ...     df = nw.from_native(df_native)
            ...     return df.select(
            ...         nw.col("a").ewm_mean(com=1, ignore_nulls=False)
            ...     ).to_native()

            We can then pass either pandas or Polars to `agnostic_ewm_mean`:

            >>> agnostic_ewm_mean(df_pd)
                      a
            0  1.000000
            1  1.666667
            2  2.428571

            >>> agnostic_ewm_mean(df_pl)  # doctest: +NORMALIZE_WHITESPACE
            shape: (3, 1)
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            â”‚ a        â”‚
            â”‚ ---      â”‚
            â”‚ f64      â”‚
            â•žâ•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•¡
            â”‚ 1.0      â”‚
            â”‚ 1.666667 â”‚
            â”‚ 2.428571 â”‚
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c           	     óR   •— ‰j                  | «      j                  ‰‰‰‰‰‰‰¬«      S )Nrô   )rG   Úewm_mean)	r>   rù   rø   rõ   r÷   rû   rú   r@   rö   s	    €€€€€€€€rB   rh   zExpr.ewm_mean.<locals>.<lambda>  s7   ø€ ˜×/Ñ/°Ó4×=Ñ=ØØØ#ØØØ'Ø)ð >ó € rD   ro   )r@   rõ   rö   r÷   rø   rù   rú   rû   s   ````````rB   rþ   zExpr.ewm_mean»  s#   ÿ€ ðl ×"Ñ"÷ò ó

ð 
	
rD   c                ó,   ‡ — ‰ j                  ˆ fd„«      S )ui  Get mean value.

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [-1, 0, 1], "b": [2, 4, 6]})
            >>> df = nw.from_native(df_native)
            >>> df.select(nw.col("a", "b").mean())
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |Narwhals DataFrame|
            |------------------|
            |        a    b    |
            |   0  0.0  4.0    |
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óB   •— ‰j                  | «      j                  «       S r;   )rG   Úmeanrg   s    €rB   rh   zExpr.mean.<locals>.<lambda>0  ó   ø€ °$×2IÑ2IÈ#Ó2N×2SÑ2SÓ2U€ rD   ri   ra   s   `rB   r  z	Expr.mean  ó   ø€ ð& ×%Ñ%Ó&UÓVÐVrD   c                ó,   ‡ — ‰ j                  ˆ fd„«      S )u  Get median value.

        Returns:
            A new expression.

        Notes:
            Results might slightly differ across backends due to differences in the underlying algorithms used to compute the median.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1, 8, 3], "b": [4, 5, 2]})
            >>> df = nw.from_native(df_native)
            >>> df.select(nw.col("a", "b").median())
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |Narwhals DataFrame|
            |------------------|
            |        a    b    |
            |   0  3.0  4.0    |
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óB   •— ‰j                  | «      j                  «       S r;   )rG   Úmedianrg   s    €rB   rh   zExpr.median.<locals>.<lambda>H  s   ø€ °$×2IÑ2IÈ#Ó2N×2UÑ2UÓ2W€ rD   ri   ra   s   `rB   r  zExpr.median2  s   ø€ ð, ×%Ñ%Ó&WÓXÐXrD   ©Úddofc               ó0   ‡ ‡— ‰ j                  ˆˆ fd„«      S )u_  Get standard deviation.

        Arguments:
            ddof: "Delta Degrees of Freedom": the divisor used in the calculation is N - ddof,
                where N represents the number of elements. By default ddof is 1.

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [20, 25, 60], "b": [1.5, 1, -1.4]})
            >>> df = nw.from_native(df_native)
            >>> df.select(nw.col("a", "b").std(ddof=0))
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            | Narwhals DataFrame  |
            |---------------------|
            |          a         b|
            |0  17.79513  1.265789|
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óF   •— ‰j                  | «      j                  ‰¬«      S ©Nr  )rG   Ústd©r>   r  r@   s    €€rB   rh   zExpr.std.<locals>.<lambda>b  ó    ø€ ˜×/Ñ/°Ó4×8Ñ8¸dÐ8ÓC€ rD   ri   ©r@   r  s   ``rB   r  zExpr.stdJ  ó   ù€ ð. ×%Ñ%ÜCó
ð 	
rD   c               ó0   ‡ ‡— ‰ j                  ˆˆ fd„«      S )un  Get variance.

        Arguments:
            ddof: "Delta Degrees of Freedom": the divisor used in the calculation is N - ddof,
                     where N represents the number of elements. By default ddof is 1.

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [20, 25, 60], "b": [1.5, 1, -1.4]})
            >>> df = nw.from_native(df_native)
            >>> df.select(nw.col("a", "b").var(ddof=0))
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |  Narwhals DataFrame   |
            |-----------------------|
            |            a         b|
            |0  316.666667  1.602222|
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óF   •— ‰j                  | «      j                  ‰¬«      S r  )rG   Úvarr  s    €€rB   rh   zExpr.var.<locals>.<lambda>}  r  rD   ri   r  s   ``rB   r  zExpr.vare  r  rD   c                ó„   ‡ ‡‡— ‰ j                  ˆˆˆ fd„‰ j                  j                  t        j                  «      «      S )u¯  Apply a custom python function to a whole Series or sequence of Series.

        The output of this custom function is presumed to be either a Series,
        or a NumPy array (in which case it will be automatically converted into
        a Series).

        Arguments:
            function: Function to apply to Series.
            return_dtype: Dtype of the output Series.
                If not set, the dtype will be inferred based on the first non-null value
                that is returned by the function.

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]})
            >>> df = nw.from_native(df_native)
            >>> df.with_columns(
            ...     nw.col("a", "b")
            ...     .map_batches(lambda s: s.to_numpy() + 1, return_dtype=nw.Float64)
            ...     .name.suffix("_mapped")
            ... )
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |    Narwhals DataFrame     |
            |---------------------------|
            |   a  b  a_mapped  b_mapped|
            |0  1  4       2.0       5.0|
            |1  2  5       3.0       6.0|
            |2  3  6       4.0       7.0|
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óH   •— ‰j                  | «      j                  ‰‰¬«      S )N)rr   Úreturn_dtype)rG   Úmap_batches)r>   rr   r  r@   s    €€€rB   rh   z"Expr.map_batches.<locals>.<lambda>¨  s(   ø€ ˜×/Ñ/°Ó4×@Ñ@Ø!°ð Aó € rD   )rM   r=   rZ   r
   r]   )r@   rr   r  s   ```rB   r  zExpr.map_batches€  s6   ú€ ðN �~‰~õð �N‰N×9Ñ9¼(×:MÑ:MÓNó
ð 	
rD   c                ó,   ‡ — ‰ j                  ˆ fd„«      S )u¾  Calculate the sample skewness of a column.

        Returns:
            An expression representing the sample skewness of the column.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1, 2, 3, 4, 5], "b": [1, 1, 2, 10, 100]})
            >>> df = nw.from_native(df_native)
            >>> df.select(nw.col("a", "b").skew())
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |Narwhals DataFrame|
            |------------------|
            |      a         b |
            | 0  0.0  1.472427 |
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óB   •— ‰j                  | «      j                  «       S r;   )rG   Úskewrg   s    €rB   rh   zExpr.skew.<locals>.<lambda>Â  r  rD   ri   ra   s   `rB   r  z	Expr.skew¯  r  rD   c                ó,   ‡ — ‰ j                  ˆ fd„«      S )u�  Return the sum value.

        Returns:
            A new expression.

        Examples:
            >>> import duckdb
            >>> import narwhals as nw
            >>> df_native = duckdb.sql("SELECT * FROM VALUES (5, 50), (10, 100) df(a, b)")
            >>> df = nw.from_native(df_native)
            >>> df.select(nw.col("a", "b").sum())
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |Narwhals LazyFrame |
            |-------------------|
            |â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”�|
            |â”‚   a    â”‚   b    â”‚|
            |â”‚ int128 â”‚ int128 â”‚|
            |â”œâ”€â”€â”€â”€â”€â”€â”€â”€â”¼â”€â”€â”€â”€â”€â”€â”€â”€â”¤|
            |â”‚     15 â”‚    150 â”‚|
            |â””â”€â”€â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”˜|
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óB   •— ‰j                  | «      j                  «       S r;   )rG   rf   rg   s    €rB   rh   zExpr.sum.<locals>.<lambda>Û  rî   rD   ri   ra   s   `rB   rf   zExpr.sumÄ  s   ø€ ð. ×%Ñ%Ó&TÓUÐUrD   c                ó,   ‡ — ‰ j                  ˆ fd„«      S )uz  Returns the minimum value(s) from a column(s).

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1, 2], "b": [4, 3]})
            >>> df = nw.from_native(df_native)
            >>> df.select(nw.min("a", "b"))
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |Narwhals DataFrame|
            |------------------|
            |        a  b      |
            |     0  1  3      |
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óB   •— ‰j                  | «      j                  «       S r;   )rG   Úminrg   s    €rB   rh   zExpr.min.<locals>.<lambda>ð  rî   rD   ri   ra   s   `rB   r  zExpr.minÝ  rï   rD   c                ó,   ‡ — ‰ j                  ˆ fd„«      S )u  Returns the maximum value(s) from a column(s).

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [10, 20], "b": [50, 100]})
            >>> df = nw.from_native(df_native)
            >>> df.select(nw.max("a", "b"))
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |Narwhals DataFrame|
            |------------------|
            |        a    b    |
            |    0  20  100    |
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óB   •— ‰j                  | «      j                  «       S r;   )rG   Úmaxrg   s    €rB   rh   zExpr.max.<locals>.<lambda>  rî   rD   ri   ra   s   `rB   r"  zExpr.maxò  rï   rD   c                ó,   ‡ — ‰ j                  ˆ fd„«      S )uÍ  Returns the index of the minimum value.

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [10, 20], "b": [150, 100]})
            >>> df = nw.from_native(df_native)
            >>> df.select(nw.col("a", "b").arg_min().name.suffix("_arg_min"))
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |  Narwhals DataFrame   |
            |-----------------------|
            |   a_arg_min  b_arg_min|
            |0          0          1|
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óB   •— ‰j                  | «      j                  «       S r;   )rG   Úarg_minrg   s    €rB   rh   zExpr.arg_min.<locals>.<lambda>  ó   ø€ ˜×/Ñ/°Ó4×<Ñ<Ó>€ rD   ©r[   ra   s   `rB   r%  zExpr.arg_min  ó   ø€ ð& ×5Ñ5Û>ó
ð 	
rD   c                ó,   ‡ — ‰ j                  ˆ fd„«      S )uÍ  Returns the index of the maximum value.

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [10, 20], "b": [150, 100]})
            >>> df = nw.from_native(df_native)
            >>> df.select(nw.col("a", "b").arg_max().name.suffix("_arg_max"))
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |  Narwhals DataFrame   |
            |-----------------------|
            |   a_arg_max  b_arg_max|
            |0          1          0|
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óB   •— ‰j                  | «      j                  «       S r;   )rG   Úarg_maxrg   s    €rB   rh   zExpr.arg_max.<locals>.<lambda>2  r&  rD   r'  ra   s   `rB   r+  zExpr.arg_max  r(  rD   c                ó,   ‡ — ‰ j                  ˆ fd„«      S )u‹  Returns the number of non-null elements in the column.

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1, 2, 3], "b": [None, 4, 4]})
            >>> df = nw.from_native(df_native)
            >>> df.select(nw.all().count())
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |Narwhals DataFrame|
            |------------------|
            |        a  b      |
            |     0  3  2      |
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óB   •— ‰j                  | «      j                  «       S r;   )rG   Úcountrg   s    €rB   rh   zExpr.count.<locals>.<lambda>H  s   ø€ °$×2IÑ2IÈ#Ó2N×2TÑ2TÓ2V€ rD   ri   ra   s   `rB   r.  z
Expr.count5  s   ø€ ð& ×%Ñ%Ó&VÓWÐWrD   c                ó,   ‡ — ‰ j                  ˆ fd„«      S )uˆ  Returns count of unique values.

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1, 2, 3, 4, 5], "b": [1, 1, 3, 3, 5]})
            >>> df = nw.from_native(df_native)
            >>> df.select(nw.col("a", "b").n_unique())
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |Narwhals DataFrame|
            |------------------|
            |        a  b      |
            |     0  5  3      |
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óB   •— ‰j                  | «      j                  «       S r;   )rG   Ún_uniquerg   s    €rB   rh   zExpr.n_unique.<locals>.<lambda>]  s   ø€ °$×2IÑ2IÈ#Ó2N×2WÑ2WÓ2Y€ rD   ri   ra   s   `rB   r1  zExpr.n_uniqueJ  s   ø€ ð& ×%Ñ%Ó&YÓZÐZrD   c                ó,   ‡ — ‰ j                  ˆ fd„«      S )u•  Return unique values of this expression.

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1, 1, 3, 5, 5], "b": [2, 4, 4, 6, 6]})
            >>> df = nw.from_native(df_native)
            >>> df.select(nw.col("a", "b").unique().sum())
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |Narwhals DataFrame|
            |------------------|
            |        a   b     |
            |     0  9  12     |
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óB   •— ‰j                  | «      j                  «       S r;   )rG   Úuniquerg   s    €rB   rh   zExpr.unique.<locals>.<lambda>r  s   ø€ °×1HÑ1HÈÓ1M×1TÑ1TÓ1V€ rD   ©r^   ra   s   `rB   r4  zExpr.unique_  s   ø€ ð& ×$Ñ$Ó%VÓWÐWrD   c                ó,   ‡ — ‰ j                  ˆ fd„«      S )uÖ  Return absolute value of each element.

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1, -2], "b": [-3, 4]})
            >>> df = nw.from_native(df_native)
            >>> df.with_columns(nw.col("a", "b").abs().name.suffix("_abs"))
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            | Narwhals DataFrame  |
            |---------------------|
            |   a  b  a_abs  b_abs|
            |0  1 -3      1      3|
            |1 -2  4      2      4|
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óB   •— ‰j                  | «      j                  «       S r;   )rG   re   rg   s    €rB   rh   zExpr.abs.<locals>.<lambda>ˆ  s   ø€ ¨t×/FÑ/FÀsÓ/K×/OÑ/OÓ/Q€ rD   ro   ra   s   `rB   re   zExpr.abst  s   ø€ ð( ×"Ñ"Ó#QÓRÐRrD   ©Úreversec               ó€   ‡ ‡— ‰ j                  ˆˆ fd„‰ j                  j                  t        j                  «      «      S )u
  Return cumulative sum.

        !!! info
            For lazy backends, this operation must be followed by `Expr.over` with
            `order_by` specified, see [order-dependence](../basics/order_dependence.md).

        Arguments:
            reverse: reverse the operation

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1, 1, 3, 5, 5], "b": [2, 4, 4, 6, 6]})
            >>> df = nw.from_native(df_native)
            >>> df.with_columns(a_cum_sum=nw.col("a").cum_sum())
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |Narwhals DataFrame|
            |------------------|
            |   a  b  a_cum_sum|
            |0  1  2          1|
            |1  1  4          2|
            |2  3  4          5|
            |3  5  6         10|
            |4  5  6         15|
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óF   •— ‰j                  | «      j                  ‰¬«      S ©Nr8  )rG   Úcum_sum©r>   r9  r@   s    €€rB   rh   zExpr.cum_sum.<locals>.<lambda>©  ó    ø€ ˜×/Ñ/°Ó4×<Ñ<ÀWÐ<ÓM€ rD   ©rM   r=   rZ   r
   ÚWINDOW©r@   r9  s   ``rB   r=  zExpr.cum_sumŠ  s/   ù€ ð< �~‰~ÜMØ�N‰N×9Ñ9¼(¿/¹/ÓJó
ð 	
rD   c                ó|   ‡ — ‰ j                  ˆ fd„‰ j                  j                  t        j                  «      «      S )uÛ  Returns the difference between each element and the previous one.

        !!! info
            For lazy backends, this operation must be followed by `Expr.over` with
            `order_by` specified, see [order-dependence](../basics/order_dependence.md).

        Returns:
            A new expression.

        Notes:
            pandas may change the dtype here, for example when introducing missing
            values in an integer column. To ensure, that the dtype doesn't change,
            you may want to use `fill_null` and `cast`. For example, to calculate
            the diff and fill missing values with `0` in a Int64 column, you could
            do:

                nw.col("a").diff().fill_null(0).cast(nw.Int64)

        Examples:
            >>> import polars as pl
            >>> import narwhals as nw
            >>> df_native = pl.DataFrame({"a": [1, 1, 3, 5, 5]})
            >>> df = nw.from_native(df_native)
            >>> df.with_columns(a_diff=nw.col("a").diff())
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |Narwhals DataFrame|
            |------------------|
            | shape: (5, 2)    |
            | â”Œâ”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”� |
            | â”‚ a   â”† a_diff â”‚ |
            | â”‚ --- â”† ---    â”‚ |
            | â”‚ i64 â”† i64    â”‚ |
            | â•žâ•�â•�â•�â•�â•�â•ªâ•�â•�â•�â•�â•�â•�â•�â•�â•¡ |
            | â”‚ 1   â”† null   â”‚ |
            | â”‚ 1   â”† 0      â”‚ |
            | â”‚ 3   â”† 2      â”‚ |
            | â”‚ 5   â”† 2      â”‚ |
            | â”‚ 5   â”† 0      â”‚ |
            | â””â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”˜ |
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óB   •— ‰j                  | «      j                  «       S r;   )rG   Údiffrg   s    €rB   rh   zExpr.diff.<locals>.<lambda>Ø  s   ø€ ˜×/Ñ/°Ó4×9Ñ9Ó;€ rD   r@  ra   s   `rB   rE  z	Expr.diff­  s0   ø€ ðT �~‰~Û;Ø�N‰N×9Ñ9¼(¿/¹/ÓJó
ð 	
rD   c                ó€   ‡ ‡— ‰ j                  ˆˆ fd„‰ j                  j                  t        j                  «      «      S )u  Shift values by `n` positions.

        !!! info
            For lazy backends, this operation must be followed by `Expr.over` with
            `order_by` specified, see [order-dependence](../basics/order_dependence.md).

        Arguments:
            n: Number of positions to shift values by.

        Returns:
            A new expression.

        Notes:
            pandas may change the dtype here, for example when introducing missing
            values in an integer column. To ensure, that the dtype doesn't change,
            you may want to use `fill_null` and `cast`. For example, to shift
            and fill missing values with `0` in a Int64 column, you could
            do:

                nw.col("a").shift(1).fill_null(0).cast(nw.Int64)

        Examples:
            >>> import polars as pl
            >>> import narwhals as nw
            >>> df_native = pl.DataFrame({"a": [1, 1, 3, 5, 5]})
            >>> df = nw.from_native(df_native)
            >>> df.with_columns(a_shift=nw.col("a").shift(n=1))
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |Narwhals DataFrame|
            |------------------|
            |shape: (5, 2)     |
            |â”Œâ”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”€â”� |
            |â”‚ a   â”† a_shift â”‚ |
            |â”‚ --- â”† ---     â”‚ |
            |â”‚ i64 â”† i64     â”‚ |
            |â•žâ•�â•�â•�â•�â•�â•ªâ•�â•�â•�â•�â•�â•�â•�â•�â•�â•¡ |
            |â”‚ 1   â”† null    â”‚ |
            |â”‚ 1   â”† 1       â”‚ |
            |â”‚ 3   â”† 1       â”‚ |
            |â”‚ 5   â”† 3       â”‚ |
            |â”‚ 5   â”† 5       â”‚ |
            |â””â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜ |
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óD   •— ‰j                  | «      j                  ‰«      S r;   )rG   Úshift©r>   Únr@   s    €€rB   rh   zExpr.shift.<locals>.<lambda>
  s   ø€ ˜×/Ñ/°Ó4×:Ñ:¸1Ó=€ rD   r@  )r@   rJ  s   ``rB   rH  z
Expr.shiftÜ  s0   ù€ ðZ �~‰~Ü=Ø�N‰N×9Ñ9¼(¿/¹/ÓJó
ð 	
rD   ©r  c               óÚ   ‡ ‡‡‡— ‰€Ot        ‰t        «      sd}t        |«      ‚t        ‰j	                  «       «      Št        ‰j                  «       «      Š‰ j                  ˆˆˆˆ fd„«      S )u  Replace all values by different values.

        This function must replace all non-null input values (else it raises an error).

        Arguments:
            old: Sequence of values to replace. It also accepts a mapping of values to
                their replacement as syntactic sugar for
                `replace_all(old=list(mapping.keys()), new=list(mapping.values()))`.
            new: Sequence of values to replace by. Length must match the length of `old`.
            return_dtype: The data type of the resulting expression. If set to `None`
                (default), the data type is determined automatically based on the other
                inputs.

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [3, 0, 1, 2]})
            >>> df = nw.from_native(df_native)
            >>> df.with_columns(
            ...     b=nw.col("a").replace_strict(
            ...         [0, 1, 2, 3],
            ...         ["zero", "one", "two", "three"],
            ...         return_dtype=nw.String,
            ...     )
            ... )
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |Narwhals DataFrame|
            |------------------|
            |      a      b    |
            |   0  3  three    |
            |   1  0   zero    |
            |   2  1    one    |
            |   3  2    two    |
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        zB`new` argument is required if `old` argument is not a Mapping typec                óJ   •— ‰j                  | «      j                  ‰‰‰¬«      S )NrK  )rG   Úreplace_strict)r>   ÚnewÚoldr  r@   s    €€€€rB   rh   z%Expr.replace_strict.<locals>.<lambda>D  s*   ø€ ˜×/Ñ/°Ó4×CÑCØ�S |ð Dó € rD   )Ú
isinstancer   Ú	TypeErrorÚlistÚvaluesÚkeysrP   )r@   rP  rO  r  rW   s   ```` rB   rN  zExpr.replace_strict  s\   û€ ðZ ˆ;Ü˜c¤7Ô+ØZ�Ü “nÐ$ä�s—z‘z“|Ó$ˆCÜ�s—x‘x“zÓ"ˆCà×"Ñ"öó
ð 	
rD   ©Ú
descendingÚ
nulls_lastc               ó„   ‡ ‡‡— d}t        |d¬«       ‰ j                  ˆˆˆ fd„‰ j                  j                  «       «      S )aQ  Sort this column. Place null values first.

        !!! warning
            `Expr.sort` is deprecated and will be removed in a future version.
            Hint: instead of `df.select(nw.col('a').sort())`, use
            `df.select(nw.col('a')).sort()` instead.
            Note: this will remain available in `narwhals.stable.v1`.
            See [stable api](../backcompat.md/) for more information.

        Arguments:
            descending: Sort in descending order.
            nulls_last: Place null values last instead of first.

        Returns:
            A new expression.
        a$  `Expr.sort` is deprecated and will be removed in a future version.

Hint: instead of `df.select(nw.col('a').sort())`, use `df.select(nw.col('a')).sort()`.

Note: this will remain available in `narwhals.stable.v1`.
See https://narwhals-dev.github.io/narwhals/backcompat/ for more information.
ú1.23.0©Ú_versionc                óH   •— ‰j                  | «      j                  ‰‰¬«      S )NrV  )rG   Úsort)r>   rW  rX  r@   s    €€€rB   rh   zExpr.sort.<locals>.<lambda>b  s'   ø€ ˜×/Ñ/°Ó4×9Ñ9Ø%°*ð :ó € rD   )r#   rM   r=   Úwith_uncloseable_window)r@   rW  rX  rW   s   ``` rB   r^  z	Expr.sortI  sB   ú€ ð$^ð 	ô 	" #°Õ9Ø�~‰~õð �N‰N×2Ñ2Ó4ó	
ð 	
rD   c                óv   ‡ ‡‡‡‡— 	 	 	 	 	 	 	 	 dˆfd„Š‰ j                  ˆˆˆ ˆfd„t        ‰ ‰‰ddd¬«      «      S )uK  Check if this expression is between the given lower and upper bounds.

        Arguments:
            lower_bound: Lower bound value. String literals are interpreted as column names.
            upper_bound: Upper bound value. String literals are interpreted as column names.
            closed: Define which sides of the interval are closed (inclusive).

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1, 2, 3, 4, 5]})
            >>> df = nw.from_native(df_native)
            >>> df.with_columns(b=nw.col("a").is_between(2, 4, "right"))
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |Narwhals DataFrame|
            |------------------|
            |      a      b    |
            |   0  1  False    |
            |   1  2  False    |
            |   2  3   True    |
            |   3  4   True    |
            |   4  5  False    |
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óz   •— ‰dk(  r| |k\  | |k  z  S ‰dk(  r| |kD  | |k  z  S ‰dk(  r| |kD  | |k  z  S | |k\  | |k  z  S )NÚleftÚrightÚnonerq   )Úcompliant_exprÚlbÚubÚcloseds      €rB   rC   zExpr.is_between.<locals>.func‹  sq   ø€ ð
 ˜ÒØ&¨"Ñ,°À"Ñ1DÑEÐEØ˜7Ò"Ø&¨Ñ+°À"Ñ0DÑEÐEØ˜6Ò!Ø&¨Ñ+°ÀÑ0CÑDÐDØ" bÑ(¨^¸rÑ-AÑBÐBrD   c                ó&   •— t        | ‰‰‰‰d¬«      S )NFr�   r   )r>   rC   Úlower_boundr@   Úupper_bounds    €€€€rB   rh   z!Expr.is_between.<locals>.<lambda>™  s   ø€ Ô-Ø�T˜4 ¨kÀeô€ rD   F©r‚   Úallow_multi_outputÚto_single_output)re  rF   rf  rF   rg  rF   rE   rF   ©rM   r   )r@   rj  rk  rh  rC   s   ````@rB   Ú
is_betweenzExpr.is_betweeni  sf   ü€ ðD	CØ3ð	Cà'ð	Cð (ð	Cð %õ		Cð �~‰~öô ØØØØ Ø#(Ø!&ôó	
ð 	
rD   c                ó–   ‡ ‡— t        ‰t        «      r+t        ‰t        t        f«      s‰ j	                  ˆˆ fd„«      S d}t        |«      ‚)u1  Check if elements of this expression are present in the other iterable.

        Arguments:
            other: iterable

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1, 2, 9, 10]})
            >>> df = nw.from_native(df_native)
            >>> df.with_columns(b=nw.col("a").is_in([1, 2]))
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |Narwhals DataFrame|
            |------------------|
            |       a      b   |
            |   0   1   True   |
            |   1   2   True   |
            |   2   9  False   |
            |   3  10  False   |
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óZ   •— ‰j                  | «      j                  t        ‰d¬«      «      S )NT)Úpass_through)rG   Úis_inr    rƒ   s    €€rB   rh   zExpr.is_in.<locals>.<lambda>Á  s'   ø€ ˜D×3Ñ3°CÓ8×>Ñ>Ü˜e°$Ô7ó€ rD   zyNarwhals `is_in` doesn't accept expressions as an argument, as opposed to Polars. You should provide an iterable instead.)rQ  r   ÚstrÚbytesrP   ÚNotImplementedError)r@   r„   rW   s   `` rB   rt  z
Expr.is_in¦  sG   ù€ ô2 �eœXÔ&¬z¸%Ä#ÄuÀÔ/NØ×&Ñ&ôóð ð NˆCÜ% cÓ*Ð*rD   c                ó¤   ‡ ‡— t        |«      Št        ‰ g‰¢­ddddœŽj                  t        j                  «      }‰ j                  ˆˆ fd„|«      S )uè  Filters elements based on a condition, returning a new expression.

        Arguments:
            predicates: Conditions to filter by (which get ANDed together).

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame(
            ...     {"a": [2, 3, 4, 5, 6, 7], "b": [10, 11, 12, 13, 14, 15]}
            ... )
            >>> df = nw.from_native(df_native)
            >>> df.select(
            ...     nw.col("a").filter(nw.col("a") > 4),
            ...     nw.col("b").filter(nw.col("b") < 13),
            ... )
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |Narwhals DataFrame|
            |------------------|
            |        a   b     |
            |     3  5  10     |
            |     4  6  11     |
            |     5  7  12     |
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        FTrl  c                ó(   •— t        | d„ ‰g‰¢­ddiŽS )Nc                 ó,   —  | d   j                   | dd  Ž S )Nr   ró   )Úfilter)Úexprss    rB   rh   z/Expr.filter.<locals>.<lambda>.<locals>.<lambda>ñ  s   € ˜˜u Q™xŸ™°°a°b°	Ð:€ rD   r‚   Fr   )r>   Úflat_predicatesr@   s    €€rB   rh   zExpr.filter.<locals>.<lambda>ï  s*   ø€ Ô-ØÙ:Øðð !ò	ð
 !ñ€ rD   )r"   r   rT   r
   r]   rM   )r@   Ú
predicatesrH   r}  s   `  @rB   r{  zExpr.filterÉ  sf   ù€ ô: " *Ó-ˆÜ#Øð
àñ
ð Ø#Ø"ò
÷ ‰)”H×'Ñ'Ó
(ð 	ð �~‰~ôð ó	
ð 		
rD   c                ó,   ‡ — ‰ j                  ˆ fd„«      S )u  Returns a boolean Series indicating which values are null.

        Returns:
            A new expression.

        Notes:
            pandas handles null values differently from Polars and PyArrow.
            See [null_handling](../pandas_like_concepts/null_handling.md/)
            for reference.

        Examples:
            >>> import duckdb
            >>> import narwhals as nw
            >>> df_native = duckdb.sql(
            ...     "SELECT * FROM VALUES (null, CAST('NaN' AS DOUBLE)), (2, 2.) df(a, b)"
            ... )
            >>> df = nw.from_native(df_native)
            >>> df.with_columns(
            ...     a_is_null=nw.col("a").is_null(), b_is_null=nw.col("b").is_null()
            ... )
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |            Narwhals LazyFrame            |
            |------------------------------------------|
            |â”Œâ”€â”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�|
            |â”‚   a   â”‚   b    â”‚ a_is_null â”‚ b_is_null â”‚|
            |â”‚ int32 â”‚ double â”‚  boolean  â”‚  boolean  â”‚|
            |â”œâ”€â”€â”€â”€â”€â”€â”€â”¼â”€â”€â”€â”€â”€â”€â”€â”€â”¼â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”¼â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”¤|
            |â”‚  NULL â”‚    nan â”‚ true      â”‚ false     â”‚|
            |â”‚     2 â”‚    2.0 â”‚ false     â”‚ false     â”‚|
            |â””â”€â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜|
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óB   •— ‰j                  | «      j                  «       S r;   )rG   Úis_nullrg   s    €rB   rh   zExpr.is_null.<locals>.<lambda>  s   ø€ ¨t×/FÑ/FÀsÓ/K×/SÑ/SÓ/U€ rD   ro   ra   s   `rB   r�  zExpr.is_nullù  s   ø€ ðB ×"Ñ"Ó#UÓVÐVrD   c                ó,   ‡ — ‰ j                  ˆ fd„«      S )uÕ  Indicate which values are NaN.

        Returns:
            A new expression.

        Notes:
            pandas handles null values differently from Polars and PyArrow.
            See [null_handling](../pandas_like_concepts/null_handling.md/)
            for reference.

        Examples:
            >>> import duckdb
            >>> import narwhals as nw
            >>> df_native = duckdb.sql(
            ...     "SELECT * FROM VALUES (null, CAST('NaN' AS DOUBLE)), (2, 2.) df(a, b)"
            ... )
            >>> df = nw.from_native(df_native)
            >>> df.with_columns(
            ...     a_is_nan=nw.col("a").is_nan(), b_is_nan=nw.col("b").is_nan()
            ... )
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |           Narwhals LazyFrame           |
            |----------------------------------------|
            |â”Œâ”€â”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�|
            |â”‚   a   â”‚   b    â”‚ a_is_nan â”‚ b_is_nan â”‚|
            |â”‚ int32 â”‚ double â”‚ boolean  â”‚ boolean  â”‚|
            |â”œâ”€â”€â”€â”€â”€â”€â”€â”¼â”€â”€â”€â”€â”€â”€â”€â”€â”¼â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”¼â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”¤|
            |â”‚  NULL â”‚    nan â”‚ NULL     â”‚ true     â”‚|
            |â”‚     2 â”‚    2.0 â”‚ false    â”‚ false    â”‚|
            |â””â”€â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜|
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óB   •— ‰j                  | «      j                  «       S r;   )rG   Úis_nanrg   s    €rB   rh   zExpr.is_nan.<locals>.<lambda>=  s   ø€ ¨t×/FÑ/FÀsÓ/K×/RÑ/RÓ/T€ rD   ro   ra   s   `rB   r„  zExpr.is_nan  s   ø€ ðB ×"Ñ"Ó#TÓUÐUrD   c                óJ   ‡ — d}t        |d¬«       ‰ j                  ˆ fd„«      S )zhFind elements where boolean expression is True.

        Returns:
            A new expression.
        zÐ`Expr.arg_true` is deprecated and will be removed in a future version.

Note: this will remain available in `narwhals.stable.v1`.
See https://narwhals-dev.github.io/narwhals/backcompat/ for more information.
rZ  r[  c                óB   •— ‰j                  | «      j                  «       S r;   )rG   Úarg_truerg   s    €rB   rh   zExpr.arg_true.<locals>.<lambda>K  s   ø€ °×1HÑ1HÈÓ1M×1VÑ1VÓ1X€ rD   ©r#   r^   )r@   rW   s   ` rB   r‡  zExpr.arg_true?  s,   ø€ ð^ð 	ô
 	" #°Õ9Ø×$Ñ$Ó%XÓYÐYrD   c                ó  ‡ ‡‡‡— ‰�‰�d}t        |«      ‚‰€‰€d}t        |«      ‚‰�‰dvrd‰› �}t        |«      ‚‰ j                  ˆˆ ˆˆfd„‰�-‰ j                  j                  t        j
                  «      «      S ‰ j                  «      S )u&  Fill null values with given value.

        Arguments:
            value: Value or expression used to fill null values.
            strategy: Strategy used to fill null values.
            limit: Number of consecutive null values to fill when using the 'forward' or 'backward' strategy.

        Returns:
            A new expression.

        Notes:
            pandas handles null values differently from Polars and PyArrow.
            See [null_handling](../pandas_like_concepts/null_handling.md/)
            for reference.

        Examples:
            >>> import polars as pl
            >>> import narwhals as nw
            >>> df_native = pl.DataFrame(
            ...     {
            ...         "a": [2, None, None, 3],
            ...         "b": [2.0, float("nan"), float("nan"), 3.0],
            ...         "c": [1, 2, 3, 4],
            ...     }
            ... )
            >>> df = nw.from_native(df_native)
            >>> df.with_columns(
            ...     nw.col("a", "b").fill_null(0).name.suffix("_filled"),
            ...     nw.col("a").fill_null(nw.col("c")).name.suffix("_filled_with_c"),
            ... )
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |                     Narwhals DataFrame                     |
            |------------------------------------------------------------|
            |shape: (4, 6)                                               |
            |â”Œâ”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�|
            |â”‚ a    â”† b   â”† c   â”† a_filled â”† b_filled â”† a_filled_with_c â”‚|
            |â”‚ ---  â”† --- â”† --- â”† ---      â”† ---      â”† ---             â”‚|
            |â”‚ i64  â”† f64 â”† i64 â”† i64      â”† f64      â”† i64             â”‚|
            |â•žâ•�â•�â•�â•�â•�â•�â•ªâ•�â•�â•�â•�â•�â•ªâ•�â•�â•�â•�â•�â•ªâ•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•ªâ•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•ªâ•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•¡|
            |â”‚ 2    â”† 2.0 â”† 1   â”† 2        â”† 2.0      â”† 2               â”‚|
            |â”‚ null â”† NaN â”† 2   â”† 0        â”† NaN      â”† 2               â”‚|
            |â”‚ null â”† NaN â”† 3   â”† 0        â”† NaN      â”† 3               â”‚|
            |â”‚ 3    â”† 3.0 â”† 4   â”† 3        â”† 3.0      â”† 3               â”‚|
            |â””â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜|
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜

            Using a strategy:

            >>> df.select(
            ...     nw.col("a", "b"),
            ...     nw.col("a", "b")
            ...     .fill_null(strategy="forward", limit=1)
            ...     .name.suffix("_nulls_forward_filled"),
            ... )
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |                       Narwhals DataFrame                       |
            |----------------------------------------------------------------|
            |shape: (4, 4)                                                   |
            |â”Œâ”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�|
            |â”‚ a    â”† b   â”† a_nulls_forward_filled â”† b_nulls_forward_filled â”‚|
            |â”‚ ---  â”† --- â”† ---                    â”† ---                    â”‚|
            |â”‚ i64  â”† f64 â”† i64                    â”† f64                    â”‚|
            |â•žâ•�â•�â•�â•�â•�â•�â•ªâ•�â•�â•�â•�â•�â•ªâ•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•ªâ•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•¡|
            |â”‚ 2    â”† 2.0 â”† 2                      â”† 2.0                    â”‚|
            |â”‚ null â”† NaN â”† 2                      â”† NaN                    â”‚|
            |â”‚ null â”† NaN â”† null                   â”† NaN                    â”‚|
            |â”‚ 3    â”† 3.0 â”† 3                      â”† 3.0                    â”‚|
            |â””â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜|
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        z*cannot specify both `value` and `strategy`z0must specify either a fill `value` or `strategy`>   ÚforwardÚbackwardzstrategy not supported: c                ób   •— ‰j                  | «      j                  t        | ‰d¬«      ‰‰¬«      S )NTr�   )ÚvalueÚstrategyÚlimit)rG   Ú	fill_nullr   )r>   r�  r@   rŽ  r�  s    €€€€rB   rh   z Expr.fill_null.<locals>.<lambda>¤  s4   ø€ ˜×/Ñ/°Ó4×>Ñ>Ü'¨¨U¸tÔDØ!Øð ?ó € rD   )Ú
ValueErrorrM   r=   rZ   r
   rA  )r@   r�  rŽ  r�  rW   s   ```` rB   r�  zExpr.fill_nullM  s¦   û€ ðX Ð Ð!5Ø>ˆCÜ˜S“/Ð!Øˆ=˜XÐ-ØDˆCÜ˜S“/Ð!ØÐ HÐ4KÑ$KØ,¨X¨JÐ7ˆCÜ˜S“/Ð!à�~‰~öð Ð#ð �N‰N×9Ñ9¼(¿/¹/ÓJó	
ð 		
ð —‘ó	
ð 		
rD   c                ó,   ‡ — ‰ j                  ˆ fd„«      S )uÐ  Drop null values.

        Returns:
            A new expression.

        Notes:
            pandas handles null values differently from Polars and PyArrow.
            See [null_handling](../pandas_like_concepts/null_handling.md/)
            for reference.

        Examples:
            >>> import polars as pl
            >>> import narwhals as nw
            >>> df_native = pl.DataFrame({"a": [2.0, 4.0, float("nan"), 3.0, None, 5.0]})
            >>> df = nw.from_native(df_native)
            >>> df.select(nw.col("a").drop_nulls())
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |Narwhals DataFrame|
            |------------------|
            |  shape: (5, 1)   |
            |  â”Œâ”€â”€â”€â”€â”€â”�         |
            |  â”‚ a   â”‚         |
            |  â”‚ --- â”‚         |
            |  â”‚ f64 â”‚         |
            |  â•žâ•�â•�â•�â•�â•�â•¡         |
            |  â”‚ 2.0 â”‚         |
            |  â”‚ 4.0 â”‚         |
            |  â”‚ NaN â”‚         |
            |  â”‚ 3.0 â”‚         |
            |  â”‚ 5.0 â”‚         |
            |  â””â”€â”€â”€â”€â”€â”˜         |
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óB   •— ‰j                  | «      j                  «       S r;   )rG   Ú
drop_nullsrg   s    €rB   rh   z!Expr.drop_nulls.<locals>.<lambda>Ò  ó   ø€ ˜×/Ñ/°Ó4×?Ñ?ÓA€ rD   r5  ra   s   `rB   r”  zExpr.drop_nulls¯  s   ø€ ðD ×$Ñ$ÛAó
ð 	
rD   ©ÚfractionÚwith_replacementÚseedc               óZ   ‡ ‡‡‡‡— d}t        |d¬«       ‰ j                  ˆˆˆˆ ˆfd„«      S )aR  Sample randomly from this expression.

        !!! warning
            `Expr.sample` is deprecated and will be removed in a future version.
            Hint: instead of `df.select(nw.col('a').sample())`, use
            `df.select(nw.col('a')).sample()` instead.
            Note: this will remain available in `narwhals.stable.v1`.
            See [stable api](../backcompat.md/) for more information.

        Arguments:
            n: Number of items to return. Cannot be used with fraction.
            fraction: Fraction of items to return. Cannot be used with n.
            with_replacement: Allow values to be sampled more than once.
            seed: Seed for the random number generator. If set to None (default), a random
                seed is generated for each sample operation.

        Returns:
            A new expression.
        a*  `Expr.sample` is deprecated and will be removed in a future version.

Hint: instead of `df.select(nw.col('a').sample())`, use `df.select(nw.col('a')).sample()`.

Note: this will remain available in `narwhals.stable.v1`.
See https://narwhals-dev.github.io/narwhals/backcompat/ for more information.
rZ  r[  c                óL   •— ‰j                  | «      j                  ‰‰‰‰¬«      S )Nr–  )rG   Úsample)r>   r—  rJ  r™  r@   r˜  s    €€€€€rB   rh   zExpr.sample.<locals>.<lambda>ø  s,   ø€ ˜×/Ñ/°Ó4×;Ñ;Ø˜HÐ7GÈdð <ó € rD   rˆ  )r@   rJ  r—  r˜  r™  rW   s   ````` rB   rœ  zExpr.sampleÕ  s2   ü€ ð8^ð 	ô 	" #°Õ9Ø×$Ñ$÷ó
ð 	
rD   )Úorder_byc               óÖ  ‡ ‡	‡
— ‰ j                   j                  j                  «       rd}t        |«      ‚t	        |«      Š
t        |t        «      r|gn|Š	‰
s‰	sd}t        |«      ‚t        j                  }‰ j                   j                  }|j                  «       rd}t        |«      ‚‰	�6‰ j                   j                  j                  «       r|j                  «       s!J ‚‰	�|j                  «       sd}t        |«      ‚‰ j                   }|j                  «       rt         j"                  nt         j$                  }t'        |||j(                  ¬«      }‰ j+                  ˆ	ˆ
ˆ fd„|«      S )uÉ  Compute expressions over the given groups (optionally with given order).

        Arguments:
            partition_by: Names of columns to compute window expression over.
                Must be names of columns, as opposed to expressions -
                so, this is a bit less flexible than Polars' `Expr.over`.
            order_by: Column(s) to order window functions by.
                For lazy backends, this argument is required when `over` is applied
                to order-dependent functions, see [order-dependence](../basics/order_dependence.md).

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1, 2, 4], "b": ["x", "x", "y"]})
            >>> df = nw.from_native(df_native)
            >>> df.with_columns(a_min_per_group=nw.col("a").min().over("b"))
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |   Narwhals DataFrame   |
            |------------------------|
            |   a  b  a_min_per_group|
            |0  1  x                1|
            |1  2  x                1|
            |2  4  y                4|
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜

            Cumulative operations are also supported, but (currently) only for
            pandas and Polars:

            >>> df.with_columns(a_cum_sum_per_group=nw.col("a").cum_sum().over("b"))
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |     Narwhals DataFrame     |
            |----------------------------|
            |   a  b  a_cum_sum_per_group|
            |0  1  x                    1|
            |1  2  x                    3|
            |2  4  y                    4|
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        z>`.over()` can not be used for expressions which change length.z?At least one of `partition_by` or `order_by` must be specified.z)Nested `over` statements are not allowed.zJCannot use `order_by` in `over` on expression which isn't order-dependent.)Úwindow_kindÚexpansion_kindc                óF   •— ‰j                  | «      j                  ‰‰«      S r;   )rG   Úover)r>   Úflat_order_byÚflat_partition_byr@   s    €€€rB   rh   zExpr.over.<locals>.<lambda>M  s"   ø€ ˜×/Ñ/°Ó4×9Ñ9Ø! =ó€ rD   )r=   rK   Úis_filtrationr   r"   rQ  ru  r‘  r
   rO   rŸ  Ú	is_closedr   rL   Úis_openÚis_uncloseabler   ÚUNCLOSEABLEÚCLOSEDr   r   rM   )r@   r�  Úpartition_byrW   rK   rŸ  Úcurrent_metaÚnext_window_kindÚ	next_metar£  r¤  s   `        @@rB   r¢  z	Expr.overý  sE  ú€ ð\ �>‰>×Ñ×,Ñ,Ô.ØRˆCÜ)¨#Ó.Ð.ä# LÓ1ÐÜ&0°¼3Ô&?˜™
ÀXˆÙ ©ØSˆCÜ˜S“/Ð!ä×!Ñ!ˆØ—n‘n×0Ñ0ˆØ× Ñ Ô"Ø=ˆCÜ'¨Ó,Ð,ØÐ$¨¯©×)<Ñ)<×)FÑ)FÔ)Hð ×&Ñ&Ô(Ð(Ð(ØÐ&¨{×/BÑ/BÔ/DØ^ˆCÜ'¨Ó,Ð,Ø—~‘~ˆà&1×&@Ñ&@Ô&BŒJ×"Ò"Ì
×HYÑHYð 	ô !ØØ(Ø'×6Ñ6ô
ˆ	ð �~‰~õð ó	
ð 	
rD   c                ó$   — | j                  «        S )uM  Return a boolean mask indicating duplicated values.

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1, 2, 3, 1], "b": ["a", "a", "b", "c"]})
            >>> df = nw.from_native(df_native)
            >>> df.with_columns(nw.all().is_duplicated().name.suffix("_is_duplicated"))
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |           Narwhals DataFrame            |
            |-----------------------------------------|
            |   a  b  a_is_duplicated  b_is_duplicated|
            |0  1  a             True             True|
            |1  2  a            False             True|
            |2  3  b            False            False|
            |3  1  c             True            False|
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        )Ú	is_uniquera   s    rB   Úis_duplicatedzExpr.is_duplicatedS  s   € ð, —‘Ó Ð Ð rD   c                ó,   ‡ — ‰ j                  ˆ fd„«      S )uÙ  Return a boolean mask indicating unique values.

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1, 2, 3, 1], "b": ["a", "a", "b", "c"]})
            >>> df = nw.from_native(df_native)
            >>> df.with_columns(nw.all().is_unique().name.suffix("_is_unique"))
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |       Narwhals DataFrame        |
            |---------------------------------|
            |   a  b  a_is_unique  b_is_unique|
            |0  1  a        False        False|
            |1  2  a         True        False|
            |2  3  b         True         True|
            |3  1  c        False         True|
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óB   •— ‰j                  | «      j                  «       S r;   )rG   r°  rg   s    €rB   rh   z Expr.is_unique.<locals>.<lambda>�  ó   ø€ ¨t×/FÑ/FÀsÓ/K×/UÑ/UÓ/W€ rD   ro   ra   s   `rB   r°  zExpr.is_uniquek  s   ø€ ð, ×"Ñ"Ó#WÓXÐXrD   c                ó,   ‡ — ‰ j                  ˆ fd„«      S )ud  Count null values.

        Returns:
            A new expression.

        Notes:
            pandas handles null values differently from Polars and PyArrow.
            See [null_handling](../pandas_like_concepts/null_handling.md/)
            for reference.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame(
            ...     {"a": [1, 2, None, 1], "b": ["a", None, "b", None]}
            ... )
            >>> df = nw.from_native(df_native)
            >>> df.select(nw.all().null_count())
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |Narwhals DataFrame|
            |------------------|
            |        a  b      |
            |     0  1  2      |
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óB   •— ‰j                  | «      j                  «       S r;   )rG   Ú
null_countrg   s    €rB   rh   z!Expr.null_count.<locals>.<lambda>ž  r•  rD   ri   ra   s   `rB   r·  zExpr.null_countƒ  s   ø€ ð4 ×%Ñ%ÛAó
ð 	
rD   c                ó|   ‡ — ‰ j                  ˆ fd„‰ j                  j                  t        j                  «      «      S )u»  Return a boolean mask indicating the first occurrence of each distinct value.

        !!! info
            For lazy backends, this operation must be followed by `Expr.over` with
            `order_by` specified, see [order-dependence](../basics/order_dependence.md).

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1, 2, 3, 1], "b": ["a", "a", "b", "c"]})
            >>> df = nw.from_native(df_native)
            >>> df.with_columns(
            ...     nw.all().is_first_distinct().name.suffix("_is_first_distinct")
            ... )
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |               Narwhals DataFrame                |
            |-------------------------------------------------|
            |   a  b  a_is_first_distinct  b_is_first_distinct|
            |0  1  a                 True                 True|
            |1  2  a                 True                False|
            |2  3  b                 True                 True|
            |3  1  c                False                 True|
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óB   •— ‰j                  | «      j                  «       S r;   )rG   Úis_first_distinctrg   s    €rB   rh   z(Expr.is_first_distinct.<locals>.<lambda>¾  s   ø€ ˜×/Ñ/°Ó4×FÑFÓH€ rD   r@  ra   s   `rB   rº  zExpr.is_first_distinct¡  s/   ø€ ð8 �~‰~ÛHØ�N‰N×9Ñ9¼(¿/¹/ÓJó
ð 	
rD   c                ó|   ‡ — ‰ j                  ˆ fd„‰ j                  j                  t        j                  «      «      S )už  Return a boolean mask indicating the last occurrence of each distinct value.

        !!! info
            For lazy backends, this operation must be followed by `Expr.over` with
            `order_by` specified, see [order-dependence](../basics/order_dependence.md).

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1, 2, 3, 1], "b": ["a", "a", "b", "c"]})
            >>> df = nw.from_native(df_native)
            >>> df.with_columns(
            ...     nw.all().is_last_distinct().name.suffix("_is_last_distinct")
            ... )
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |              Narwhals DataFrame               |
            |-----------------------------------------------|
            |   a  b  a_is_last_distinct  b_is_last_distinct|
            |0  1  a               False               False|
            |1  2  a                True                True|
            |2  3  b                True                True|
            |3  1  c                True                True|
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óB   •— ‰j                  | «      j                  «       S r;   )rG   Úis_last_distinctrg   s    €rB   rh   z'Expr.is_last_distinct.<locals>.<lambda>ß  s   ø€ ˜×/Ñ/°Ó4×EÑEÓG€ rD   r@  ra   s   `rB   r½  zExpr.is_last_distinctÂ  s/   ø€ ð8 �~‰~ÛGØ�N‰N×9Ñ9¼(¿/¹/ÓJó
ð 	
rD   c                ó4   ‡ ‡‡— ‰ j                  ˆˆˆ fd„«      S )u  Get quantile value.

        Arguments:
            quantile: Quantile between 0.0 and 1.0.
            interpolation: Interpolation method.

        Returns:
            A new expression.

        Note:
            - pandas and Polars may have implementation differences for a given interpolation method.
            - [dask](https://docs.dask.org/en/stable/generated/dask.dataframe.Series.quantile.html) has
                its own method to approximate quantile and it doesn't implement 'nearest', 'higher',
                'lower', 'midpoint' as interpolation method - use 'linear' which is closest to the
                native 'dask' - method.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame(
            ...     {"a": list(range(50)), "b": list(range(50, 100))}
            ... )
            >>> df = nw.from_native(df_native)
            >>> df.select(nw.col("a", "b").quantile(0.5, interpolation="linear"))
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |Narwhals DataFrame|
            |------------------|
            |        a     b   |
            |  0  24.5  74.5   |
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óF   •— ‰j                  | «      j                  ‰‰«      S r;   )rG   Úquantile)r>   ÚinterpolationrÀ  r@   s    €€€rB   rh   zExpr.quantile.<locals>.<lambda>  s   ø€ ˜×/Ñ/°Ó4×=Ñ=¸hÈÓV€ rD   ri   )r@   rÀ  rÁ  s   ```rB   rÀ  zExpr.quantileã  s   ú€ ðD ×%Ñ%ÝVó
ð 	
rD   c                óN   ‡ ‡— d}t        |d¬«       ‰ j                  ˆˆ fd„«      S )aô  Get the first `n` rows.

        !!! warning
            `Expr.head` is deprecated and will be removed in a future version.
            Hint: instead of `df.select(nw.col('a').head())`, use
            `df.select(nw.col('a')).head()` instead.
            Note: this will remain available in `narwhals.stable.v1`.
            See [stable api](../backcompat.md/) for more information.

        Arguments:
            n: Number of rows to return.

        Returns:
            A new expression.
        a$  `Expr.head` is deprecated and will be removed in a future version.

Hint: instead of `df.select(nw.col('a').head())`, use `df.select(nw.col('a')).head()`.

Note: this will remain available in `narwhals.stable.v1`.
See https://narwhals-dev.github.io/narwhals/backcompat/ for more information.
rZ  r[  c                óD   •— ‰j                  | «      j                  ‰«      S r;   )rG   ÚheadrI  s    €€rB   rh   zExpr.head.<locals>.<lambda>   ó   ø€ °×1HÑ1HÈÓ1M×1RÑ1RÐSTÓ1U€ rD   rˆ  ©r@   rJ  rW   s   `` rB   rÄ  z	Expr.head	  ó,   ù€ ð"^ð 	ô 	" #°Õ9Ø×$Ñ$Ô%UÓVÐVrD   c                óN   ‡ ‡— d}t        |d¬«       ‰ j                  ˆˆ fd„«      S )aó  Get the last `n` rows.

        !!! warning
            `Expr.tail` is deprecated and will be removed in a future version.
            Hint: instead of `df.select(nw.col('a').tail())`, use
            `df.select(nw.col('a')).tail()` instead.
            Note: this will remain available in `narwhals.stable.v1`.
            See [stable api](../backcompat.md/) for more information.

        Arguments:
            n: Number of rows to return.

        Returns:
            A new expression.
        a$  `Expr.tail` is deprecated and will be removed in a future version.

Hint: instead of `df.select(nw.col('a').tail())`, use `df.select(nw.col('a')).tail()`.

Note: this will remain available in `narwhals.stable.v1`.
See https://narwhals-dev.github.io/narwhals/backcompat/ for more information.
rZ  r[  c                óD   •— ‰j                  | «      j                  ‰«      S r;   )rG   ÚtailrI  s    €€rB   rh   zExpr.tail.<locals>.<lambda>9  rÅ  rD   rˆ  rÆ  s   `` rB   rÊ  z	Expr.tail"  rÇ  rD   c                ó0   ‡ ‡— ‰ j                  ˆˆ fd„«      S )uð  Round underlying floating point data by `decimals` digits.

        Arguments:
            decimals: Number of decimals to round by.

        Returns:
            A new expression.


        Notes:
            For values exactly halfway between rounded decimal values pandas behaves differently than Polars and Arrow.

            pandas rounds to the nearest even value (e.g. -0.5 and 0.5 round to 0.0, 1.5 and 2.5 round to 2.0, 3.5 and
            4.5 to 4.0, etc..).

            Polars and Arrow round away from 0 (e.g. -0.5 to -1.0, 0.5 to 1.0, 1.5 to 2.0, 2.5 to 3.0, etc..).

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1.12345, 2.56789, 3.901234]})
            >>> df = nw.from_native(df_native)
            >>> df.with_columns(a_rounded=nw.col("a").round(1))
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |  Narwhals DataFrame  |
            |----------------------|
            |          a  a_rounded|
            |0  1.123450        1.1|
            |1  2.567890        2.6|
            |2  3.901234        3.9|
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óD   •— ‰j                  | «      j                  ‰«      S r;   )rG   Úround)r>   Údecimalsr@   s    €€rB   rh   zExpr.round.<locals>.<lambda>]  s   ø€ ˜×/Ñ/°Ó4×:Ñ:¸8ÓD€ rD   ro   )r@   rÎ  s   ``rB   rÍ  z
Expr.round;  s   ù€ ðB ×"Ñ"ÜDó
ð 	
rD   c                ó,   ‡ — ‰ j                  ˆ fd„«      S )uK  Return the number of elements in the column.

        Null values count towards the total.

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": ["x", "y", "z"], "b": [1, 2, 1]})
            >>> df = nw.from_native(df_native)
            >>> df.select(
            ...     nw.col("a").filter(nw.col("b") == 1).len().alias("a1"),
            ...     nw.col("a").filter(nw.col("b") == 2).len().alias("a2"),
            ... )
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |Narwhals DataFrame|
            |------------------|
            |       a1  a2     |
            |    0   2   1     |
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óB   •— ‰j                  | «      j                  «       S r;   )rG   Úlenrg   s    €rB   rh   zExpr.len.<locals>.<lambda>x  rî   rD   ri   ra   s   `rB   rÑ  zExpr.len`  s   ø€ ð0 ×%Ñ%Ó&TÓUÐUrD   c                óR   ‡ ‡‡— d}t        |d¬«       ‰ j                  ˆˆˆ fd„«      S )aT  Take every nth value in the Series and return as new Series.

        !!! warning
            `Expr.gather_every` is deprecated and will be removed in a future version.
            Hint: instead of `df.select(nw.col('a').gather_every())`, use
            `df.select(nw.col('a')).gather_every()` instead.
            Note: this will remain available in `narwhals.stable.v1`.
            See [stable api](../backcompat.md/) for more information.

        Arguments:
            n: Gather every *n*-th row.
            offset: Starting index.

        Returns:
            A new expression.
        a<  `Expr.gather_every` is deprecated and will be removed in a future version.

Hint: instead of `df.select(nw.col('a').gather_every())`, use `df.select(nw.col('a')).gather_every()`.

Note: this will remain available in `narwhals.stable.v1`.
See https://narwhals-dev.github.io/narwhals/backcompat/ for more information.
rZ  r[  c                óH   •— ‰j                  | «      j                  ‰‰¬«      S )N)rJ  Úoffset)rG   Úgather_every)r>   rJ  rÔ  r@   s    €€€rB   rh   z#Expr.gather_every.<locals>.<lambda>“  s"   ø€ ˜×/Ñ/°Ó4×AÑAÀAÈfÐAÓU€ rD   rˆ  )r@   rJ  rÔ  rW   s   ``` rB   rÕ  zExpr.gather_everyz  s0   ú€ ð$^ð 	ô 	" #°Õ9Ø×$Ñ$ÝUó
ð 	
rD   c                óT   ‡ ‡‡— ‰ j                  ˆˆ ˆfd„t        ‰ ‰‰ddd¬«      «      S )u{  Clip values in the Series.

        Arguments:
            lower_bound: Lower bound value. String literals are treated as column names.
            upper_bound: Upper bound value. String literals are treated as column names.

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1, 2, 3]})
            >>> df = nw.from_native(df_native)
            >>> df.with_columns(a_clipped=nw.col("a").clip(-1, 3))
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |Narwhals DataFrame|
            |------------------|
            |    a  a_clipped  |
            | 0  1          1  |
            | 1  2          2  |
            | 2  3          3  |
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                ó.   •— t        | ˆˆfd„‰‰‰d¬«      S )Nc                 óR   •— | d   j                  ‰�| d   nd ‰�	| d   «      S d «      S )Nr   ró   é   )Úclip)r|  rj  rk  s    €€rB   rh   z-Expr.clip.<locals>.<lambda>.<locals>.<lambda>¶  s8   ø€ ˜u Q™xŸ}™}Ø +Ð 7�E˜!’H¸TØ +Ð 7�E˜!‘Hó € à=Aó € rD   Fr�   r   )r>   rj  r@   rk  s    €€€rB   rh   zExpr.clip.<locals>.<lambda>´  s#   ø€ Ô-Øôð ØØØ ô
€ rD   Frl  ro  )r@   rj  rk  s   ```rB   rÚ  z	Expr.clip–  s7   ú€ ð: �~‰~õ
ô ØØØØ Ø#(Ø!&ôó
ð 	
rD   c                ó,   ‡ — ‰ j                  ˆ fd„«      S )u­  Compute the most occurring value(s).

        Can return multiple values.

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1, 1, 2, 3], "b": [1, 1, 2, 2]})
            >>> df = nw.from_native(df_native)
            >>> df.select(nw.col("a").mode()).sort("a")
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |Narwhals DataFrame|
            |------------------|
            |          a       |
            |       0  1       |
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óB   •— ‰j                  | «      j                  «       S r;   )rG   Úmoderg   s    €rB   rh   zExpr.mode.<locals>.<lambda>Þ  s   ø€ °×1HÑ1HÈÓ1M×1RÑ1RÓ1T€ rD   r5  ra   s   `rB   rÝ  z	Expr.modeÉ  s   ø€ ð* ×$Ñ$Ó%TÓUÐUrD   c                ó,   ‡ — ‰ j                  ˆ fd„«      S )u‹  Returns boolean values indicating which original values are finite.

        Warning:
            pandas handles null values differently from Polars and PyArrow.
            See [null_handling](../pandas_like_concepts/null_handling.md/)
            for reference.
            `is_finite` will return False for NaN and Null's in the Dask and
            pandas non-nullable backend, while for Polars, PyArrow and pandas
            nullable backends null values are kept as such.

        Returns:
            Expression of `Boolean` data type.

        Examples:
            >>> import polars as pl
            >>> import narwhals as nw
            >>> df_native = pl.DataFrame({"a": [float("nan"), float("inf"), 2.0, None]})
            >>> df = nw.from_native(df_native)
            >>> df.with_columns(a_is_finite=nw.col("a").is_finite())
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |  Narwhals DataFrame  |
            |----------------------|
            |shape: (4, 2)         |
            |â”Œâ”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�|
            |â”‚ a    â”† a_is_finite â”‚|
            |â”‚ ---  â”† ---         â”‚|
            |â”‚ f64  â”† bool        â”‚|
            |â•žâ•�â•�â•�â•�â•�â•�â•ªâ•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•¡|
            |â”‚ NaN  â”† false       â”‚|
            |â”‚ inf  â”† false       â”‚|
            |â”‚ 2.0  â”† true        â”‚|
            |â”‚ null â”† null        â”‚|
            |â””â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜|
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óB   •— ‰j                  | «      j                  «       S r;   )rG   Ú	is_finiterg   s    €rB   rh   z Expr.is_finite.<locals>.<lambda>  r´  rD   ro   ra   s   `rB   rà  zExpr.is_finiteà  s   ø€ ðH ×"Ñ"Ó#WÓXÐXrD   c               ó€   ‡ ‡— ‰ j                  ˆˆ fd„‰ j                  j                  t        j                  «      «      S )u¹  Return the cumulative count of the non-null values in the column.

        !!! info
            For lazy backends, this operation must be followed by `Expr.over` with
            `order_by` specified, see [order-dependence](../basics/order_dependence.md).

        Arguments:
            reverse: reverse the operation

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": ["x", "k", None, "d"]})
            >>> df = nw.from_native(df_native)
            >>> df.with_columns(
            ...     nw.col("a").cum_count().alias("a_cum_count"),
            ...     nw.col("a").cum_count(reverse=True).alias("a_cum_count_reverse"),
            ... )
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |           Narwhals DataFrame            |
            |-----------------------------------------|
            |      a  a_cum_count  a_cum_count_reverse|
            |0     x            1                    3|
            |1     k            2                    2|
            |2  None            2                    1|
            |3     d            3                    1|
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óF   •— ‰j                  | «      j                  ‰¬«      S r<  )rG   Ú	cum_countr>  s    €€rB   rh   z Expr.cum_count.<locals>.<lambda>'  s    ø€ ˜×/Ñ/°Ó4×>Ñ>ÀwÐ>ÓO€ rD   r@  rB  s   ``rB   rã  zExpr.cum_count  s0   ù€ ð@ �~‰~ÜOØ�N‰N×9Ñ9¼(¿/¹/ÓJó
ð 	
rD   c               ó€   ‡ ‡— ‰ j                  ˆˆ fd„‰ j                  j                  t        j                  «      «      S )uh  Return the cumulative min of the non-null values in the column.

        !!! info
            For lazy backends, this operation must be followed by `Expr.over` with
            `order_by` specified, see [order-dependence](../basics/order_dependence.md).

        Arguments:
            reverse: reverse the operation

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [3, 1, None, 2]})
            >>> df = nw.from_native(df_native)
            >>> df.with_columns(
            ...     nw.col("a").cum_min().alias("a_cum_min"),
            ...     nw.col("a").cum_min(reverse=True).alias("a_cum_min_reverse"),
            ... )
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |         Narwhals DataFrame         |
            |------------------------------------|
            |     a  a_cum_min  a_cum_min_reverse|
            |0  3.0        3.0                1.0|
            |1  1.0        1.0                1.0|
            |2  NaN        NaN                NaN|
            |3  2.0        1.0                2.0|
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óF   •— ‰j                  | «      j                  ‰¬«      S r<  )rG   Úcum_minr>  s    €€rB   rh   zExpr.cum_min.<locals>.<lambda>L  r?  rD   r@  rB  s   ``rB   ræ  zExpr.cum_min+  ó0   ù€ ð@ �~‰~ÜMØ�N‰N×9Ñ9¼(¿/¹/ÓJó
ð 	
rD   c               ó€   ‡ ‡— ‰ j                  ˆˆ fd„‰ j                  j                  t        j                  «      «      S )uh  Return the cumulative max of the non-null values in the column.

        !!! info
            For lazy backends, this operation must be followed by `Expr.over` with
            `order_by` specified, see [order-dependence](../basics/order_dependence.md).

        Arguments:
            reverse: reverse the operation

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1, 3, None, 2]})
            >>> df = nw.from_native(df_native)
            >>> df.with_columns(
            ...     nw.col("a").cum_max().alias("a_cum_max"),
            ...     nw.col("a").cum_max(reverse=True).alias("a_cum_max_reverse"),
            ... )
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |         Narwhals DataFrame         |
            |------------------------------------|
            |     a  a_cum_max  a_cum_max_reverse|
            |0  1.0        1.0                3.0|
            |1  3.0        3.0                3.0|
            |2  NaN        NaN                NaN|
            |3  2.0        3.0                2.0|
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óF   •— ‰j                  | «      j                  ‰¬«      S r<  )rG   Úcum_maxr>  s    €€rB   rh   zExpr.cum_max.<locals>.<lambda>q  r?  rD   r@  rB  s   ``rB   rê  zExpr.cum_maxP  rç  rD   c               ó€   ‡ ‡— ‰ j                  ˆˆ fd„‰ j                  j                  t        j                  «      «      S )uŠ  Return the cumulative product of the non-null values in the column.

        !!! info
            For lazy backends, this operation must be followed by `Expr.over` with
            `order_by` specified, see [order-dependence](../basics/order_dependence.md).

        Arguments:
            reverse: reverse the operation

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1, 3, None, 2]})
            >>> df = nw.from_native(df_native)
            >>> df.with_columns(
            ...     nw.col("a").cum_prod().alias("a_cum_prod"),
            ...     nw.col("a").cum_prod(reverse=True).alias("a_cum_prod_reverse"),
            ... )
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |          Narwhals DataFrame          |
            |--------------------------------------|
            |     a  a_cum_prod  a_cum_prod_reverse|
            |0  1.0         1.0                 6.0|
            |1  3.0         3.0                 6.0|
            |2  NaN         NaN                 NaN|
            |3  2.0         6.0                 2.0|
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        c                óF   •— ‰j                  | «      j                  ‰¬«      S r<  )rG   Úcum_prodr>  s    €€rB   rh   zExpr.cum_prod.<locals>.<lambda>–  s    ø€ ˜×/Ñ/°Ó4×=Ñ=ÀgÐ=ÓN€ rD   r@  rB  s   ``rB   rí  zExpr.cum_produ  s0   ù€ ð@ �~‰~ÜNØ�N‰N×9Ñ9¼(¿/¹/ÓJó
ð 	
rD   )rú   Úcenterc               ó¨   ‡ ‡‡‡— t        ‰|¬«      \  ŠŠ‰ j                  ˆˆˆ ˆfd„‰ j                  j                  t        j
                  «      «      S )u1  Apply a rolling sum (moving sum) over the values.

        A window of length `window_size` will traverse the values. The resulting values
        will be aggregated to their sum.

        The window at a given row will include the row itself and the `window_size - 1`
        elements before it.

        !!! info
            For lazy backends, this operation must be followed by `Expr.over` with
            `order_by` specified, see [order-dependence](../basics/order_dependence.md).

        Arguments:
            window_size: The length of the window in number of elements. It must be a
                strictly positive integer.
            min_samples: The number of values in the window that should be non-null before
                computing a result. If set to `None` (default), it will be set equal to
                `window_size`. If provided, it must be a strictly positive integer, and
                less than or equal to `window_size`
            center: Set the labels at the center of the window.

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1.0, 2.0, None, 4.0]})
            >>> df = nw.from_native(df_native)
            >>> df.with_columns(
            ...     a_rolling_sum=nw.col("a").rolling_sum(window_size=3, min_samples=1)
            ... )
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            | Narwhals DataFrame  |
            |---------------------|
            |     a  a_rolling_sum|
            |0  1.0            1.0|
            |1  2.0            3.0|
            |2  NaN            3.0|
            |3  4.0            6.0|
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        ©Úwindow_sizerú   c                óJ   •— ‰j                  | «      j                  ‰‰‰¬«      S ©N)rñ  rú   rî  )rG   Úrolling_sum)r>   rî  Úmin_samples_intr@   rñ  s    €€€€rB   rh   z"Expr.rolling_sum.<locals>.<lambda>Ð  s,   ø€ ˜×/Ñ/°Ó4×@Ñ@Ø'Ø+Øð Aó € rD   ©r!   rM   r=   rZ   r
   rA  )r@   rñ  rú   rî  rõ  s   `` `@rB   rô  zExpr.rolling_sumš  sK   û€ ôb (CØ#°ô(
Ñ$ˆ�_ð �~‰~öð
 �N‰N×9Ñ9¼(¿/¹/ÓJó
ð 	
rD   c               ó¨   ‡ ‡‡‡— t        ‰‰¬«      \  ŠŠ‰ j                  ˆˆˆ ˆfd„‰ j                  j                  t        j
                  «      «      S )uC  Apply a rolling mean (moving mean) over the values.

        A window of length `window_size` will traverse the values. The resulting values
        will be aggregated to their mean.

        The window at a given row will include the row itself and the `window_size - 1`
        elements before it.

        !!! info
            For lazy backends, this operation must be followed by `Expr.over` with
            `order_by` specified, see [order-dependence](../basics/order_dependence.md).

        Arguments:
            window_size: The length of the window in number of elements. It must be a
                strictly positive integer.
            min_samples: The number of values in the window that should be non-null before
                computing a result. If set to `None` (default), it will be set equal to
                `window_size`. If provided, it must be a strictly positive integer, and
                less than or equal to `window_size`
            center: Set the labels at the center of the window.

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1.0, 2.0, None, 4.0]})
            >>> df = nw.from_native(df_native)
            >>> df.with_columns(
            ...     a_rolling_mean=nw.col("a").rolling_mean(window_size=3, min_samples=1)
            ... )
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |  Narwhals DataFrame  |
            |----------------------|
            |     a  a_rolling_mean|
            |0  1.0             1.0|
            |1  2.0             1.5|
            |2  NaN             1.5|
            |3  4.0             3.0|
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        rð  c                óJ   •— ‰j                  | «      j                  ‰‰‰¬«      S ró  )rG   Úrolling_mean)r>   rî  rú   r@   rñ  s    €€€€rB   rh   z#Expr.rolling_mean.<locals>.<lambda>	  s,   ø€ ˜×/Ñ/°Ó4×AÑAØ'Ø'Øð Bó € rD   rö  )r@   rñ  rú   rî  s   ````rB   rù  zExpr.rolling_meanØ  sJ   û€ ôb $?Ø#°ô$
Ñ ˆ�[ð �~‰~öð
 �N‰N×9Ñ9¼(¿/¹/ÓJó
ð 	
rD   )rú   rî  r  c               ó¬   ‡ ‡‡‡‡— t        ‰‰¬«      \  ŠŠ‰ j                  ˆˆˆˆ ˆfd„‰ j                  j                  t        j
                  «      «      S )uœ  Apply a rolling variance (moving variance) over the values.

        A window of length `window_size` will traverse the values. The resulting values
        will be aggregated to their variance.

        The window at a given row will include the row itself and the `window_size - 1`
        elements before it.

        !!! info
            For lazy backends, this operation must be followed by `Expr.over` with
            `order_by` specified, see [order-dependence](../basics/order_dependence.md).

        Arguments:
            window_size: The length of the window in number of elements. It must be a
                strictly positive integer.
            min_samples: The number of values in the window that should be non-null before
                computing a result. If set to `None` (default), it will be set equal to
                `window_size`. If provided, it must be a strictly positive integer, and
                less than or equal to `window_size`.
            center: Set the labels at the center of the window.
            ddof: Delta Degrees of Freedom; the divisor for a length N window is N - ddof.

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1.0, 2.0, None, 4.0]})
            >>> df = nw.from_native(df_native)
            >>> df.with_columns(
            ...     a_rolling_var=nw.col("a").rolling_var(window_size=3, min_samples=1)
            ... )
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            | Narwhals DataFrame  |
            |---------------------|
            |     a  a_rolling_var|
            |0  1.0            NaN|
            |1  2.0            0.5|
            |2  NaN            0.5|
            |3  4.0            2.0|
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        rð  c                óL   •— ‰j                  | «      j                  ‰‰‰‰¬«      S ©N)rñ  rú   rî  r  )rG   Úrolling_var©r>   rî  r  rú   r@   rñ  s    €€€€€rB   rh   z"Expr.rolling_var.<locals>.<lambda>N	  s-   ø€ ˜×/Ñ/°Ó4×@Ñ@Ø'°[ÈÐVZð Aó € rD   rö  ©r@   rñ  rú   rî  r  s   `````rB   rý  zExpr.rolling_var	  sJ   ü€ ôf $?Ø#°ô$
Ñ ˆ�[ð �~‰~÷ð �N‰N×9Ñ9¼(¿/¹/ÓJó	
ð 	
rD   c               ó¬   ‡ ‡‡‡‡— t        ‰‰¬«      \  ŠŠ‰ j                  ˆˆˆˆ ˆfd„‰ j                  j                  t        j
                  «      «      S )uº  Apply a rolling standard deviation (moving standard deviation) over the values.

        A window of length `window_size` will traverse the values. The resulting values
        will be aggregated to their standard deviation.

        The window at a given row will include the row itself and the `window_size - 1`
        elements before it.

        !!! info
            For lazy backends, this operation must be followed by `Expr.over` with
            `order_by` specified, see [order-dependence](../basics/order_dependence.md).

        Arguments:
            window_size: The length of the window in number of elements. It must be a
                strictly positive integer.
            min_samples: The number of values in the window that should be non-null before
                computing a result. If set to `None` (default), it will be set equal to
                `window_size`. If provided, it must be a strictly positive integer, and
                less than or equal to `window_size`.
            center: Set the labels at the center of the window.
            ddof: Delta Degrees of Freedom; the divisor for a length N window is N - ddof.

        Returns:
            A new expression.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [1.0, 2.0, None, 4.0]})
            >>> df = nw.from_native(df_native)
            >>> df.with_columns(
            ...     a_rolling_std=nw.col("a").rolling_std(window_size=3, min_samples=1)
            ... )
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            | Narwhals DataFrame  |
            |---------------------|
            |     a  a_rolling_std|
            |0  1.0            NaN|
            |1  2.0       0.707107|
            |2  NaN       0.707107|
            |3  4.0       1.414214|
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        rð  c                óL   •— ‰j                  | «      j                  ‰‰‰‰¬«      S rü  )rG   Úrolling_stdrþ  s    €€€€€rB   rh   z"Expr.rolling_std.<locals>.<lambda>Œ	  s/   ø€ ˜×/Ñ/°Ó4×@Ñ@Ø'Ø'ØØð	 Aó € rD   rö  rÿ  s   `````rB   r  zExpr.rolling_stdT	  sJ   ü€ ôf $?Ø#°ô$
Ñ ˆ�[ð �~‰~÷ð �N‰N×9Ñ9¼(¿/¹/ÓJó
ð 	
rD   )rW  c               óf   ‡ ‡‡— h d£}‰|vrd‰› d�}t        |«      ‚‰ j                  ˆˆˆ fd„«      S )uœ  Assign ranks to data, dealing with ties appropriately.

        Notes:
            The resulting dtype may differ between backends.

        !!! info
            For lazy backends, this operation must be followed by `Expr.over` with
            `order_by` specified, see [order-dependence](../basics/order_dependence.md).

        Arguments:
            method: The method used to assign ranks to tied elements.
                The following methods are available (default is 'average'):

                - 'average' : The average of the ranks that would have been assigned to
                  all the tied values is assigned to each value.
                - 'min' : The minimum of the ranks that would have been assigned to all
                    the tied values is assigned to each value. (This is also referred to
                    as "competition" ranking.)
                - 'max' : The maximum of the ranks that would have been assigned to all
                    the tied values is assigned to each value.
                - 'dense' : Like 'min', but the rank of the next highest element is
                   assigned the rank immediately after those assigned to the tied
                   elements.
                - 'ordinal' : All values are given a distinct rank, corresponding to the
                    order that the values occur in the Series.

            descending: Rank in descending order.

        Returns:
            A new expression with rank data.

        Examples:
            >>> import pandas as pd
            >>> import narwhals as nw
            >>> df_native = pd.DataFrame({"a": [3, 6, 1, 1, 6]})
            >>> df = nw.from_native(df_native)
            >>> result = df.with_columns(rank=nw.col("a").rank(method="dense"))
            >>> result
            â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”�
            |Narwhals DataFrame|
            |------------------|
            |       a  rank    |
            |    0  3   2.0    |
            |    1  6   3.0    |
            |    2  1   1.0    |
            |    3  1   1.0    |
            |    4  6   3.0    |
            â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
        >   r"  r  ÚdenseÚaverageÚordinalzTRanking method must be one of {'average', 'min', 'max', 'dense', 'ordinal'}. Found 'ú'c                óH   •— ‰j                  | «      j                  ‰‰¬«      S )N)ÚmethodrW  )rG   Úrank)r>   rW  r	  r@   s    €€€rB   rh   zExpr.rank.<locals>.<lambda>Ð	  s'   ø€ ˜×/Ñ/°Ó4×9Ñ9Ø¨*ð :ó € rD   )r‘  rP   )r@   r	  rW  Úsupported_rank_methodsrW   s   ```  rB   r
  z	Expr.rank•	  sP   ú€ òd "OÐØÐ/Ñ/ðØ ˜ ð$ð ô ˜S“/Ð!à×"Ñ"õó
ð 	
rD   c                ó   — t        | «      S r;   r   ra   s    rB   ru  zExpr.strÕ	  ó   € ä" 4Ó(Ð(rD   c                ó   — t        | «      S r;   r   ra   s    rB   ÚdtzExpr.dtÙ	  s   € ä$ TÓ*Ð*rD   c                ó   — t        | «      S r;   r   ra   s    rB   ÚcatzExpr.catÝ	  s   € ä Ó%Ð%rD   c                ó   — t        | «      S r;   r   ra   s    rB   rn   z	Expr.nameá	  ó   € ä  Ó&Ð&rD   c                ó   — t        | «      S r;   r   ra   s    rB   rS  z	Expr.listå	  r  rD   c                ó   — t        | «      S r;   r   ra   s    rB   ÚstructzExpr.structé	  r  rD   )rA   r6   rH   r   rE   ÚNone)rA   zCallable[[Any], Any]rE   r'   )rE   ru  )rE   r'   )rn   ru  rE   r'   )rr   z"Callable[Concatenate[Self, PS], R]rs   zPS.argsrt   z	PS.kwargsrE   r5   )ry   zDType | type[DType]rE   r'   )r„   z
Self | AnyrE   r'   )r„   r   rE   r'   )rõ   úfloat | Nonerö   r  r÷   r  rø   r  rù   Úboolrú   Úintrû   r  rE   r'   )r  r  rE   r'   r;   )rr   z(Callable[[Any], CompliantExpr[Any, Any]]r  zDType | NonerE   r'   )rE   r8   )r9  r  rE   r'   )rJ  r  rE   r'   )rP  z!Sequence[Any] | Mapping[Any, Any]rO  zSequence[Any] | Noner  zDType | type[DType] | NonerE   r'   )rW  r  rX  r  rE   r'   )Úboth)rj  úAny | IntoExprrk  r  rh  r,   rE   r'   )r~  r   rE   r'   )NNN)r�  zExpr | NonNestedLiteralrŽ  zFillNullStrategy | Noner�  ú
int | NonerE   r'   )
rJ  r  r—  r  r˜  r  r™  r  rE   r'   )r«  zstr | Sequence[str]r�  zstr | Sequence[str] | NonerE   r'   )rÀ  ÚfloatrÁ  r2   rE   r'   )é
   )r   )rÎ  r  rE   r'   )rJ  r  rÔ  r  rE   r'   )NN)rj  ú2IntoExpr | NumericLiteral | TemporalLiteral | Nonerk  r   rE   r'   )rñ  r  rú   r  rî  r  rE   r'   )
rñ  r  rú   r  rî  r  r  r  rE   r'   )r  )r	  r1   rW  r  rE   r'   )rE   zExprStringNamespace[Self])rE   zExprDateTimeNamespace[Self])rE   zExprCatNamespace[Self])rE   zExprNameNamespace[Self])rE   zExprListNamespace[Self])rE   zExprStructNamespace[Self])eÚ__name__Ú
__module__Ú__qualname__rI   rP   rX   r[   r^   rb   rj   rm   ru   rx   r‰   rŽ   r”   r™   rž   r    r¤   r¦   rª   r®   rµ   r¹   r½   r¿   rÃ   rÇ   rË   rÏ   rÓ   r×   rÛ   rß   rã   rç   rê   rí   rò   rþ   r  r  r  r  r  r  rf   r  r"  r%  r+  r.  r1  r4  re   r=  rE  rH  rN  r^  rp  rt  r{  r�  r„  r‡  r�  r”  rœ  r¢  r±  r°  r·  rº  r½  rÀ  rÄ  rÊ  rÍ  rÑ  rÕ  rÚ  rÝ  rà  rã  ræ  rê  rí  rô  rù  rý  r  r
  Úpropertyru  r  r  rn   rS  r  rq   rD   rB   r8   r8   9   sƒ  „ ó"ó
Aó
ð	
Ø!5ð	
à	ó	
ó
ó>ó
óYð2 /à4ð /ð ð /ð ð	 /ð
 
ó /óDYó8
ó
ó
ó/ó
ó/ó
ó/ó
ó

ó
ó

ó
ó/ó
ó
ó
ó
ó
ó

ó
ó

ó
ó

óZóVó*Vð0 !Ø!Ø"&Ø"ØØØ"ñ`
ð ð`
ð ð	`
ð
  ð`
ð ð`
ð ð`
ð ð`
ð ð`
ð 
ó`
óDWó*Yð0 "#õ 
ð6 "#õ 
ð< &*ð-
à:ð-
ð #ð-
ð 
ó	-
ó^Wó*Vó2Vó*Vó*
ó.
ó.Xó*[ó*Xó*Sð, */õ !
óF-
ó^0
ðj %)ð9
ð
 48ñ9
à.ð9
ð "ð9
ð
 1ð9
ð 
ó9
ðv */À5õ 
ðH "(ð	;
à#ð;
ð $ð;
ð ð	;
ð
 
ó;
óz!+óF.
ó`!WóF!VóFZð  *.Ø,0Ø ð	_
à&ð_
ð *ð_
ð ð	_
ð
 
ó_
óD$
ðP ð&
ð "&Ø!&Øñ&
àð&
ð ð	&
ð
 ð&
ð ð&
ð 
ó&
ðV 04ñT
à*ðT
ð -ðT
ð 
ó	T
ól!ó0Yó0
ó<
óB
ðB$
Øð$
Ø.Hð$
à	ó$
ôLWô2Wô2#
óJVô4
ð< KOØJNð1
àGð1
ð Hð1
ð 
ó	1
ófVó.$YðL ,1õ #
ðJ */õ #
ðJ */õ #
ðJ +0õ #
ðR #'Øñ<
àð<
ð  ð	<
ð
 ð<
ð 
ó<
ðD #'Øñ<
àð<
ð  ð	<
ð
 ð<
ð 
ó<
ðD #'ØØñ<
àð<
ð  ð	<
ð
 ð<
ð ð<
ð 
ó<
ðD #'ØØñ?
àð?
ð  ð	?
ð
 ð?
ð ð?
ð 
ó?
ðB>
Èõ >
ð@ ò)ó ð)ð ò+ó ð+ð ò&ó ð&ð ò'ó ð'ð ò'ó ð'ð ò)ó ñ)rD   r8   N)@Ú
__future__r   Útypingr   r   r   r   r   r	   Únarwhals._expression_parsingr
   r   r   r   r   r   Únarwhals.dtypesr   Únarwhals.exceptionsr   r   Únarwhals.expr_catr   Únarwhals.expr_dtr   Únarwhals.expr_listr   Únarwhals.expr_namer   Únarwhals.expr_strr   Únarwhals.expr_structr   Únarwhals.translater    Únarwhals.utilsr!   r"   r#   r$   Útyping_extensionsr%   r&   r'   r(   Únarwhals._compliantr)   r*   r+   Únarwhals.typingr,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   Ú__annotations__r8   Ú__all__rq   rD   rB   ú<module>r7     sà   ðÞ "å  Ý Ý Ý Ý Ý å 1Ý 5Ý 3Ý >Ý 9Ý :Ý +Ý 5Ý 7Ý .Ý 2Ý 0Ý 0Ý 1Ý 4Ý (Ý 6Ý "Ý 4áÝå-Ý+Ý&Ý+å1Ý6Ý%Ý.Ý0Ý(Ý0Ý.Ý*Ý:Ý/á	�4‹€BÙ�‹€AØ&Ø	˜C ˜HÑ	%Ð&¨°c¸3°hÑ(?Ð?ñ€L�)ó ÷
r&)ñ r&)ðlM ð�rD   