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 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( d d$lm)Z) d d%lm*Z* d d&l+m,Z, d d'l+m-Z- e	r5d d(l.m/Z/ d d)l.m0Z0 d d*l1m2Z2 d d+l3m4Z4 d d,l3m5Z5 d d-l3m6Z6 d d.l3m7Z7 d d/l3m8Z8 d d0l3m9Z9 d d1l3m:Z: d d2l3m;Z; d d3l3m<Z< ed4Z=e>e?e@eAeBeCefZDed5d6dd=d>ZEed5d6ddAd>ZEed5d6ddDd>ZEeddGd>ZEdHdHdIddNd>ZEeddRdSZFeddUdSZFeddWdSZFed5dXdd_dSZFed5d5d5d`ddbdSZFed5d5d5d`ddcdSZFed5d5ddddedSZFed5d5ddddfdSZFed5d5dgddjdSZFed5d5dkddldSZFed5d5d5d5dmddpdSZFed5d5d5d5dmddqdSZFed5d5d5drddsdSZFed5d5d5dtddwdSZFed5d5d5dxddydSZFeddzdSZFdHdHd{d{dHd|dddSZFd{d{d{d{dHddddZGdddZHdddZI	HddHdHd{d{dd|dddZJdddZKg dZLdHS )    )annotations)datetime)	timedelta)Decimalwraps)TYPE_CHECKING)Any)Callable)Literal)TypeVar)overload)is_native_arrow)is_native_polars)is_native_spark_like)get_cudf)get_cupy)get_dask)get_dask_expr)	get_modin)	get_numpy)
get_pandas)
get_polars)get_pyarrow)is_cudf_dataframe)is_cudf_series)is_dask_dataframe)is_duckdb_relation)is_ibis_table)is_modin_dataframe)is_modin_series)is_pandas_dataframe)is_pandas_series)is_polars_dataframe)is_polars_lazyframe)is_polars_series)is_pyarrow_chunked_array)is_pyarrow_table)Version)import_namespace	DataFrame	LazyFrameSeries)
DataFrameT)IntoDataFrameT)	IntoFrame)
IntoFrameT)IntoLazyFrameT)
IntoSeries)IntoSeriesT)
LazyFrameT)SeriesTT.pass_throughnarwhals_objectDataFrame[IntoDataFrameT]r;   Literal[False]returnr1   c                C     d S N r<   r;   rB   rB   F/var/www/vscode/kcb/lib/python3.10/site-packages/narwhals/translate.py	to_nativeF      rE   LazyFrame[IntoFrameT]r3   c                C  r@   rA   rB   rC   rB   rB   rD   rE   J   rF   Series[IntoSeriesT]r6   c                C  r@   rA   rB   rC   rB   rB   rD   rE   N   rF   r	   boolc                C  r@   rA   rB   rC   rB   rB   rD   rE   R      N)strictr;   GDataFrame[IntoDataFrameT] | LazyFrame[IntoFrameT] | Series[IntoSeriesT]rK   bool | None/IntoDataFrameT | IntoFrameT | IntoSeriesT | Anyc                C  sx   ddl m} ddlm} ddlm} |||ddd}t| |r#| jjS t| |r,| j	j
S |s:dt|  d	}t|| S )
a<  Convert Narwhals object to native one.

    Arguments:
        narwhals_object: Narwhals object.
        strict: Determine what happens if `narwhals_object` isn't a Narwhals class:

            - `True` (default): raise an error
            - `False`: pass object through as-is

            **Deprecated** (v1.13.0):
                Please use `pass_through` instead. Note that `strict` is still available
                (and won't emit a deprecation warning) if you use `narwhals.stable.v1`,
                see [perfect backwards compatibility policy](../backcompat.md/).
        pass_through: Determine what happens if `narwhals_object` isn't a Narwhals class:

            - `False` (default): raise an error
            - `True`: pass object through as-is

    Returns:
        Object of class that user started with.
    r   )	BaseFramer.   validate_strict_and_pass_thoughFTpass_through_defaultemit_deprecation_warningzExpected Narwhals object, got .)narwhals.dataframerO   narwhals.seriesr/   narwhals.utilsrQ   
isinstance_compliant_frame_native_frame_compliant_seriesnativetype	TypeError)r<   rK   r;   rO   r/   rQ   msgrB   rB   rD   rE   V   s   

native_objectr8   kwdsc                 K  r@   rA   rB   ra   rb   rB   rB   rD   from_native   rJ   rd   r0   c                 K  r@   rA   rB   rc   rB   rB   rD   rd      rJ   r7   c                 K  r@   rA   rB   rc   rB   rB   rD   rd      rJ   )series_onlyIntoDataFrameT | IntoSeriesTLiteral[True]
eager_onlyre   allow_series/DataFrame[IntoDataFrameT] | Series[IntoSeriesT]c                C  r@   rA   rB   ra   r;   rh   re   ri   rB   rB   rD   rd         )rh   re   ri   Nonec                C  r@   rA   rB   rk   rB   rB   rD   rd      rl   c                C  r@   rA   rB   rk   rB   rB   rD   rd      rl   )re   ri   c                C  r@   rA   rB   rk   rB   rB   rD   rd      rl   c                C  r@   rA   rB   rk   rB   rB   rD   rd      rl   )rh   re   )IntoFrameT | IntoLazyFrameT | IntoSeriesTGDataFrame[IntoFrameT] | LazyFrame[IntoLazyFrameT] | Series[IntoSeriesT]c                C  r@   rA   rB   rk   rB   rB   rD   rd      rl   )rh   ri   c                C  r@   rA   rB   rk   rB   rB   rD   rd      rl   r;   rh   re   ri   r4   LazyFrame[IntoLazyFrameT]c                C  r@   rA   rB   rk   rB   rB   rD   rd      rl   c                C  r@   rA   rB   rk   rB   rB   rD   rd      rl   )r;   re   ri   c                C  r@   rA   rB   rk   rB   rB   rD   rd      rl   )r;   rh   re   IntoFrame | IntoSeries-DataFrame[Any] | LazyFrame[Any] | Series[Any]c                C  r@   rA   rB   rk   rB   rB   rD   rd     rl   )r;   rh   ri   c                C  r@   rA   rB   rk   rB   rB   rD   rd     rl   c                C  r@   rA   rB   rk   rB   rB   rD   rd     rl   F)rK   r;   rh   re   ri   FIntoLazyFrameT | IntoFrameT | IntoSeriesT | IntoFrame | IntoSeries | TKLazyFrame[IntoLazyFrameT] | DataFrame[IntoFrameT] | Series[IntoSeriesT] | Tc          	   	   K  sR   ddl m} |||ddd}|rdtt|}t|t| ||d||tjdS )a  Convert `native_object` to Narwhals Dataframe, Lazyframe, or Series.

    Arguments:
        native_object: Raw object from user.
            Depending on the other arguments, input object can be:

            - a Dataframe / Lazyframe / Series supported by Narwhals (pandas, Polars, PyArrow, ...)
            - an object which implements `__narwhals_dataframe__`, `__narwhals_lazyframe__`,
              or `__narwhals_series__`
        strict: Determine what happens if the object can't be converted to Narwhals:

            - `True` or `None` (default): raise an error
            - `False`: pass object through as-is

            **Deprecated** (v1.13.0):
                Please use `pass_through` instead. Note that `strict` is still available
                (and won't emit a deprecation warning) if you use `narwhals.stable.v1`,
                see [perfect backwards compatibility policy](../backcompat.md/).
        pass_through: Determine what happens if the object can't be converted to Narwhals:

            - `False` or `None` (default): raise an error
            - `True`: pass object through as-is
        eager_only: Whether to only allow eager objects:

            - `False` (default): don't require `native_object` to be eager
            - `True`: only convert to Narwhals if `native_object` is eager
        series_only: Whether to only allow Series:

            - `False` (default): don't require `native_object` to be a Series
            - `True`: only convert to Narwhals if `native_object` is a Series
        allow_series: Whether to allow Series (default is only Dataframe / Lazyframe):

            - `False` or `None` (default): don't convert to Narwhals if `native_object` is a Series
            - `True`: allow `native_object` to be a Series

    Returns:
        DataFrame, LazyFrame, Series, or original object, depending
            on which combination of parameters was passed.
    r   rP   FTrR   z1from_native() got an unexpected keyword argument )r;   rh   eager_or_interchange_onlyre   ri   version)rX   rQ   nextiterr_   _from_native_implr(   MAIN)	ra   rK   r;   rh   re   ri   rb   rQ   r`   rB   rB   rD   rd   %  s    1)r;   rh   rv   re   ri   rv   rw   r(   c          $      C  sT  ddl m} ddl m} ddlm}	 ddlm}
 ddlm} ddlm} ddlm	} dd	lm
} dd
lm} t| ||frA|sA| S t| |	rL|sJ|rL| S |rZ|du rXd}t|d}|rd|rdd}t||| r||rt|srd}t|| S ||  ddS || r|r|sd}t|| S |s|r|sd}t|| S ||  ddS || r|s|sd}t|| S |	|  ddS t| r)ddlm} |rt| s|sdt| j }t|| S |s|rt| r|sd}t|| S |st| r|sd}t|| S |t }|||d}|| }||r||ddS ||r#||ddS |	|ddS t| rUddlm} |rB|s@d}t|| S t }||| |||
j|ddddS t | rddl!m"} |sn|sld}t|| S t }|	|| |
j|||dddS t#| rddlm} t$ }|r|sd}t|| S ||| |
j%|||ddddS t&| rddl!m"} t$ }|s|sd}t|| S |	|| |
j%|||dddS t'| rddlm} t( }|r|sd }t|| S ||| |
j)|||ddddS t*| r.ddl!m"} t( }|s|sd}t|| S |	|| |
j)|||dddS t+| r{|rLt,| rL|sJdt| j }t|| S |s_t,| s_|s]d}t|| S t-|.| j/| }||ru||ddS |	|ddS t0| rdd!l1m2} |r|sd"}t|| S |s|r|sd#}t|| S |t3 }|d$krt4 d u rd%}t5||||d}||| ddS t6| r|s|r|sd&}t|| S t-|.| j/| }|t7j8u r||d'dS ||ddS t9| r=dd(l:m;} |s|r|sd)}t|| S dd l<} || }!|t7j8u r2||| |!|dd'dS ||| |!|dddS t=| rtt-|.| }"|rXd|"j>j? d*}t||s^|rjd+|"j>j? d*}t|||"j/| ddS || rdd,l@mA}# |s|r|sd-}t|| S ||#| |d.d'dS |sd/t|  }t|| S )0Nr   r*   r,   r.   )Implementation)_supports_dataframe_interchange)is_compliant_dataframe)is_compliant_lazyframe)is_compliant_series)parse_versionFzJInvalid parameter combination: `series_only=True` and `allow_series=False`TzUInvalid parameter combination: `eager_only=True` and `eager_or_interchange_only=True`z,Cannot only use `series_only` with dataframefull)levelz,Cannot only use `series_only` with lazyframezJCannot only use `eager_only` or `eager_or_interchange_only` with lazyframez4Please set `allow_series=True` or `series_only=True`)PolarsNamespacez#Cannot only use `series_only` with zQCannot only use `eager_only` or `eager_or_interchange_only` with polars.LazyFrame)backend_versionrw   lazy)PandasLikeDataFrame)r   implementationrw   validate_column_names)PandasLikeSeries)r   r   rw   z2Cannot only use `series_only` with modin.DataFrame)r   r   rw   r   z1Cannot only use `series_only` with cudf.DataFrame)DaskNamespacez1Cannot only use `series_only` with dask DataFramezOCannot only use `eager_only` or `eager_or_interchange_only` with dask DataFrame)i        zPlease install dask-exprzNCannot only use `series_only=True` or `eager_only=False` with DuckDBPyRelationinterchange)IbisLazyFramezHCannot only use `series_only=True` or `eager_only=False` with Ibis tablez
 DataFramezACannot only use `eager_only` or `eager_or_interchange_only` with )InterchangeFramezhCannot only use `series_only=True` or `eager_only=False` with object which only implements __dataframe__)rw   zLExpected pandas-like dataframe, Polars dataframe, or Polars lazyframe, got: )BrV   r+   r-   rW   r/   rX   r|   r}   r~   r   r   r   rY   
ValueErrorr_   __narwhals_dataframe____narwhals_lazyframe____narwhals_series__r   narwhals._polars.namespacer   r%   r^   __qualname__r$   r   rd   r!   narwhals._pandas_like.dataframer   r   PANDASr"   narwhals._pandas_like.seriesr   r   r   MODINr    r   r   CUDFr   r   r'   r)   from_native_object	compliantr   narwhals._dask.namespacer   r   r   ImportErrorr   r(   V1r   narwhals._ibis.dataframer   ibisr   r   _aliasnarwhals._interchange.dataframer   )$ra   r;   rh   rv   re   ri   rw   r+   r-   r/   r|   r}   r~   r   r   r   r`   r   
pl_versionpl_nspl_compliantr   pdr   mpdcudfpa_compliantr   dask_versiondd_nsduckdb_compliantr   r   r   ns_sparkr   rB   rB   rD   rz   j  s:  























rz   objFDataFrame[Any] | LazyFrame[Any] | Series[Any] | IntoFrame | IntoSeriesc                  G  sF   | sd}t |dd | D }t|dkrd| d}t || S )a  Get native namespace from object.

    Arguments:
        obj: Dataframe, Lazyframe, or Series. Multiple objects can be
            passed positionally, in which case they must all have the
            same native namespace (else an error is raised).

    Returns:
        Native module.

    Examples:
        >>> import polars as pl
        >>> import pandas as pd
        >>> import narwhals as nw
        >>> df = nw.from_native(pd.DataFrame({"a": [1, 2, 3]}))
        >>> nw.get_native_namespace(df)
        <module 'pandas'...>
        >>> df = nw.from_native(pl.DataFrame({"a": [1, 2, 3]}))
        >>> nw.get_native_namespace(df)
        <module 'polars'...>
    z=At least one object must be passed to `get_native_namespace`.c                 S  s   h | ]}t |qS rB   ) _get_native_namespace_single_obj).0xrB   rB   rD   	<setcomp>  s    z'get_native_namespace.<locals>.<setcomp>r   z0Found objects with different native namespaces: rU   )r   lenpop)r   r`   resultrB   rB   rD   get_native_namespace  s   r   c                 C  s   ddl m} || r|  S t| st| rt S t| s!t| r$t S t	| s,t
| r/t S t| s7t| r:t S t| rAt S t| sMt| sMt| rPt S dt|  }t|)Nr   )has_native_namespacez4Could not get native namespace from object of type: )rX   r   __native_namespace__r!   r"   r   r   r    r   r'   r&   r   r   r   r   r   r   r#   r$   r%   r   r^   r_   )r   r   r`   rB   rB   rD   r     s"   r   TfuncCallable[..., Any] | NoneCallable[..., Any]c                  sD   ddl m} ||dddd fdd	}| d
u r|S || S )a	  Decorate function so it becomes dataframe-agnostic.

    This will try to convert any dataframe/series-like object into the Narwhals
    respective DataFrame/Series, while leaving the other parameters as they are.
    Similarly, if the output of the function is a Narwhals DataFrame or Series, it will be
    converted back to the original dataframe/series type, while if the output is another
    type it will be left as is.
    By setting `pass_through=False`, then every input and every output will be required to be a
    dataframe/series-like object.

    Arguments:
        func: Function to wrap in a `from_native`-`to_native` block.
        strict: **Deprecated** (v1.13.0):
            Please use `pass_through` instead. Note that `strict` is still available
            (and won't emit a deprecation warning) if you use `narwhals.stable.v1`,
            see [perfect backwards compatibility policy](../backcompat.md/).

            Determine what happens if the object can't be converted to Narwhals:

            - `True` or `None` (default): raise an error
            - `False`: pass object through as-is
        pass_through: Determine what happens if the object can't be converted to Narwhals:

            - `False` or `None` (default): raise an error
            - `True`: pass object through as-is
        eager_only: Whether to only allow eager objects:

            - `False` (default): don't require `native_object` to be eager
            - `True`: only convert to Narwhals if `native_object` is eager
        series_only: Whether to only allow Series:

            - `False` (default): don't require `native_object` to be a Series
            - `True`: only convert to Narwhals if `native_object` is a Series
        allow_series: Whether to allow Series (default is only Dataframe / Lazyframe):

            - `False` or `None`: don't convert to Narwhals if `native_object` is a Series
            - `True` (default): allow `native_object` to be a Series

    Returns:
        Decorated function.

    Examples:
        Instead of writing

        >>> import narwhals as nw
        >>> def agnostic_group_by_sum(df):
        ...     df = nw.from_native(df, pass_through=True)
        ...     df = df.group_by("a").agg(nw.col("b").sum())
        ...     return nw.to_native(df)

        you can just write

        >>> @nw.narwhalify
        ... def agnostic_group_by_sum(df):
        ...     return df.group_by("a").agg(nw.col("b").sum())
    r   rP   TrR   r   r   r?   c                   s"   t  d fdd}|S )Nargsr	   kwargsr?   c                    s   fdd| D } fdd|  D } fddg | | R D }t|dkr6d}t|| i |}t|d	S )
Nc              	     s   g | ]}t | d qS rp   rd   )r   argri   rh   r;   re   rB   rD   
<listcomp>B  s    zBnarwhalify.<locals>.decorator.<locals>.wrapper.<locals>.<listcomp>c              
     s$   i | ]\}}|t | d qS r   r   )r   namevaluer   rB   rD   
<dictcomp>M  s    zBnarwhalify.<locals>.decorator.<locals>.wrapper.<locals>.<dictcomp>c                   s"   h | ]}t |d d  r  qS )r   N)getattr)r   vbrB   rD   r   X  s    zAnarwhalify.<locals>.decorator.<locals>.wrapper.<locals>.<setcomp>r   z_Found multiple backends. Make sure that all dataframe/series inputs come from the same backend.r:   )itemsvaluesr   r   rE   )r   r   backendsr`   r   )ri   rh   r   r;   re   r   rD   wrapper@  s   
z.narwhalify.<locals>.decorator.<locals>.wrapper)r   r	   r   r	   r?   r	   r   )r   r   r   )r   rD   	decorator?  s   %znarwhalify.<locals>.decoratorN)r   r   r?   r   )rX   rQ   )r   rK   r;   rh   re   ri   rQ   r   rB   r   rD   
narwhalify  s   A)r   scalar_likec                 C  sZ  | du rdS t | tr| S t }|r,t | |jr,| jdkr,tdddt|  d d S |r<|| r<t	| dr<|  S t
 }|rKt | |jrK|  S |rWt | |jrW|  S |ru|jj| ruz|| }W n	 typ   Y nw |rudS t | ttfr~| S t }|rt | |jr|  S t }|rt | |jr| jdkr|  S dt|  d	}t|)
au  If a scalar is not Python native, converts it to Python native.

    Arguments:
        scalar_like: Scalar-like value.

    Returns:
        Python scalar.

    Raises:
        ValueError: If the object is not convertible to a scalar.

    Examples:
        >>> import narwhals as nw
        >>> import pandas as pd
        >>> df = nw.from_native(pd.DataFrame({"a": [1, 2, 3]}))
        >>> nw.to_py_scalar(df["a"].item(0))
        1
        >>> import pyarrow as pa
        >>> df = nw.from_native(pa.table({"a": [1, 2, 3]}))
        >>> nw.to_py_scalar(df["a"].item(0))
        1
        >>> nw.to_py_scalar(1)
        1
    Nzdatetime64[ns]i  r   i  )microsecondsitemz/Expected object convertible to a scalar, found zH. Please report a bug to https://github.com/narwhals-dev/narwhals/issues)rY   NON_TEMPORAL_SCALAR_TYPESr   
datetime64dtyper   r   r   isscalarhasattrr   	Timestampto_pydatetime	Timedeltato_pytimedeltaapitypes	is_scalarisna	Exceptionr   Scalaras_pyr   ndarraysizer^   r   )r   npr   is_napacupyr`   rB   rB   rD   to_py_scalaro  sR   




r   )r   r   rE   r   )r<   r=   r;   r>   r?   r1   )r<   rG   r;   r>   r?   r3   )r<   rH   r;   r>   r?   r6   )r<   r	   r;   rI   r?   r	   )r<   rL   rK   rM   r;   rM   r?   rN   )ra   r8   rb   r	   r?   r8   )ra   r0   rb   r	   r?   r0   )ra   r7   rb   r	   r?   r7   )ra   rf   r;   rg   rh   rg   re   r>   ri   rg   r?   rj   )ra   r1   r;   rg   rh   r>   re   r>   ri   rm   r?   r=   )ra   r9   r;   rg   rh   r>   re   r>   ri   rm   r?   r9   )ra   r1   r;   rg   rh   rg   re   r>   ri   rm   r?   r=   )ra   r9   r;   rg   rh   rg   re   r>   ri   rm   r?   r9   )ra   rn   r;   rg   rh   r>   re   r>   ri   rg   r?   ro   )ra   r6   r;   rg   rh   r>   re   rg   ri   rm   r?   rH   )ra   r4   r;   r>   rh   r>   re   r>   ri   rm   r?   rq   )ra   r1   r;   r>   rh   r>   re   r>   ri   rm   r?   r=   )ra   r1   r;   r>   rh   rg   re   r>   ri   rm   r?   r=   )ra   rr   r;   r>   rh   r>   re   r>   ri   rg   r?   rs   )ra   r6   r;   r>   rh   r>   re   rg   ri   rm   r?   rH   )ra   r	   r;   rI   rh   rI   re   rI   ri   rM   r?   r	   )ra   rt   rK   rM   r;   rM   rh   rI   re   rI   ri   rM   rb   r	   r?   ru   )ra   r	   r;   rI   rh   rI   rv   rI   re   rI   ri   rM   rw   r(   r?   r	   )r   r   r?   r	   rA   )r   r   rK   rM   r;   rM   rh   rI   re   rI   ri   rM   r?   r   )r   r	   r?   r	   )M
__future__r   r   r   decimalr   	functoolsr   typingr   r	   r
   r   r   r   narwhals._namespacer   r   r   narwhals.dependenciesr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   rX   r(   r)   rV   r+   r-   rW   r/   narwhals.typingr0   r1   r2   r3   r4   r5   r6   r7   r8   r9   rI   bytesstrintfloatcomplexr   rE   rd   rz   r   r   r   r   __all__rB   rB   rB   rD   <module>   sJ   0









H  
W
"
wM