o
    $&]im^                     @  s  d dl mZ d dlZd dlmZ d dlmZ d dlm	Z	m
Z
mZmZmZmZ d dlmZ d dlmZmZ d dlmZmZmZmZ d d	lmZmZmZmZmZmZ d d
l m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- e	rd dl.m/Z/ d dl0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6 d dl7m8Z8m9Z9 d dl:m;Z; d dl<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZE edZFeGeHeIeJeKeLefZMejNejOejPfZQedddfddZRedddgddZRedddhd dZRedid#dZRd$ddjd'dZRedkd,d-ZSedld/d-ZSedmd2d-ZSednd5d-ZSedod6d-ZSedpd7d-ZSedqd8d-ZSedrd9d-ZSedsd<d-ZSedtd?d-ZSedudAd-ZSedvdFd-ZSd$d$d$ddGdwdJd-ZSd$d$dKdxdPdQZTd$d$dKdydRdSZUdzdVdWZVdzdXdYZW	d{dZd$d$dZdGd|d^d_ZXd}dadbZYd~dcddZZg deZ[dS )    )annotationsN)Decimalwraps)TYPE_CHECKINGAnyCallableLiteralTypeVaroverload)plugins)EPOCHMS_PER_SECOND)is_native_arrowis_native_pandas_likeis_native_polarsis_native_spark_like)ImplementationVersionhas_native_namespaceis_compliant_dataframeis_compliant_lazyframeis_compliant_series)get_dask_expr	get_numpy
get_pandasis_cupy_scalaris_dask_dataframeis_duckdb_relationis_ibis_tableis_numpy_scalaris_pandas_like_dataframeis_polars_lazyframeis_polars_seriesis_pyarrow_scalaris_pyarrow_table)Unpack)AllowAny	AllowLazyAllowSeriesExcludeSeries
OnlySeriesPassThroughUnknown	DataFrame	LazyFrameSeries)	
DataFrameTFrameIntoDataFrameT	IntoFrameIntoLazyFrameT
IntoSeriesIntoSeriesT
LazyFrameTSeriesTT.pass_throughnarwhals_objectDataFrame[IntoDataFrameT]r=   Literal[False]returnr4   c                C     d S N r>   r=   rD   rD   P/var/www/html/IGF-ODF-V3/venv/lib/python3.10/site-packages/narwhals/translate.py	to_nativeG      rG   LazyFrame[IntoLazyFrameT]r6   c                C  rB   rC   rD   rE   rD   rD   rF   rG   K   rH   Series[IntoSeriesT]r8   c                C  rB   rC   rD   rE   rD   rD   rF   rG   O   rH   r   boolc                C  rB   rC   rD   rE   rD   rD   rF   rG   S      FKDataFrame[IntoDataFrameT] | LazyFrame[IntoLazyFrameT] | Series[IntoSeriesT]3IntoDataFrameT | IntoLazyFrameT | IntoSeriesT | Anyc                C  s\   ddl m} ddlm} 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.
        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   )	BaseFramer0   zExpected Narwhals object, got .)narwhals.dataframerO   narwhals.seriesr1   
isinstance_compliant_frame_native_frame_compliant_seriesnativetype	TypeError)r>   r=   rO   r1   msgrD   rD   rF   rG   W   s   

native_objectr:   kwdsUnpack[OnlySeries]c                 K  rB   rC   rD   r[   r\   rD   rD   rF   from_nativex   rL   r_   Unpack[AllowSeries]c                 K  rB   rC   rD   r^   rD   rD   rF   r_   z   rL   r2   Unpack[ExcludeSeries]c                 K  rB   rC   rD   r^   rD   rD   rF   r_   |   rH   r9   Unpack[AllowLazy]c                 K  rB   rC   rD   r^   rD   rD   rF   r_      rL   c                 K  rB   rC   rD   r^   rD   rD   rF   r_      rH   c                 K  rB   rC   rD   r^   rD   rD   rF   r_      rH   c                 K  rB   rC   rD   r^   rD   rD   rF   r_      rH   c                 K  rB   rC   rD   r^   rD   rD   rF   r_      rH   IntoDataFrameT | IntoSeriesT/DataFrame[IntoDataFrameT] | Series[IntoSeriesT]c                 K  rB   rC   rD   r^   rD   rD   rF   r_      rH   -IntoDataFrameT | IntoLazyFrameT | IntoSeriesTUnpack[AllowAny]c                 K  rB   rC   rD   r^   rD   rD   rF   r_      rH   Unpack[PassThroughUnknown]c                 K  rB   rC   rD   r^   rD   rD   rF   r_      rL   
eager_onlyseries_onlyallow_seriesbool | Nonec                C  rB   rC   rD   r[   r=   rh   ri   rj   rD   rD   rF   r_      s   r=   rh   ri   rj   JIntoLazyFrameT | IntoDataFrameT | IntoSeriesT | IntoFrame | IntoSeries | TOLazyFrame[IntoLazyFrameT] | DataFrame[IntoDataFrameT] | Series[IntoSeriesT] | Tc             	   C  s   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__`
        pass_through: Determine what happens if the object can't be converted to Narwhals

            - `False` (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.
    Fr=   rh   eager_or_interchange_onlyri   rj   version)_from_native_implr   MAINrl   rD   rD   rF   r_      s   +)r=   rh   compliant_objectrq   rr   r   c                C  s   t | r|r|sd}t|| S |j|  |ddS t| rF|r,|s*d}t|| S |s0|r:|s8d}t|| S |j|  |ddS t| rb|sV|sTd}t|| S |j	| 
 |ddS d S )Nz,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 lazyframe4Please set `allow_series=True` or `series_only=True`)r   rY   	dataframe__narwhals_dataframe___with_versionr   	lazyframe__narwhals_lazyframe__r   series__narwhals_series__)ru   r=   rh   rq   ri   rj   rr   rZ   rD   rD   rF   _translate_if_compliant   sB   r   c             	   C  sH  ddl m} ddlm}m}	 ddlm}
 t| ||	fr|s| S t| |
r*|s(|r*| S |r8|du r6d}t|d}|rB|rBd}t|t	| ||||||d	 }d urS|S t
| r|rmt| sm|skd
t| j }t|| S |sq|rt| r|s}d}t|| S |st| r|sd}t|| S |j| j|  S t| rt| r|r|sd
t| j }t|| S n|s|sd}t|| S |j| j|  S t| rt| r|r|sd
t| j }t|| S n|s|sd}t|| S |j| j|  S t| rG|r|sd}t|| S |s|r&|s$d}t|| S tj dkr:t d u r:d}t||jtjj|  S t | ri|sR|r]|s[d}t|| S |j| j|  S t!| r|st|r|s}d}t|| S |j| j|  S t"| r|j| }|s|s|r|sd|j# d}t|| S |j|  S || rddl m$} |s|r|sd}t|| S |t%j&ur|r| S d}t|t%j&j'|| ddS t(| |}|d urt	|||||||d	S |s"dt|  }t()t|  }r|d| 7 }t|| S )Nr   )supports_dataframe_interchanger-   r0   FzJInvalid parameter combination: `series_only=True` and `allow_series=False`TzUInvalid parameter combination: `eager_only=True` and `eager_or_interchange_only=True`rp   z#Cannot only use `series_only` with zQCannot only use `eager_only` or `eager_or_interchange_only` with polars.LazyFramery   z1Cannot 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 DuckDBPyRelationzHCannot only use `series_only=True` or `eager_only=False` with ibis.TablezPCannot only use `series_only`, `eager_only` or `eager_or_interchange_only` with z
 DataFrame)InterchangeFramezhCannot only use `series_only=True` or `eager_only=False` with object which only implements __dataframe__a+  The Dataframe Interchange Protocol is no longer supported in the main `narwhals` namespace.

You may want to:
 - Use `narwhals.stable.v1`, where it is still supported.
    - See https://narwhals-dev.github.io/narwhals/backcompat
 - Use `pass_through=True` to pass the object through without raising.interchangerw   z!Unsupported dataframe type, got: z

)*narwhals._interchange.dataframer   rQ   r.   r/   rR   r1   rS   
ValueErrorr   r   r#   rX   __qualname__rY   r"   	namespacefrom_native_object	compliantr_   to_narwhalsr   r!   r   r%   r   r   DASK_backend_versionr   ImportErrorfrom_backendr   r   r   implementationr   r   V1rz   r   _show_suggestions)r[   r=   rh   rq   ri   rj   rr   r   r.   r/   r1   rZ   
translatedns_sparkr   ru   hintrD   rD   rF   rs     sJ  	













rs   obj,Frame | 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 rD   ) _get_native_namespace_single_obj).0xrD   rD   rF   	<setcomp>  s    z'get_native_namespace.<locals>.<setcomp>r   z0Found objects with different native namespaces: rP   )r   lenpop)r   rZ   resultrD   rD   rF   get_native_namespace  s   r   c                 C  s$   t | r|  S tjj| j S rC   )r   __native_namespace__r   rt   r   r   r   to_native_namespace)r   rD   rD   rF   r     s   r   TfuncCallable[..., Any] | NoneCallable[..., Any]c                  s(   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.
        pass_through: Determine what happens if the object can't be converted to Narwhals

            - `False`: raise an error
            - `True` (default): 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   r   rA   c                   s"   t  d fdd}|S )Nargsr   kwargsrA   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 rm   r_   )r   argrj   rh   r=   ri   rD   rF   
<listcomp>H  s    zBnarwhalify.<locals>.decorator.<locals>.wrapper.<locals>.<listcomp>c              
     s$   i | ]\}}|t | d qS r   r   )r   namevaluer   rD   rF   
<dictcomp>S  s    zBnarwhalify.<locals>.decorator.<locals>.wrapper.<locals>.<dictcomp>c                   s"   h | ]}t |d d  r  qS )r   N)getattr)r   vbrD   rF   r   ^  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   rG   )r   r   backendsrZ   r   )rj   rh   r   r=   ri   r   rF   wrapperF  s   
z.narwhalify.<locals>.decorator.<locals>.wrapper)r   r   r   r   rA   r   r   )r   r   r   )r   rF   	decoratorE  s   %znarwhalify.<locals>.decoratorN)r   r   rA   r   rD   )r   r=   rh   ri   rj   r   rD   r   rF   
narwhalify  s   8)r   scalar_likec                 C  s  t  }| du st| tr| }|S t  }r0t| |jr0| jdkr0|  t }tt	j
|d }|S t| s8t| r>|  }|S |rLt| |jrL|  }|S |rZt| |jrZ|  }|S t| trc| }|S t| rkd}|S t| ru|  }|S dt|  d| }t|)aP  If a scalar is not Python native, converts it to Python native.

    Arguments:
        scalar_like: Scalar-like value.

    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])microsecondsz/Expected object convertible to a scalar, found z.
)r   rS   NON_TEMPORAL_SCALAR_TYPESr   
datetime64dtypeitemr   r   dt	timedeltar    r   	Timestampto_pydatetime	Timedeltato_pytimedeltaTEMPORAL_SCALAR_TYPES_is_pandas_nar$   as_pyrX   r   )r   pdscalarnpmsrZ   rD   rD   rF   to_py_scalart  sF   


	r   c                 C  s&   t t  }o|jj| o|| S rC   )rK   r   apitypes	is_scalarisna)r   r   rD   rD   rF   r     s   &r   )r   r   rG   r   )r>   r?   r=   r@   rA   r4   )r>   rI   r=   r@   rA   r6   )r>   rJ   r=   r@   rA   r8   )r>   r   r=   rK   rA   r   )r>   rM   r=   rK   rA   rN   )r[   r:   r\   r]   rA   r:   )r[   r:   r\   r`   rA   r:   )r[   r2   r\   ra   rA   r2   )r[   r9   r\   rb   rA   r9   )r[   r4   r\   ra   rA   r?   )r[   r8   r\   r]   rA   rJ   )r[   r8   r\   r`   rA   rJ   )r[   r6   r\   rb   rA   rI   )r[   rc   r\   r`   rA   rd   )r[   re   r\   rf   rA   rM   )r[   r;   r\   rg   rA   r;   )r[   r   r=   rK   rh   rK   ri   rK   rj   rk   rA   r   )r[   rn   r=   rK   rh   rK   ri   rK   rj   rk   rA   ro   )ru   r   r=   rK   rh   rK   rq   rK   ri   rK   rj   rk   rr   r   rA   r   )r[   r   r=   rK   rh   rK   rq   rK   ri   rK   rj   rk   rr   r   rA   r   )r   r   rA   r   rC   )r   r   r=   rK   rh   rK   ri   rK   rj   rk   rA   r   )r   r   rA   r   )r   r   rA   rK   )\
__future__r   datetimer   decimalr   	functoolsr   typingr   r   r   r	   r
   r   narwhalsr   narwhals._constantsr   r   narwhals._nativer   r   r   r   narwhals._utilsr   r   r   r   r   r   narwhals.dependenciesr   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   typing_extensionsr&   narwhals._translater'   r(   r)   r*   r+   r,   rQ   r.   r/   rR   r1   narwhals.typingr2   r3   r4   r5   r6   r7   r8   r9   r:   r;   rK   bytesstrintfloatcomplexr   dater   timer   rG   r_   r   rs   r   r   r   r   r   __all__rD   rD   rD   rF   <module>   s      < ,!92 
X
 
g
8