o
    Ýñh§*  ã                   @  s  d dl mZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ d d	lmZ erJd d
lmZ d dlmZ d dlmZ G dd„ deƒZd+dd„Zd,dd„Zd-dd„Zd-dd„Zd-dd„Zd-dd„Zd-d d!„Z	"	#d.d/d(d)„Zg d*¢Zd"S )0é    )Úannotations)ÚTYPE_CHECKING)ÚAny)ÚIterable)ÚNoReturn)ÚExprMetadata)Úcombine_metadata)ÚExpr)Úflatten)Útimezone)ÚDType)ÚTimeUnitc                   @  sR   e Zd Zddd„Zddd„Zdd	d
„Zddd„Zddd„Zddd„Zddd„Z	dS )ÚSelectorÚreturnr	   c                 C  s   t | j| jƒS ©N)r	   Ú_to_compliant_exprÚ	_metadata)Úself© r   úF/var/www/vscode/kcb/lib/python3.10/site-packages/narwhals/selectors.pyÚ_to_expr   s   zSelector._to_exprÚotherr   c                 C  s"   t |tƒrd}t|ƒ‚|  ¡ | S )Nz=unsupported operand type(s) for op: ('Selector' + 'Selector'))Ú
isinstancer   Ú	TypeErrorr   )r   r   Úmsgr   r   r   Ú__add__   s   
zSelector.__add__c              
     s:   t ˆ tƒrˆ ‡ ‡fdd„tˆˆ dddd¡S ˆ ¡ ˆ B S )Nc                   s   ˆ  | ¡ˆ   | ¡B S r   ©r   ©Úplx©r   r   r   r   Ú<lambda>!   ó    z!Selector.__or__.<locals>.<lambda>FT©Ú
str_as_litÚallow_multi_outputÚto_single_output©r   r   Ú	__class__r   r   ©r   r   r   r   r   Ú__or__   ó   
ûþ
zSelector.__or__c              
     s:   t ˆ tƒrˆ ‡ ‡fdd„tˆˆ dddd¡S ˆ ¡ ˆ @ S )Nc                   s   ˆ  | ¡ˆ   | ¡@ S r   r   r   r   r   r   r    /   r!   z"Selector.__and__.<locals>.<lambda>FTr"   r&   r(   r   r   r   Ú__and__,   r*   zSelector.__and__r   c                 C  ó   t ‚r   ©ÚNotImplementedErrorr(   r   r   r   Ú__rsub__:   ó   zSelector.__rsub__c                 C  r,   r   r-   r(   r   r   r   Ú__rand__=   r0   zSelector.__rand__c                 C  r,   r   r-   r(   r   r   r   Ú__ror__@   r0   zSelector.__ror__N)r   r	   )r   r   r   r	   )r   r   r   r   )
Ú__name__Ú
__module__Ú__qualname__r   r   r)   r+   r/   r1   r2   r   r   r   r   r      s    





r   Údtypesú3DType | type[DType] | Iterable[DType | type[DType]]r   c                    s   t | ƒ‰ t‡ fdd„t ¡ ƒS )a’  Select columns based on their dtype.

    Arguments:
        dtypes: one or data types to select

    Returns:
        A new expression.

    Examples:
        >>> import pyarrow as pa
        >>> import narwhals as nw
        >>> import narwhals.selectors as ncs
        >>> df_native = pa.table({"a": [1, 2], "b": ["x", "y"], "c": [4.1, 2.3]})
        >>> df = nw.from_native(df_native)

        Let's select int64 and float64  dtypes and multiply each value by 2:

        >>> df.select(ncs.by_dtype(nw.Int64, nw.Float64) * 2).to_native()
        pyarrow.Table
        a: int64
        c: double
        ----
        a: [[2,4]]
        c: [[8.2,4.6]]
    c                   ó   | j  ˆ ¡S r   )Ú	selectorsÚby_dtyper   ©Ú	flattenedr   r   r    `   ó    zby_dtype.<locals>.<lambda>)r
   r   r   Úselector_multi_unnamed)r6   r   r;   r   r:   D   s
   
þr:   ÚpatternÚstrc                   s   t ‡ fdd„t ¡ ƒS )aî  Select all columns that match the given regex pattern.

    Arguments:
        pattern: A valid regular expression pattern.

    Returns:
        A new expression.

    Examples:
        >>> import pandas as pd
        >>> import narwhals as nw
        >>> import narwhals.selectors as ncs
        >>> df_native = pd.DataFrame(
        ...     {
        ...         "bar": [123, 456],
        ...         "baz": [2.0, 5.5],
        ...         "zap": [0, 1],
        ...     }
        ... )
        >>> df = nw.from_native(df_native)

        Let's select column names containing an 'a', preceded by a character that is not 'z':

        >>> df.select(ncs.matches("[^z]a")).to_native()
           bar  baz
        0  123  2.0
        1  456  5.5
    c                   r8   r   )r9   Úmatchesr   ©r?   r   r   r    ƒ   r=   zmatches.<locals>.<lambda>©r   r   r>   rB   r   rB   r   rA   e   s   
þrA   c                   C  ó   t dd„ t ¡ ƒS )uî  Select numeric columns.

    Returns:
        A new expression.

    Examples:
        >>> import polars as pl
        >>> import narwhals as nw
        >>> import narwhals.selectors as ncs
        >>> df_native = pl.DataFrame({"a": [1, 2], "b": ["x", "y"], "c": [4.1, 2.3]})
        >>> df = nw.from_native(df_native)

        Let's select numeric dtypes and multiply each value by 2:

        >>> df.select(ncs.numeric() * 2).to_native()
        shape: (2, 2)
        â”Œâ”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”
        â”‚ a   â”† c   â”‚
        â”‚ --- â”† --- â”‚
        â”‚ i64 â”† f64 â”‚
        â•žâ•â•â•â•â•â•ªâ•â•â•â•â•â•¡
        â”‚ 2   â”† 8.2 â”‚
        â”‚ 4   â”† 4.6 â”‚
        â””â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”˜
    c                 S  ó
   | j  ¡ S r   )r9   Únumericr   r   r   r   r    £   ó   
 znumeric.<locals>.<lambda>rC   r   r   r   r   rF   ˆ   ó   ÿrF   c                   C  rD   )u¥  Select boolean columns.

    Returns:
        A new expression.

    Examples:
        >>> import polars as pl
        >>> import narwhals as nw
        >>> import narwhals.selectors as ncs
        >>> df_native = pl.DataFrame({"a": [1, 2], "b": ["x", "y"], "c": [False, True]})
        >>> df = nw.from_native(df_native)

        Let's select boolean dtypes:

        >>> df.select(ncs.boolean())
        â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”
        |Narwhals DataFrame|
        |------------------|
        |  shape: (2, 1)   |
        |  â”Œâ”€â”€â”€â”€â”€â”€â”€â”       |
        |  â”‚ c     â”‚       |
        |  â”‚ ---   â”‚       |
        |  â”‚ bool  â”‚       |
        |  â•žâ•â•â•â•â•â•â•â•¡       |
        |  â”‚ false â”‚       |
        |  â”‚ true  â”‚       |
        |  â””â”€â”€â”€â”€â”€â”€â”€â”˜       |
        â””â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
    c                 S  rE   r   )r9   Úbooleanr   r   r   r   r    Æ   rG   zboolean.<locals>.<lambda>rC   r   r   r   r   rI   §   s   ÿrI   c                   C  rD   )uo  Select string columns.

    Returns:
        A new expression.

    Examples:
        >>> import polars as pl
        >>> import narwhals as nw
        >>> import narwhals.selectors as ncs
        >>> df_native = pl.DataFrame({"a": [1, 2], "b": ["x", "y"], "c": [False, True]})
        >>> df = nw.from_native(df_native)

        Let's select string dtypes:

        >>> df.select(ncs.string()).to_native()
        shape: (2, 1)
        â”Œâ”€â”€â”€â”€â”€â”
        â”‚ b   â”‚
        â”‚ --- â”‚
        â”‚ str â”‚
        â•žâ•â•â•â•â•â•¡
        â”‚ x   â”‚
        â”‚ y   â”‚
        â””â”€â”€â”€â”€â”€â”˜
    c                 S  rE   r   )r9   Ústringr   r   r   r   r    å   rG   zstring.<locals>.<lambda>rC   r   r   r   r   rJ   Ê   rH   rJ   c                   C  rD   )uû  Select categorical columns.

    Returns:
        A new expression.

    Examples:
        >>> import polars as pl
        >>> import narwhals as nw
        >>> import narwhals.selectors as ncs
        >>> df_native = pl.DataFrame({"a": [1, 2], "b": ["x", "y"], "c": [False, True]})

        Let's convert column "b" to categorical, and then select categorical dtypes:

        >>> df = nw.from_native(df_native).with_columns(
        ...     b=nw.col("b").cast(nw.Categorical())
        ... )
        >>> df.select(ncs.categorical()).to_native()
        shape: (2, 1)
        â”Œâ”€â”€â”€â”€â”€â”
        â”‚ b   â”‚
        â”‚ --- â”‚
        â”‚ cat â”‚
        â•žâ•â•â•â•â•â•¡
        â”‚ x   â”‚
        â”‚ y   â”‚
        â””â”€â”€â”€â”€â”€â”˜
    c                 S  rE   r   )r9   Úcategoricalr   r   r   r   r      rG   zcategorical.<locals>.<lambda>rC   r   r   r   r   rK   é   s   þrK   c                   C  rD   )a×  Select all columns.

    Returns:
        A new expression.

    Examples:
        >>> import pandas as pd
        >>> import narwhals as nw
        >>> import narwhals.selectors as ncs
        >>> df_native = pd.DataFrame({"a": [1, 2], "b": ["x", "y"], "c": [False, True]})
        >>> df = nw.from_native(df_native)

        Let's select all dtypes:

        >>> df.select(ncs.all()).to_native()
           a  b      c
        0  1  x  False
        1  2  y   True
    c                 S  rE   r   )r9   Úallr   r   r   r   r       rG   zall.<locals>.<lambda>rC   r   r   r   r   rL     s   ÿrL   N©Ú*NÚ	time_unitú$TimeUnit | Iterable[TimeUnit] | NoneÚ	time_zoneú7str | timezone | Iterable[str | timezone | None] | Nonec                   s   t ‡ ‡fdd„t ¡ ƒS )a  Select all datetime columns, optionally filtering by time unit/zone.

    Arguments:
        time_unit: One (or more) of the allowed timeunit precision strings, "ms", "us",
            "ns" and "s". Omit to select columns with any valid timeunit.
        time_zone: Specify which timezone(s) to select:

            * One or more timezone strings, as defined in zoneinfo (to see valid options
                run `import zoneinfo; zoneinfo.available_timezones()` for a full list).
            * Set `None` to select Datetime columns that do not have a timezone.
            * Set `"*"` to select Datetime columns that have *any* timezone.

    Returns:
        A new expression.

    Examples:
        >>> from datetime import datetime, timezone
        >>> import pyarrow as pa
        >>> import narwhals as nw
        >>> import narwhals.selectors as ncs
        >>>
        >>> utc_tz = timezone.utc
        >>> data = {
        ...     "tstamp_utc": [
        ...         datetime(2023, 4, 10, 12, 14, 16, 999000, tzinfo=utc_tz),
        ...         datetime(2025, 8, 25, 14, 18, 22, 666000, tzinfo=utc_tz),
        ...     ],
        ...     "tstamp": [
        ...         datetime(2000, 11, 20, 18, 12, 16, 600000),
        ...         datetime(2020, 10, 30, 10, 20, 25, 123000),
        ...     ],
        ...     "numeric": [3.14, 6.28],
        ... }
        >>> df_native = pa.table(data)
        >>> df_nw = nw.from_native(df_native)
        >>> df_nw.select(ncs.datetime()).to_native()
        pyarrow.Table
        tstamp_utc: timestamp[us, tz=UTC]
        tstamp: timestamp[us]
        ----
        tstamp_utc: [[2023-04-10 12:14:16.999000Z,2025-08-25 14:18:22.666000Z]]
        tstamp: [[2000-11-20 18:12:16.600000,2020-10-30 10:20:25.123000]]

        Select only datetime columns that have any time_zone specification:

        >>> df_nw.select(ncs.datetime(time_zone="*")).to_native()
        pyarrow.Table
        tstamp_utc: timestamp[us, tz=UTC]
        ----
        tstamp_utc: [[2023-04-10 12:14:16.999000Z,2025-08-25 14:18:22.666000Z]]
    c                   s   | j jˆ ˆdS )N©rO   rQ   )r9   Údatetimer   rS   r   r   r    \  s    zdatetime.<locals>.<lambda>rC   rS   r   rS   r   rT   $  s   7þrT   )rL   rI   r:   rK   rT   rA   rF   rJ   )r6   r7   r   r   )r?   r@   r   r   )r   r   )NrM   )rO   rP   rQ   rR   r   r   )Ú
__future__r   Útypingr   r   r   r   Únarwhals._expression_parsingr   r   Únarwhals.exprr	   Únarwhals.utilsr
   rT   r   Únarwhals.dtypesr   Únarwhals.typingr   r   r:   rA   rF   rI   rJ   rK   rL   Ú__all__r   r   r   r   Ú<module>   s2    
0
!
#

#

"þ=