o
    ¹­§iw3  ã                   @  sô   U d dl mZ d dlmZmZmZ d dlmZ d dlm	Z
 d dlmZ er7d dlmZ d dlmZmZmZmZ g d¢Zejd	d
„ e
je
je
je
jfD ƒŽ Zded< edƒZG dd„ dee ƒZd dd„Zd!dd„Zd!dd„Zd!dd„Zd!dd„ZdS )"é    )Úannotations)ÚTYPE_CHECKINGÚGenericÚTypeVar)ÚwarnN)Úfind_stacklevel)ÚCallable)Ú	DataFrameÚExprÚ	LazyFrameÚSeries)Úregister_dataframe_namespaceÚregister_expr_namespaceÚregister_lazyframe_namespaceÚregister_series_namespacec                 c  s    | ]}|j V  qd S ©N)Ú
_accessors)Ú.0Úcls© r   úA/home/app/Keep/.python/lib/python3.10/site-packages/polars/api.pyÚ	<genexpr>   s   € r   zset[str]Ú_reserved_namespacesÚNSc                   @  s$   e Zd ZdZddd	„Zddd„ZdS )Ú	NameSpacezHEstablish property-like namespace object for user-defined functionality.ÚnameÚstrÚ	namespaceútype[NS]ÚreturnÚNonec                 C  s   || _ || _d S r   )Ú	_accessorÚ_ns)Úselfr   r   r   r   r   Ú__init__"   s   
zNameSpace.__init__Úinstanceú	NS | Noner   úNS | type[NS]c                 C  s*   |d u r| j S |   |¡}t|| j|ƒ |S r   )r"   Úsetattrr!   )r#   r%   r   Zns_instancer   r   r   Ú__get__&   s
   
zNameSpace.__get__N)r   r   r   r   r   r    )r%   r&   r   r   r   r'   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r$   r)   r   r   r   r   r      s    
r   r   r   r   ú+type[Expr | DataFrame | LazyFrame | Series]r   úCallable[[type[NS]], type[NS]]c                   s   d‡ ‡fdd„}|S )z>Register custom namespace against the underlying Polars class.Úns_classr   r   c                   sf   ˆt v rdˆ›}t|ƒ‚tˆ ˆƒr"tdˆ›dˆ j›dttƒ d tˆ ˆtˆ| ƒƒ ˆ j	 
ˆ¡ | S )Nz#cannot override reserved namespace z%Overriding existing custom namespace z (on ú))Ú
stacklevel)r   ÚAttributeErrorÚhasattrr   r*   ÚUserWarningr   r(   r   r   Úadd)r0   Úmsg©r   r   r   r   r   4   s   

ýz$_create_namespace.<locals>.namespaceN)r0   r   r   r   r   )r   r   r   r   r8   r   Ú_create_namespace/   s   r9   c                 C  ó   t | tjƒS )uï  
    Decorator for registering custom functionality with a Polars Expr.

    Parameters
    ----------
    name
        Name under which the functionality will be accessed.

    See Also
    --------
    register_dataframe_namespace : Register functionality on a DataFrame.
    register_lazyframe_namespace : Register functionality on a LazyFrame.
    register_series_namespace : Register functionality on a Series.

    Examples
    --------
    >>> @pl.api.register_expr_namespace("pow_n")
    ... class PowersOfN:
    ...     def __init__(self, expr: pl.Expr) -> None:
    ...         self._expr = expr
    ...
    ...     def next(self, p: int) -> pl.Expr:
    ...         return (p ** (self._expr.log(p).ceil()).cast(pl.Int64)).cast(pl.Int64)
    ...
    ...     def previous(self, p: int) -> pl.Expr:
    ...         return (p ** (self._expr.log(p).floor()).cast(pl.Int64)).cast(pl.Int64)
    ...
    ...     def nearest(self, p: int) -> pl.Expr:
    ...         return (p ** (self._expr.log(p)).round(0).cast(pl.Int64)).cast(pl.Int64)
    >>>
    >>> df = pl.DataFrame([1.4, 24.3, 55.0, 64.001], schema=["n"])
    >>> df.select(
    ...     pl.col("n"),
    ...     pl.col("n").pow_n.next(p=2).alias("next_pow2"),
    ...     pl.col("n").pow_n.previous(p=2).alias("prev_pow2"),
    ...     pl.col("n").pow_n.nearest(p=2).alias("nearest_pow2"),
    ... )
    shape: (4, 4)
    â”Œâ”€â”€â”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”
    â”‚ n      â”† next_pow2 â”† prev_pow2 â”† nearest_pow2 â”‚
    â”‚ ---    â”† ---       â”† ---       â”† ---          â”‚
    â”‚ f64    â”† i64       â”† i64       â”† i64          â”‚
    â•žâ•â•â•â•â•â•â•â•â•ªâ•â•â•â•â•â•â•â•â•â•â•â•ªâ•â•â•â•â•â•â•â•â•â•â•â•ªâ•â•â•â•â•â•â•â•â•â•â•â•â•â•â•¡
    â”‚ 1.4    â”† 2         â”† 1         â”† 1            â”‚
    â”‚ 24.3   â”† 32        â”† 16        â”† 32           â”‚
    â”‚ 55.0   â”† 64        â”† 32        â”† 64           â”‚
    â”‚ 64.001 â”† 128       â”† 64        â”† 64           â”‚
    â””â”€â”€â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”€â”˜
    )r9   Úplr
   ©r   r   r   r   r   F   ó   2r   c                 C  r:   )uO  
    Decorator for registering custom functionality with a Polars DataFrame.

    Parameters
    ----------
    name
        Name under which the functionality will be accessed.

    See Also
    --------
    register_expr_namespace : Register functionality on an Expr.
    register_lazyframe_namespace : Register functionality on a LazyFrame.
    register_series_namespace : Register functionality on a Series.

    Examples
    --------
    >>> @pl.api.register_dataframe_namespace("split")
    ... class SplitFrame:
    ...     def __init__(self, df: pl.DataFrame) -> None:
    ...         self._df = df
    ...
    ...     def by_first_letter_of_column_names(self) -> list[pl.DataFrame]:
    ...         return [
    ...             self._df.select([col for col in self._df.columns if col[0] == f])
    ...             for f in dict.fromkeys(col[0] for col in self._df.columns)
    ...         ]
    ...
    ...     def by_first_letter_of_column_values(self, col: str) -> list[pl.DataFrame]:
    ...         return [
    ...             self._df.filter(pl.col(col).str.starts_with(c))
    ...             for c in sorted(
    ...                 set(df.select(pl.col(col).str.slice(0, 1)).to_series())
    ...             )
    ...         ]
    >>>
    >>> df = pl.DataFrame(
    ...     data=[["xx", 2, 3, 4], ["xy", 4, 5, 6], ["yy", 5, 6, 7], ["yz", 6, 7, 8]],
    ...     schema=["a1", "a2", "b1", "b2"],
    ...     orient="row",
    ... )
    >>> df
    shape: (4, 4)
    â”Œâ”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”
    â”‚ a1  â”† a2  â”† b1  â”† b2  â”‚
    â”‚ --- â”† --- â”† --- â”† --- â”‚
    â”‚ str â”† i64 â”† i64 â”† i64 â”‚
    â•žâ•â•â•â•â•â•ªâ•â•â•â•â•â•ªâ•â•â•â•â•â•ªâ•â•â•â•â•â•¡
    â”‚ xx  â”† 2   â”† 3   â”† 4   â”‚
    â”‚ xy  â”† 4   â”† 5   â”† 6   â”‚
    â”‚ yy  â”† 5   â”† 6   â”† 7   â”‚
    â”‚ yz  â”† 6   â”† 7   â”† 8   â”‚
    â””â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”˜
    >>> df.split.by_first_letter_of_column_names()
    [shape: (4, 2)
    â”Œâ”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”
    â”‚ a1  â”† a2  â”‚
    â”‚ --- â”† --- â”‚
    â”‚ str â”† i64 â”‚
    â•žâ•â•â•â•â•â•ªâ•â•â•â•â•â•¡
    â”‚ xx  â”† 2   â”‚
    â”‚ xy  â”† 4   â”‚
    â”‚ yy  â”† 5   â”‚
    â”‚ yz  â”† 6   â”‚
    â””â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”˜,
    shape: (4, 2)
    â”Œâ”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”
    â”‚ b1  â”† b2  â”‚
    â”‚ --- â”† --- â”‚
    â”‚ i64 â”† i64 â”‚
    â•žâ•â•â•â•â•â•ªâ•â•â•â•â•â•¡
    â”‚ 3   â”† 4   â”‚
    â”‚ 5   â”† 6   â”‚
    â”‚ 6   â”† 7   â”‚
    â”‚ 7   â”† 8   â”‚
    â””â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”˜]
    >>> df.split.by_first_letter_of_column_values("a1")
    [shape: (2, 4)
    â”Œâ”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”
    â”‚ a1  â”† a2  â”† b1  â”† b2  â”‚
    â”‚ --- â”† --- â”† --- â”† --- â”‚
    â”‚ str â”† i64 â”† i64 â”† i64 â”‚
    â•žâ•â•â•â•â•â•ªâ•â•â•â•â•â•ªâ•â•â•â•â•â•ªâ•â•â•â•â•â•¡
    â”‚ xx  â”† 2   â”† 3   â”† 4   â”‚
    â”‚ xy  â”† 4   â”† 5   â”† 6   â”‚
    â””â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”˜, shape: (2, 4)
    â”Œâ”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”
    â”‚ a1  â”† a2  â”† b1  â”† b2  â”‚
    â”‚ --- â”† --- â”† --- â”† --- â”‚
    â”‚ str â”† i64 â”† i64 â”† i64 â”‚
    â•žâ•â•â•â•â•â•ªâ•â•â•â•â•â•ªâ•â•â•â•â•â•ªâ•â•â•â•â•â•¡
    â”‚ yy  â”† 5   â”† 6   â”† 7   â”‚
    â”‚ yz  â”† 6   â”† 7   â”† 8   â”‚
    â””â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”˜]
    )r9   r;   r	   r<   r   r   r   r   {   s   _r   c                 C  r:   )uµ  
    Decorator for registering custom functionality with a Polars LazyFrame.

    Parameters
    ----------
    name
        Name under which the functionality will be accessed.

    See Also
    --------
    register_expr_namespace : Register functionality on an Expr.
    register_dataframe_namespace : Register functionality on a DataFrame.
    register_series_namespace : Register functionality on a Series.

    Examples
    --------
    >>> @pl.api.register_lazyframe_namespace("types")
    ... class DTypeOperations:
    ...     def __init__(self, lf: pl.LazyFrame) -> None:
    ...         self._lf = lf
    ...
    ...     def split_by_column_dtypes(self) -> list[pl.LazyFrame]:
    ...         return [
    ...             self._lf.select(pl.col(tp))
    ...             for tp in dict.fromkeys(self._lf.collect_schema().dtypes())
    ...         ]
    ...
    ...     def upcast_integer_types(self) -> pl.LazyFrame:
    ...         return self._lf.with_columns(
    ...             pl.col(tp).cast(pl.Int64) for tp in (pl.Int8, pl.Int16, pl.Int32)
    ...         )
    >>>
    >>> lf = pl.LazyFrame(
    ...     data={"a": [1, 2], "b": [3, 4], "c": [5.6, 6.7]},
    ...     schema=[("a", pl.Int16), ("b", pl.Int32), ("c", pl.Float32)],
    ... )
    >>> lf.collect()
    shape: (2, 3)
    â”Œâ”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”
    â”‚ a   â”† b   â”† c   â”‚
    â”‚ --- â”† --- â”† --- â”‚
    â”‚ i16 â”† i32 â”† f32 â”‚
    â•žâ•â•â•â•â•â•ªâ•â•â•â•â•â•ªâ•â•â•â•â•â•¡
    â”‚ 1   â”† 3   â”† 5.6 â”‚
    â”‚ 2   â”† 4   â”† 6.7 â”‚
    â””â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”˜
    >>> lf.types.upcast_integer_types().collect()
    shape: (2, 3)
    â”Œâ”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”
    â”‚ a   â”† b   â”† c   â”‚
    â”‚ --- â”† --- â”† --- â”‚
    â”‚ i64 â”† i64 â”† f32 â”‚
    â•žâ•â•â•â•â•â•ªâ•â•â•â•â•â•ªâ•â•â•â•â•â•¡
    â”‚ 1   â”† 3   â”† 5.6 â”‚
    â”‚ 2   â”† 4   â”† 6.7 â”‚
    â””â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”˜

    >>> lf = pl.LazyFrame(
    ...     data=[["xx", 2, 3, 4], ["xy", 4, 5, 6], ["yy", 5, 6, 7], ["yz", 6, 7, 8]],
    ...     schema=["a1", "a2", "b1", "b2"],
    ...     orient="row",
    ... )
    >>> lf.collect()
    shape: (4, 4)
    â”Œâ”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”
    â”‚ a1  â”† a2  â”† b1  â”† b2  â”‚
    â”‚ --- â”† --- â”† --- â”† --- â”‚
    â”‚ str â”† i64 â”† i64 â”† i64 â”‚
    â•žâ•â•â•â•â•â•ªâ•â•â•â•â•â•ªâ•â•â•â•â•â•ªâ•â•â•â•â•â•¡
    â”‚ xx  â”† 2   â”† 3   â”† 4   â”‚
    â”‚ xy  â”† 4   â”† 5   â”† 6   â”‚
    â”‚ yy  â”† 5   â”† 6   â”† 7   â”‚
    â”‚ yz  â”† 6   â”† 7   â”† 8   â”‚
    â””â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”˜
    >>> pl.collect_all(lf.types.split_by_column_dtypes())
    [shape: (4, 1)
    â”Œâ”€â”€â”€â”€â”€â”
    â”‚ a1  â”‚
    â”‚ --- â”‚
    â”‚ str â”‚
    â•žâ•â•â•â•â•â•¡
    â”‚ xx  â”‚
    â”‚ xy  â”‚
    â”‚ yy  â”‚
    â”‚ yz  â”‚
    â””â”€â”€â”€â”€â”€â”˜, shape: (4, 3)
    â”Œâ”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”¬â”€â”€â”€â”€â”€â”
    â”‚ a2  â”† b1  â”† b2  â”‚
    â”‚ --- â”† --- â”† --- â”‚
    â”‚ i64 â”† i64 â”† i64 â”‚
    â•žâ•â•â•â•â•â•ªâ•â•â•â•â•â•ªâ•â•â•â•â•â•¡
    â”‚ 2   â”† 3   â”† 4   â”‚
    â”‚ 4   â”† 5   â”† 6   â”‚
    â”‚ 5   â”† 6   â”† 7   â”‚
    â”‚ 6   â”† 7   â”† 8   â”‚
    â””â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”´â”€â”€â”€â”€â”€â”˜]
    )r9   r;   r   r<   r   r   r   r   Ý   s   br   c                 C  r:   )a§  
    Decorator for registering custom functionality with a polars Series.

    Parameters
    ----------
    name
        Name under which the functionality will be accessed.

    See Also
    --------
    register_expr_namespace : Register functionality on an Expr.
    register_dataframe_namespace : Register functionality on a DataFrame.
    register_lazyframe_namespace : Register functionality on a LazyFrame.

    Examples
    --------
    >>> @pl.api.register_series_namespace("math")
    ... class MathShortcuts:
    ...     def __init__(self, s: pl.Series) -> None:
    ...         self._s = s
    ...
    ...     def square(self) -> pl.Series:
    ...         return self._s * self._s
    ...
    ...     def cube(self) -> pl.Series:
    ...         return self._s * self._s * self._s
    >>>
    >>> s = pl.Series("n", [1.5, 31.0, 42.0, 64.5])
    >>> s.math.square().alias("s^2")
    shape: (4,)
    Series: 's^2' [f64]
    [
        2.25
        961.0
        1764.0
        4160.25
    ]
    >>> s = pl.Series("n", [1, 2, 3, 4, 5])
    >>> s.math.cube().alias("s^3")
    shape: (5,)
    Series: 's^3' [i64]
    [
        1
        8
        27
        64
        125
    ]
    )r9   r;   r   r<   r   r   r   r   B  r=   r   )r   r   r   r.   r   r/   )r   r   r   r/   ) Ú
__future__r   Útypingr   r   r   Úwarningsr   Zpolars._reexportZ	_reexportr;   Zpolars._utils.variousr   Úcollections.abcr   Zpolarsr	   r
   r   r   Ú__all__ÚsetÚunionr   Ú__annotations__r   r   r9   r   r   r   r   r   r   r   r   Ú<module>   s&    ÿ


5
be