§
    ŠhþhQ0  ã                  ó  — d 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
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mZ e
r.dd	lmZ dd
l	mZmZ ddl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( dgZ) G d„ dee*df         ¦  «        Z+dS )zxSchema.

Adapted from Polars implementation at:
https://github.com/pola-rs/polars/blob/main/py-polars/polars/schema.py.
é    )Úannotations)ÚOrderedDict)ÚMapping)Úpartial)ÚTYPE_CHECKINGÚcast)ÚImplementationÚVersionÚqualified_type_nameÚ
zip_strict)Úget_cudfÚis_cudf_dtypeÚis_pandas_like_dtypeÚis_polars_data_typeÚis_polars_schemaÚis_pyarrow_data_typeÚis_pyarrow_schema)ÚIterable)ÚAnyÚClassVarN)ÚSelf)ÚDType)ÚDTypeBackendÚIntoArrowSchemaÚIntoPandasSchemaÚIntoPolarsSchemaÚSchemac                  ó  ‡ — e Zd ZU dZej        Zded<   	 d'd(ˆ fd	„Zd)d„Z	d*d„Z
d+d„Zed,d„¦   «         Zed-d„¦   «         Zed.d„¦   «         Zed/d„¦   «         Zd0d„Z	 d'd1d„Zd2d „Zed3d#„¦   «         Zed4d&„¦   «         Zˆ xZS )5r   a<  Ordered mapping of column names to their data type.

    Arguments:
        schema: The schema definition given by column names and their associated
            *instantiated* Narwhals data type. Accepts a mapping or an iterable of tuples.

    Examples:
        Define a schema by passing *instantiated* data types.

        >>> import narwhals as nw
        >>> schema = nw.Schema({"foo": nw.Int8(), "bar": nw.String()})
        >>> schema
        Schema({'foo': Int8, 'bar': String})

        Access the data type associated with a specific column name.

        >>> schema["foo"]
        Int8

        Access various schema properties using the `names`, `dtypes`, and `len` methods.

        >>> schema.names()
        ['foo', 'bar']
        >>> schema.dtypes()
        [Int8, String]
        >>> schema.len()
        2
    zClassVar[Version]Ú_versionNÚschemaú8Mapping[str, DType] | Iterable[tuple[str, DType]] | NoneÚreturnÚNonec                óR   •— |pi }t          ¦   «                              |¦  «         d S ©N)ÚsuperÚ__init__)Úselfr    Ú	__class__s     €úF/var/www/histauto/venv/lib/python3.11/site-packages/narwhals/schema.pyr'   zSchema.__init__M   s,   ø€ ð �˜2ˆÝ‰Œ×Ò˜Ñ Ô Ð Ð Ð ó    ú	list[str]c                óD   — t          |                      ¦   «         ¦  «        S )z#Get the column names of the schema.)ÚlistÚkeys©r(   s    r*   ÚnameszSchema.namesS   s   € å�D—I’I‘K”KÑ Ô Ð r+   úlist[DType]c                óD   — t          |                      ¦   «         ¦  «        S )z!Get the data types of the schema.)r.   Úvaluesr0   s    r*   ÚdtypeszSchema.dtypesW   s   € å�D—K’K‘M”MÑ"Ô"Ð"r+   Úintc                ó    — t          | ¦  «        S )z(Get the number of columns in the schema.)Úlenr0   s    r*   r8   z
Schema.len[   s   € å�4‰yŒyÐr+   r   r   c               ó¬   ‡ ‡— t          |t          ¦  «        r |s
 ‰ ¦   «         S ddl} |j        |¦  «        }ddlmŠ  ‰ ˆ ˆfd„|D ¦   «         ¦  «        S )a  Construct a Schema from a pyarrow Schema.

        Arguments:
            schema: A pyarrow Schema or mapping of column names to pyarrow data types.

        Examples:
            >>> import pyarrow as pa
            >>> import narwhals as nw
            >>>
            >>> mapping = {
            ...     "a": pa.timestamp("us", "UTC"),
            ...     "b": pa.date32(),
            ...     "c": pa.string(),
            ...     "d": pa.uint8(),
            ... }
            >>> native = pa.schema(mapping)
            >>>
            >>> nw.Schema.from_arrow(native)
            Schema({'a': Datetime(time_unit='us', time_zone='UTC'), 'b': Date, 'c': String, 'd': UInt8})

            >>> nw.Schema.from_arrow(mapping) == nw.Schema.from_arrow(native)
            True
        r   N©Únative_to_narwhals_dtypec              3  óR   •K  — | ]!}|j          ‰|j        ‰j        ¦  «        fV — Œ"d S r%   )ÚnameÚtyper   )Ú.0ÚfieldÚclsr;   s     €€r*   ú	<genexpr>z$Schema.from_arrow.<locals>.<genexpr>€   sP   øè è € ð 
ð 
àð ŒZÐ1Ð1°%´*¸c¼lÑKÔKÐLð
ð 
ð 
ð 
ð 
ð 
r+   )Ú
isinstancer   Úpyarrowr    Únarwhals._arrow.utilsr;   )rA   r    Úpar;   s   `  @r*   Ú
from_arrowzSchema.from_arrow_   s™   øø€ õ2 �f�gÑ&Ô&ð 	'Øð Ø�s‘u”u�Ø Ð Ð Ð à�R”Y˜vÑ&Ô&ˆFØBÐBÐBÐBÐBÐBàˆsð 
ð 
ð 
ð 
ð 
àð
ñ 
ô 
ñ 
ô 
ð 	
r+   r   c               óè   — |s
 | ¦   «         S t          ¦   «         r7t          d„ |                     ¦   «         D ¦   «         ¦  «        rt          j        nt          j        }|                      ||¦  «        S )a3  Construct a Schema from a pandas-like schema representation.

        Arguments:
            schema: A mapping of column names to pandas-like data types.

        Examples:
            >>> import numpy as np
            >>> import pandas as pd
            >>> import pyarrow as pa
            >>> import narwhals as nw
            >>>
            >>> data = {"a": [1], "b": ["a"], "c": [False], "d": [9.2]}
            >>> native = pd.DataFrame(data).convert_dtypes().dtypes.to_dict()
            >>>
            >>> nw.Schema.from_pandas_like(native)
            Schema({'a': Int64, 'b': String, 'c': Boolean, 'd': Float64})
            >>>
            >>> mapping = {
            ...     "a": pd.DatetimeTZDtype("us", "UTC"),
            ...     "b": pd.ArrowDtype(pa.date32()),
            ...     "c": pd.StringDtype("python"),
            ...     "d": np.dtype("uint8"),
            ... }
            >>>
            >>> nw.Schema.from_pandas_like(mapping)
            Schema({'a': Datetime(time_unit='us', time_zone='UTC'), 'b': Date, 'c': String, 'd': UInt8})
        c              3  ó4   K  — | ]}t          |¦  «        V — Œd S r%   )r   )r?   Údtypes     r*   rB   z*Schema.from_pandas_like.<locals>.<genexpr>¦   s*   è è € Ð!TÐ!T¸5¥-°Ñ"6Ô"6Ð!TÐ!TÐ!TÐ!TÐ!TÐ!Tr+   )r   Úanyr4   r	   ÚCUDFÚPANDASÚ_from_pandas_like)rA   r    Úimpls      r*   Úfrom_pandas_likezSchema.from_pandas_like…   sw   € ð: ð 	Ø�3‘5”5ˆLõ ‰zŒzð'Ý!Ð!TÐ!TÀFÇMÂMÁOÄOÐ!TÑ!TÔ!TÑTÔTð'�NÔÐåÔ&ð 	ð
 ×$Ò$ V¨TÑ2Ô2Ð2r+   ú5IntoArrowSchema | IntoPolarsSchema | IntoPandasSchemac               óF  — t          |¦  «        r|                      |¦  «        S t          |¦  «        r|                      |¦  «        S t	          |t
          ¦  «        r!|r|                      |¦  «        n	 | ¦   «         S dt          |¦  «        ›d|›�}t          |¦  «        ‚)ao  Construct a Schema from a native schema representation.

        Arguments:
            schema: A native schema object, or mapping of column names to
                *instantiated* native data types.

        Examples:
            >>> import datetime as dt
            >>> import pyarrow as pa
            >>> import narwhals as nw
            >>>
            >>> data = {"a": [1], "b": ["a"], "c": [dt.time(1, 2, 3)], "d": [[2]]}
            >>> native = pa.table(data).schema
            >>>
            >>> nw.Schema.from_native(native)
            Schema({'a': Int64, 'b': String, 'c': Time, 'd': List(Int64)})
        z5Expected an arrow, polars, or pandas schema, but got z

)	r   rG   r   Úfrom_polarsrC   r   Ú_from_native_mappingr   Ú	TypeError)rA   r    Úmsgs      r*   Úfrom_nativezSchema.from_native«   s¹   € õ* ˜VÑ$Ô$ð 	*Ø—>’> &Ñ)Ô)Ð)Ý˜FÑ#Ô#ð 	+Ø—?’? 6Ñ*Ô*Ð*Ý�f�gÑ&Ô&ð 	IØ7=ÐH�3×+Ò+¨FÑ3Ô3Ð3À3À3Á5Ä5ÐHð=Ý" 6Ñ*Ô*ð=ð =Ø28ð=ð =ð 	õ ˜‰nŒnÐr+   r   c               ó~   ‡ ‡— |s
 ‰ ¦   «         S ddl mŠ  ‰ ˆ ˆfd„|                     ¦   «         D ¦   «         ¦  «        S )a/  Construct a Schema from a polars Schema.

        Arguments:
            schema: A polars Schema or mapping of column names to *instantiated*
                polars data types.

        Examples:
            >>> import polars as pl
            >>> import narwhals as nw
            >>>
            >>> mapping = {
            ...     "a": pl.Datetime(time_zone="UTC"),
            ...     "b": pl.Date(),
            ...     "c": pl.String(),
            ...     "d": pl.UInt8(),
            ... }
            >>> native = pl.Schema(mapping)
            >>>
            >>> nw.Schema.from_polars(native)
            Schema({'a': Datetime(time_unit='us', time_zone='UTC'), 'b': Date, 'c': String, 'd': UInt8})

            >>> nw.Schema.from_polars(mapping) == nw.Schema.from_polars(native)
            True
        r   r:   c              3  óD   •K  — | ]\  }}| ‰|‰j         ¦  «        fV — Œd S r%   ©r   )r?   r=   rJ   rA   r;   s      €€r*   rB   z%Schema.from_polars.<locals>.<genexpr>ê   sP   øè è € ð 
ð 
á��eð Ð+Ð+¨E°3´<Ñ@Ô@ÐAð
ð 
ð 
ð 
ð 
ð 
r+   )Únarwhals._polars.utilsr;   Úitems)rA   r    r;   s   ` @r*   rS   zSchema.from_polarsÌ   sr   øø€ ð4 ð 	Ø�3‘5”5ˆLØCÐCÐCÐCÐCÐCàˆsð 
ð 
ð 
ð 
ð 
à%Ÿ|š|™~œ~ð
ñ 
ô 
ñ 
ô 
ð 	
r+   ú	pa.Schemac                óx   ‡ ‡— ddl }ddlmŠ  |j        ˆˆ fd„‰                      ¦   «         D ¦   «         ¦  «        S )a  Convert Schema to a pyarrow Schema.

        Examples:
            >>> import narwhals as nw
            >>> schema = nw.Schema({"a": nw.Int64(), "b": nw.Datetime("ns")})
            >>> schema.to_arrow()
            a: int64
            b: timestamp[ns]
        r   N©Únarwhals_to_native_dtypec              3  óD   •K  — | ]\  }}| ‰|‰j         ¦  «        fV — Œd S r%   rZ   ©r?   r=   rJ   r`   r(   s      €€r*   rB   z"Schema.to_arrow.<locals>.<genexpr>ý   sP   øè è € ð 
ð 
á��eð Ð+Ð+¨E°4´=ÑAÔAÐBð
ð 
ð 
ð 
ð 
ð 
r+   )rD   rE   r`   r    r\   )r(   rF   r`   s   ` @r*   Úto_arrowzSchema.to_arrowï   sm   øø€ ð 	ÐÐÐàBÐBÐBÐBÐBÐBàˆrŒyð 
ð 
ð 
ð 
ð 
à#Ÿzšz™|œ|ð
ñ 
ô 
ñ 
ô 
ð 	
r+   Údtype_backendú%DTypeBackend | Iterable[DTypeBackend]údict[str, Any]c                óÀ  ‡‡— ddl m} t          |t          j        | j        ¬¦  «        Š‰�t          ‰t          ¦  «        r!ˆˆfd„|                      ¦   «         D ¦   «         S t          ‰¦  «        }t          |¦  «        t          | ¦  «        k    rŽddlm}m}m} t          |¦  «        t          | ¦  «        }}t           ||                      | ||¦  «        |¦  «        ¦  «        |¦  «        ¦  «        }	d|›d|›d	|› d
|d         › d|	› d�}
t!          |
¦  «        ‚ˆfd„t#          |                      ¦   «         |                      ¦   «         |¦  «        D ¦   «         S )am  Convert Schema to an ordered mapping of column names to their pandas data type.

        Arguments:
            dtype_backend: Backend(s) used for the native types. When providing more than
                one, the length of the iterable must be equal to the length of the schema.

        Examples:
            >>> import narwhals as nw
            >>> schema = nw.Schema({"a": nw.Int64(), "b": nw.Datetime("ns")})
            >>> schema.to_pandas()
            {'a': 'int64', 'b': 'datetime64[ns]'}

            >>> schema.to_pandas("pyarrow")
            {'a': 'Int64[pyarrow]', 'b': 'timestamp[ns][pyarrow]'}
        r   r_   )ÚimplementationÚversionNc                ó2   •— i | ]\  }}| ‰|‰¬ ¦  «        “ŒS ©)rJ   rd   © )r?   r=   rJ   rd   Úto_native_dtypes      €€r*   ú
<dictcomp>z$Schema.to_pandas.<locals>.<dictcomp>  s>   ø€ ð ð ð á�D˜%ð �o�o¨EÀÐOÑOÔOðð ð r+   )ÚchainÚisliceÚrepeatz	Provided z) `dtype_backend`(s), but schema contains z1 field(s).
Hint: instead of
    schema.to_pandas(z+)
you may want to use
    schema.to_pandas(z)
or
    schema.to_pandas(ú)c                ó4   •— i | ]\  }}}| ‰||¬ ¦  «        “ŒS rk   rl   )r?   r=   rJ   Úbackendrm   s       €r*   rn   z$Schema.to_pandas.<locals>.<dictcomp>2  s@   ø€ ð 
ð 
ð 
á$��e˜Wð �/�/¨¸WÐEÑEÔEð
ð 
ð 
r+   )Únarwhals._pandas_like.utilsr`   r   r	   rM   r   rC   Ústrr\   Útupler8   Ú	itertoolsro   rp   rq   Úfrom_iterableÚ
ValueErrorr   r/   r4   )r(   rd   r`   Úbackendsro   rp   rq   Ún_userÚn_actualÚ
suggestionrV   rm   s    `         @r*   Ú	to_pandaszSchema.to_pandas  sÑ  øø€ ð$ 	IÐHÐHÐHÐHÐHå!Ø$Ý)Ô0Ø”Mð
ñ 
ô 
ˆð
 Ð ¥J¨}½cÑ$BÔ$BÐ ðð ð ð ð à#'§:¢:¡<¤<ðñ ô ð õ ˜Ñ'Ô'ˆÝˆx‰=Œ=�C ™IœIÒ%Ð%Ø7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7å" 8™}œ}­c°$©i¬i�HˆFÝØ��u×*Ò*¨6¨6°&°&¸Ñ2BÔ2BÀHÑ+MÔ+MÑNÔNÐPXÑYÔYñô ˆJð6˜Fð 6ð 6Èxð 6ð 6à(0ð6ð 6ð )1°¬ð	6ð 6ð )3ð6ð 6ð 6ð õ ˜S‘/”/Ð!ð
ð 
ð 
ð 
å(2°4·9²9±;´;ÀÇÂÁÄÈxÑ(XÔ(Xð
ñ 
ô 
ð 	
r+   ú	pl.Schemac                óþ   ‡ ‡— ddl }ddlmŠ t          j                             ¦   «         }ˆˆ fd„‰                      ¦   «         D ¦   «         }|dk    r |j        |¦  «        nt          dt          |¦  «        ¦  «        S )a%  Convert Schema to a polars Schema.

        Examples:
            >>> import narwhals as nw
            >>> schema = nw.Schema({"a": nw.Int64(), "b": nw.Datetime("ns")})
            >>> schema.to_polars()
            Schema({'a': Int64, 'b': Datetime(time_unit='ns', time_zone=None)})
        r   Nr_   c              3  óD   •K  — | ]\  }}| ‰|‰j         ¦  «        fV — Œd S r%   rZ   rb   s      €€r*   rB   z#Schema.to_polars.<locals>.<genexpr>E  sP   øè è € ð 
ð 
á��eð Ð+Ð+¨E°4´=ÑAÔAÐBð
ð 
ð 
ð 
ð 
ð 
r+   )é   r   r   r€   )
Úpolarsr[   r`   r	   ÚPOLARSÚ_backend_versionr\   r   r   Údict)r(   ÚplÚ
pl_versionr    r`   s   `   @r*   Ú	to_polarszSchema.to_polars7  s¦   øø€ ð 	ÐÐÐàCÐCÐCÐCÐCÐCå#Ô*×;Ò;Ñ=Ô=ˆ
ð
ð 
ð 
ð 
ð 
à#Ÿzšz™|œ|ð
ñ 
ô 
ˆð ˜YÒ&Ð&ð ˆBŒI�fÑÔÐå�k¥4¨¡<¤<Ñ0Ô0ð	
r+   ÚnativeúHMapping[str, pa.DataType] | Mapping[str, pl.DataType] | IntoPandasSchemac               óâ  — t          t          |                     ¦   «         ¦  «        ¦  «        }|\  }}t          |¦  «        r#|                      t          d|¦  «        ¦  «        S t          |¦  «        r#|                      t          d|¦  «        ¦  «        S t          |¦  «        r#|  	                    t          d|¦  «        ¦  «        S d|› dt          |¦  «        › d|›�}t          |¦  «        ‚)Nr   r   r   z7Expected an arrow, polars, or pandas dtype, but found `z: z`

)ÚnextÚiterr\   r   rS   r   r   rP   r   rG   r   rU   )rA   r‹   Ú
first_itemÚ	first_keyÚfirst_dtyperV   s         r*   rT   zSchema._from_native_mappingO  s  € õ �$˜vŸ|š|™~œ~Ñ.Ô.Ñ/Ô/ˆ
Ø!+Ñˆ	�;Ý˜{Ñ+Ô+ð 	EØ—?’?¥4Ð(:¸FÑ#CÔ#CÑDÔDÐDÝ Ñ,Ô,ð 	JØ×'Ò'­Ð-?ÀÑ(HÔ(HÑIÔIÐIÝ Ñ,Ô,ð 	CØ—>’>¥$Ð'8¸&Ñ"AÔ"AÑBÔBÐBðOØðOð OÝ0°Ñ=Ô=ðOð OØDJðOð Oð 	õ ˜‰nŒnÐr+   rh   r	   c               ón   ‡ ‡‡— ddl mŠ |Š ‰ ˆ ˆˆfd„|                     ¦   «         D ¦   «         ¦  «        S )Nr   r:   c              3  óJ   •K  — | ]\  }}| ‰|‰j         ‰d ¬¦  «        fV — ŒdS )T)Úallow_objectNrZ   )r?   r=   rJ   rA   rO   r;   s      €€€r*   rB   z+Schema._from_pandas_like.<locals>.<genexpr>j  sX   øè è € ð 
ð 
á��eð Ð+Ð+¨E°3´<ÀÐTXÐYÑYÔYÐZð
ð 
ð 
ð 
ð 
ð 
r+   )ru   r;   r\   )rA   r    rh   rO   r;   s   `  @@r*   rN   zSchema._from_pandas_likec  sk   øøø€ ð 	IÐHÐHÐHÐHÐHàˆØˆsð 
ð 
ð 
ð 
ð 
ð 
à%Ÿ|š|™~œ~ð
ñ 
ô 
ñ 
ô 
ð 	
r+   r%   )r    r!   r"   r#   )r"   r,   )r"   r2   )r"   r6   )r    r   r"   r   )r    r   r"   r   )r    rQ   r"   r   )r    r   r"   r   )r"   r]   )rd   re   r"   rf   )r"   r€   )r‹   rŒ   r"   r   )r    r   rh   r	   r"   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   ÚMAINr   Ú__annotations__r'   r1   r5   r8   ÚclassmethodrG   rP   rW   rS   rc   r   rŠ   rT   rN   Ú__classcell__)r)   s   @r*   r   r   -   s³  ø€ € € € € € ðð ð: #*¤,€HÐ.Ð.Ð.Ñ.ð RVð!ð !ð !ð !ð !ð !ð !ð!ð !ð !ð !ð#ð #ð #ð #ðð ð ð ð ð#
ð #
ð #
ñ „[ð#
ðJ ð#3ð #3ð #3ñ „[ð#3ðJ ðð ð ñ „[ðð@ ð 
ð  
ð  
ñ „[ð 
ðD
ð 
ð 
ð 
ð( FJð3
ð 3
ð 3
ð 3
ð 3
ðj
ð 
ð 
ð 
ð0 ðð ð ñ „[ðð& ð	
ð 	
ð 	
ñ „[ð	
ð 	
ð 	
ð 	
ð 	
r+   r   ),r™   Ú
__future__r   Úcollectionsr   Úcollections.abcr   Ú	functoolsr   Útypingr   r   Únarwhals._utilsr	   r
   r   r   Únarwhals.dependenciesr   r   r   r   r   r   r   r   r   r   r„   rˆ   rD   rF   Útyping_extensionsr   Únarwhals.dtypesr   Únarwhals.typingr   r   r   r   Ú__all__rv   r   rl   r+   r*   ú<module>r©      së  ððð ð #Ð "Ð "Ð "Ð "Ð "à #Ð #Ð #Ð #Ð #Ð #Ø #Ð #Ð #Ð #Ð #Ð #Ø Ð Ð Ð Ð Ð Ø &Ð &Ð &Ð &Ð &Ð &Ð &Ð &à TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ Tðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð Ø(Ð(Ð(Ð(Ð(Ð(Ø$Ð$Ð$Ð$Ð$Ð$Ð$Ð$àÐÐÐØÐÐÐØ&Ð&Ð&Ð&Ð&Ð&à%Ð%Ð%Ð%Ð%Ð%ðð ð ð ð ð ð ð ð ð ð ð ð ˆ*€ð@
ð @
ð @
ð @
ð @
ˆ[˜˜g˜Ô&ñ @
ô @
ð @
ð @
ð @
r+   