
    ȯei)                    p   U d dl mZ d dl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j                  rRd dlZd dlmZmZ d dlZd dlZd dlZd dlmZ d d	lmZ ej4                  d
k\  r	d dlmZmZ nd dlmZmZ d dlmZ d dlm Z m!Z! ddgZ" G d deeef         Z#e G d de#eef                Z$de%d<   d Z&y)    )annotationsN)Genericfinaloverload)IntoDataFrameT)_reader)
IntoFrameT)AnyLiteral)DatasetCache)Reader)      )LiteralStringSelf)_Backend)Dataset	ExtensionLoaderloadc                     e Zd ZU dZded<   ee	 d	 	 	 dd              Zee	 	 	 	 dd              Zee	 	 	 	 dd              Ze	 d	 	 	 	 	 dd       Zedd       Z	 d	 	 	 	 	 	 	 dd
Z		 d	 	 	 	 	 ddZ
edd       ZddZy	)r   aW  
    Load example datasets *remotely* from `vega-datasets`_, with caching.

    A new ``Loader`` must be initialized by specifying a backend::

        from altair.datasets import Loader

        load = Loader.from_backend("polars")
        load
        Loader[polars]

    .. _vega-datasets:
        https://github.com/vega/vega-datasets
    "Reader[IntoDataFrameT, IntoFrameT]r   c                    y N clsbackend_names     Y/var/www/html/glpi_dashboard/venv/lib/python3.12/site-packages/altair/datasets/_loader.pyfrom_backendzLoader.from_backend3        .1    c                    y r   r   r   s     r   r    zLoader.from_backend9   r!   r"   c                    y r   r   r   s     r   r    zLoader.from_backend?   s     &)r"   c               J    | j                  t        j                  |            S )ad  
        Initialize a new loader, with the specified backend.

        Parameters
        ----------
        backend_name
            DataFrame package/config used to return data.

            * *polars*: Using `polars defaults`_
            * *pandas*: Using `pandas defaults`_.
            * *pandas[pyarrow]*: Using ``dtype_backend="pyarrow"``
            * *pyarrow*: (*Experimental*)

            .. warning::
                Most datasets use a `JSON format not supported`_ by ``pyarrow``

        Examples
        --------
        Using ``polars``::

            from altair.datasets import Loader

            load = Loader.from_backend("polars")
            cars = load("cars")

            type(cars)
            polars.dataframe.frame.DataFrame

        Using ``pandas``::

            load = Loader.from_backend("pandas")
            cars = load("cars")

            type(cars)
            pandas.core.frame.DataFrame

        Using ``pandas``, backed by ``pyarrow`` dtypes::

            load = Loader.from_backend("pandas[pyarrow]")
            co2 = load("co2")

            type(co2)
            pandas.core.frame.DataFrame

            co2.dtypes
            Date             datetime64[ns]
            CO2             double[pyarrow]
            adjusted CO2    double[pyarrow]
            dtype: object

        .. _polars defaults:
            https://docs.pola.rs/api/python/stable/reference/io.html
        .. _pandas defaults:
            https://pandas.pydata.org/docs/reference/io.html
        .. _JSON format not supported:
            https://arrow.apache.org/docs/python/json.html#reading-json-files
        )from_readerr   _from_backendr   s     r   r    zLoader.from_backendE   s    z w44\BCCr"   c               6    | j                  |       }||_        |S r   )__new__r   )r   readerobjs      r   r&   zLoader.from_reader   s    kk#
r"   Nc               >     | j                   j                  ||fi |S )u7  
        Get a remote dataset and load as tabular data.

        Parameters
        ----------
        name
            Name of the dataset/`Path.stem`_.
        suffix
            File extension/`Path.suffix`_.

            .. note::
                Only needed if ``name`` is available in multiple formats.
        **kwds
            Arguments passed to the underlying read function.

        Examples
        --------
        Using ``polars``::

            from altair.datasets import Loader

            load = Loader.from_backend("polars")
            source = load("iowa_electricity")

            source.columns
            ['year', 'source', 'net_generation']

            source.head(5)
            shape: (5, 3)
            ┌────────────┬──────────────┬────────────────┐
            │ year       ┆ source       ┆ net_generation │
            │ ---        ┆ ---          ┆ ---            │
            │ date       ┆ str          ┆ i64            │
            ╞════════════╪══════════════╪════════════════╡
            │ 2001-01-01 ┆ Fossil Fuels ┆ 35361          │
            │ 2002-01-01 ┆ Fossil Fuels ┆ 35991          │
            │ 2003-01-01 ┆ Fossil Fuels ┆ 36234          │
            │ 2004-01-01 ┆ Fossil Fuels ┆ 36205          │
            │ 2005-01-01 ┆ Fossil Fuels ┆ 36883          │
            └────────────┴──────────────┴────────────────┘

        Using ``pandas``::

            load = Loader.from_backend("pandas")
            source = load("iowa_electricity")

            source.columns
            Index(['year', 'source', 'net_generation'], dtype='object')

            source.head(5)
                    year        source  net_generation
            0 2001-01-01  Fossil Fuels           35361
            1 2002-01-01  Fossil Fuels           35991
            2 2003-01-01  Fossil Fuels           36234
            3 2004-01-01  Fossil Fuels           36205
            4 2005-01-01  Fossil Fuels           36883

        Using ``pyarrow``::

            load = Loader.from_backend("pyarrow")
            source = load("iowa_electricity")

            source.column_names
            ['year', 'source', 'net_generation']

            source.slice(0, 5)
            pyarrow.Table
            year: date32[day]
            source: string
            net_generation: int64
            ----
            year: [[2001-01-01,2002-01-01,2003-01-01,2004-01-01,2005-01-01]]
            source: [["Fossil Fuels","Fossil Fuels","Fossil Fuels","Fossil Fuels","Fossil Fuels"]]
            net_generation: [[35361,35991,36234,36205,36883]]

        .. _Path.stem:
            https://docs.python.org/3/library/pathlib.html#pathlib.PurePath.stem
        .. _Path.suffix:
            https://docs.python.org/3/library/pathlib.html#pathlib.PurePath.suffix
        )r   dataset)selfnamesuffixkwdss       r   __call__zLoader.__call__   s#    n $t||##D&9D99r"   c               :    | j                   j                  ||      S )a  
        Return the address of a remote dataset.

        Parameters
        ----------
        name
            Name of the dataset/`Path.stem`_.
        suffix
            File extension/`Path.suffix`_.

            .. note::
                Only needed if ``name`` is available in multiple formats.

        .. _Path.stem:
            https://docs.python.org/3/library/pathlib.html#pathlib.PurePath.stem
        .. _Path.suffix:
            https://docs.python.org/3/library/pathlib.html#pathlib.PurePath.suffix

        Examples
        --------
        The returned url will always point to an accessible dataset::

            import altair as alt
            from altair.datasets import Loader

            load = Loader.from_backend("polars")
            load.url("cars")
            "https://cdn.jsdelivr.net/npm/vega-datasets@v2.11.0/data/cars.json"

        We can pass the result directly to a chart::

            url = load.url("cars")
            alt.Chart(url).mark_point().encode(x="Horsepower:Q", y="Miles_per_Gallon:Q")
        )r   url)r.   r/   r0   s      r   r4   z
Loader.url   s    P ||f--r"   c                .    | j                   j                  S )ab  
        Caching of remote dataset requests.

        Configure cache path::

            self.cache.path = "..."

        Download the latest datasets *ahead-of-time*::

            self.cache.download_all()

        Remove all downloaded datasets::

            self.cache.clear()

        Disable caching::

            self.cache.path = None
        )r   cacher.   s    r   r6   zLoader.cache  s    * ||!!!r"   c                `    t        |       j                   d| j                  j                   dS )N[])type__name__r   _namer7   s    r   __repr__zLoader.__repr__$  s+    t*%%&a(:(:';1==r"   ).)r   Literal['polars']returnz"Loader[pl.DataFrame, pl.LazyFrame])r   $Literal['pandas', 'pandas[pyarrow]']r@   z"Loader[pd.DataFrame, pd.DataFrame])r   Literal['pyarrow']r@   zLoader[pa.Table, pa.Table])polars)r   ztype[Loader[Any, Any]]r   r   r@   zLoader[Any, Any])r*   r   r@   r   r   )r/   Dataset | LiteralStringr0   Extension | Noner1   r
   r@   r   )r/   rD   r0   rE   r@   str)r@   r   )r@   rF   )r<   
__module____qualname____doc____annotations__r   classmethodr    r&   r2   r4   propertyr6   r>   r   r"   r   r   r   !   sS    0//21,1	+1  1 1?1	+1  1 )-)	#)  ) >F<D#<D3;<D	<D <D|   $(W:%W: !W:
 W: 
W:x $((.%(. !(.
 
(.T " ",>r"   c                       e Zd Ze	 	 d	 	 	 	 	 	 	 	 	 dd       Ze	 	 d	 	 	 	 	 	 	 	 	 dd       Ze	 	 d	 	 	 	 	 	 	 	 	 d	d       Ze	 	 d	 	 	 	 	 	 	 	 	 d
d       Z	 	 d	 	 	 	 	 	 	 	 	 d fdZ xZS )_Loadc                    y r   r   r.   r/   r0   backendr1   s        r   r2   z_Load.__call__*  s     r"   c                    y r   r   rP   s        r   r2   z_Load.__call__3       r"   c                    y r   r   rP   s        r   r2   z_Load.__call__<  rS   r"   c                    y r   r   rP   s        r   r2   z_Load.__call__E  s     r"   c               \    |t        |   ||fi |S  | j                  |      ||fi |S r   )superr2   r    )r.   r/   r0   rQ   r1   	__class__s        r   r2   z_Load.__call__N  s@     ?7#D&9D99-4$$W-dFCdCCr"   )..)
rQ   Noner/   rD   r0   rE   r1   r
   r@   r   )
rQ   r?   r/   rD   r0   rE   r1   r
   r@   zpl.DataFrame)
rQ   rA   r/   rD   r0   rE   r1   r
   r@   zpd.DataFrame)
rQ   rB   r/   rD   r0   rE   r1   r
   r@   zpa.Table)NN)
rQ   z_Backend | Noner/   rD   r0   rE   r1   r
   r@   z7IntoDataFrameT | pl.DataFrame | pd.DataFrame | pa.Table)r<   rG   rH   r   r2   __classcell__)rX   s   @r   rN   rN   (  s{    $'
 % !  
   $'%(
 #% !  
   $'8;
 6% !  
   $'&)
 $% !  
  $(#'D
 !D%D !D D 
AD Dr"   rN   z_Load[Any, Any]c                    | dk(  r/t        j                         }t        j                  |      at        S dt
        d| }t        |      )Nr   zmodule z has no attribute )r   infer_backendrN   r&   r   r<   AttributeError)r/   r*   msgs      r   __getattr__r_   _  sJ    v~&&(  (|#5dX>S!!r"   )'
__future__r   typingtr   r   r   narwhals.stable.v1.typingr   altair.datasetsr   altair.datasets._readerr	   TYPE_CHECKINGsysr
   r   pandaspdrC   plpyarrowpaaltair.datasets._cacher   r   version_infor   r   typing_extensionsr   altair.datasets._typingr   r   __all__r   rN   rJ   r_   r   r"   r   <module>rr      s    "  + + 4 # .??#3.
7"..90: V
D>W^Z/0 D>N 0DF>:-. 0D 0Df  "r"   