
    {Kg:                     v   d dl Z d dlmZ d dlmZmZ d dlZd dlm	Z	 ddl
mZ ddlmZ dd	lmZ d
 Zd Ze G d de             Z G d d      Z G d d      Z G d d      Z e       Zej/                   e              ej/                   e              d ZddZddZd Zd Zd Z G d d      ZdddZy)    Nwraps)Protocolruntime_checkable)issparse   )
get_config   )available_if)2_create_pandas_dataframe_from_non_pandas_containerc                 v    	 t        j                  |       S # t        $ r}t        d|  d|  d      |d}~ww xY w)zCheck library is installed.zSetting output container to 'z' requires z to be installedN)	importlibimport_moduleImportError)libraryexcs     ]/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/sklearn/utils/_set_output.pycheck_library_installedr      sR    &&w// +G9Ky I 
 	s    	838c                 J    t        |       r	  |        S | S # t        $ r Y y w xY wN)callable	Exceptioncolumnss    r   get_columnsr      s2    	9 N  		s    	""c                   2    e Zd ZU eed<   ddZd Zd Zd Zy)ContainerAdapterProtocolcontainer_libc                      y)a  Create container from `X_output` with additional metadata.

        Parameters
        ----------
        X_output : {ndarray, dataframe}
            Data to wrap.

        X_original : {ndarray, dataframe}
            Original input dataframe. This is used to extract the metadata that should
            be passed to `X_output`, e.g. pandas row index.

        columns : callable, ndarray, or None
            The column names or a callable that returns the column names. The
            callable is useful if the column names require some computation. If `None`,
            then no columns are passed to the container's constructor.

        inplace : bool, default=False
            Whether or not we intend to modify `X_output` in-place. However, it does
            not guarantee that we return the same object if the in-place operation
            is not possible.

        Returns
        -------
        wrapped_output : container_type
            `X_output` wrapped into the container type.
        N )selfX_output
X_originalr   inplaces        r   create_containerz)ContainerAdapterProtocol.create_container%           c                      y)a  Return True if X is a supported container.

        Parameters
        ----------
        Xs: container
            Containers to be checked.

        Returns
        -------
        is_supported_container : bool
            True if X is a supported container.
        Nr    )r!   Xs     r   is_supported_containerz/ContainerAdapterProtocol.is_supported_containerA   r&   r'   c                      y)aQ  Rename columns in `X`.

        Parameters
        ----------
        X : container
            Container which columns is updated.

        columns : ndarray of str
            Columns to update the `X`'s columns with.

        Returns
        -------
        updated_container : container
            Container with new names.
        Nr    r!   r)   r   s      r   rename_columnsz'ContainerAdapterProtocol.rename_columnsO   r&   r'   c                      y)a  Stack containers horizontally (column-wise).

        Parameters
        ----------
        Xs : list of containers
            List of containers to stack.

        Returns
        -------
        stacked_Xs : container
            Stacked containers.
        Nr    )r!   Xss     r   hstackzContainerAdapterProtocol.hstack`   r&   r'   N)F)	__name__
__module____qualname__str__annotations__r%   r*   r-   r0   r    r'   r   r   r   !   s    8"r'   r   c                   *    e Zd ZdZddZd Zd Zd Zy)PandasAdapterpandasc                 8   t        d      }t        |      }|rt        ||j                        sWt        ||j                        r|j                  }n%t        ||j                        r|j                  }nd }t        |||       }|| j                  ||      S |S )Nr8   )r)   indexcopy)r   r   
isinstance	DataFramer:   r   r-   )r!   r"   r#   r   r$   pdr:   s          r   r%   zPandasAdapter.create_containerr   s    $X.g&j2<<@
 (BLL1 J5"(( J%'kH &&x99r'   c                 D    t        d      }t        ||j                        S )Nr8   r   r<   r=   )r!   r)   r>   s      r   r*   z$PandasAdapter.is_supported_container       $X.!R\\**r'   c                     ||_         |S r   r   r,   s      r   r-   zPandasAdapter.rename_columns        	r'   c                 >    t        d      }|j                  |d      S )Nr8   r
   )axisr   concat)r!   r/   r>   s      r   r0   zPandasAdapter.hstack   s    $X.yy!y$$r'   NTr1   r2   r3   r   r%   r*   r-   r0   r    r'   r   r7   r7   o   s    M4+%r'   r7   c                   *    e Zd ZdZddZd Zd Zd Zy)PolarsAdapterpolarsc                 
   t        d      }t        |      }t        |t        j                        r|j                         n|}|rt        ||j                        s|j                  ||d      S || j                  ||      S |S )NrL   row)schemaorient)r   r   r<   npndarraytolistr=   r-   )r!   r"   r#   r   r$   pls         r   r%   zPolarsAdapter.create_container   st    $X.g&&0"**&E'.."7j2<<@<<<GG&&x99r'   c                 D    t        d      }t        ||j                        S )NrL   r@   )r!   r)   rT   s      r   r*   z$PolarsAdapter.is_supported_container   rA   r'   c                     ||_         |S r   r   r,   s      r   r-   zPolarsAdapter.rename_columns   rC   r'   c                 >    t        d      }|j                  |d      S )NrL   
horizontal)howrF   )r!   r/   rT   s      r   r0   zPolarsAdapter.hstack   s    $X.yyy..r'   NrH   rI   r    r'   r   rK   rK      s    M+/r'   rK   c                   (    e Zd Zd Zed        Zd Zy)ContainerAdaptersManagerc                     i | _         y r   )adaptersr!   s    r   __init__z!ContainerAdaptersManager.__init__   s	    r'   c                 4    dht        | j                        z  S )Ndefault)setr]   r^   s    r   supported_outputsz*ContainerAdaptersManager.supported_outputs   s    {S///r'   c                 6    || j                   |j                  <   y r   )r]   r   )r!   adapters     r   registerz!ContainerAdaptersManager.register   s    /6g++,r'   N)r1   r2   r3   r_   propertyrc   rf   r    r'   r   r[   r[      s      0 07r'   r[   c                    | j                   j                  j                  d      d   }	 t        j                  |   S # t
        $ r?}t        t        j                  j                               }t        d| d| d      |d}~ww xY w)zGet the adapter that knows how to handle such container.

    See :class:`sklearn.utils._set_output.ContainerAdapterProtocol` for more
    details.
    .r   zZThe container does not have a registered adapter in scikit-learn. Available adapters are: z" while the container provided is: N)		__class__r2   splitADAPTERS_MANAGERr]   KeyErrorlistkeys
ValueError)	containermodule_namer   available_adapterss       r   _get_adapter_from_containerrt      s     %%0066s;A>K((55 !"2";";"@"@"BC''9&: ;%=+
 		s   = 	B:B  Bc                 f    t        | |      d   }	 t        j                  |   S # t        $ r Y yw xY w)zGet container adapter.denseN)_get_output_configrl   r]   rm   )method	estimatordense_configs      r   _get_container_adapterr{      s;    %fi8AL((66 s   $ 	00c                     t        |di       }| |v r||    }nt               |  d   }t        j                  }||vrt	        dt        |       d|       d|iS )a  Get output config based on estimator and global configuration.

    Parameters
    ----------
    method : {"transform"}
        Estimator's method for which the output container is looked up.

    estimator : estimator instance or None
        Estimator to get the output configuration from. If `None`, check global
        configuration is used.

    Returns
    -------
    config : dict
        Dictionary with keys:

        - "dense": specifies the dense container for `method`. This can be
          `"default"` or `"pandas"`.
    _sklearn_output_config_outputzoutput config must be in z, got rv   )getattrr	   rl   rc   rp   sorted)rx   ry   est_sklearn_output_configrz   rc   s        r   rw   rw      s    ( !(	3KR P**08!|vhg$67(::,,'/@(A'B&W
 	
 \""r'   c                     t        | |      }|d   dk(  st        |      s|S |d   }t        |      rt        d|j	                          d      t
        j                  |   }|j                  |||j                        S )a  Wrap output with container based on an estimator's or global config.

    Parameters
    ----------
    method : {"transform"}
        Estimator's method to get container output for.

    data_to_wrap : {ndarray, dataframe}
        Data to wrap with container.

    original_input : {ndarray, dataframe}
        Original input of function.

    estimator : estimator instance
        Estimator with to get the output configuration from.

    Returns
    -------
    output : {ndarray, dataframe}
        If the output config is "default" or the estimator is not configured
        for wrapping return `data_to_wrap` unchanged.
        If the output config is "pandas", return `data_to_wrap` as a pandas
        DataFrame.
    rv   ra   zmThe transformer outputs a scipy sparse matrix. Try to set the transformer output to a dense array or disable z- output with set_output(transform='default').r   )	rw   _auto_wrap_is_configuredr   rp   
capitalizerl   r]   r%   get_feature_names_out)rx   data_to_wraporiginal_inputry   output_configrz   re   s          r   _wrap_data_with_containerr   	  s    2 'vy9MW*2J92U )LM&&())VX
 	
 ''5G##// $  r'   c                 2     t                fd       }|S )z@Wrapper used by `_SetOutputMixin` to automatically wrap methods.c                      | |g|i |}t        |t              rIt        |d   ||       g|dd  }t        t	        |      d      rt	        |      j                  |      S |S t        |||       S )Nr   r
   _make)r<   tupler   hasattrtyper   )r!   r)   argskwargsr   return_tuplefrx   s         r   wrappedz$_wrap_method_output.<locals>.wrapped:  s    q24262lE* *&,q/1dKab!L tL)73L)//==(q$GGr'   r   )r   rx   r   s   `` r   _wrap_method_outputr   7  s$     1XH H  Nr'   c                 P    t        | dt                     }t        | d      xr d|v S )zReturn True if estimator is configured for auto-wrapping the transform method.

    `_SetOutputMixin` sets `_sklearn_auto_wrap_output_keys` to `set()` if auto wrapping
    is manually disabled.
    _sklearn_auto_wrap_output_keysr   	transform)r   rb   r   )ry   auto_wrap_output_keyss     r   r   r   N  s6     $I/OQTQVW	23 	100r'   c                   F     e Zd ZdZd fd	Z ee      ddd       Z xZS )_SetOutputMixina\  Mixin that dynamically wraps methods to return container based on config.

    Currently `_SetOutputMixin` wraps `transform` and `fit_transform` and configures
    it based on `set_output` of the global configuration.

    `set_output` is only defined if `get_feature_names_out` is defined and
    `auto_wrap_output_keys` is the default value.
    r   c                    t        |   di | t        |t              s|t	        d      |t               | _        y ddd}t               | _        |j                         D ]c  \  }}t        | |      r||vr| j                  j                  |       || j                  vrAt        t        | |      |      }t        | ||       e y )Nz6auto_wrap_output_keys must be None or a tuple of keys.r   )r   fit_transformr    )super__init_subclass__r<   r   rp   rb   r   itemsr   add__dict__r   r   setattr)clsr   r   method_to_keyrx   keywrapped_methodrj   s          r   r   z!_SetOutputMixin.__init_subclass__e  s    !+F+
 ,e48M8UUVV (14C. %(
 .1U*(..0KFC3'36K+K..2237 S\\)0f1EsKNC0 1r'   Nc                R    || S t        | d      si | _        || j                  d<   | S )a  Set output container.

        See :ref:`sphx_glr_auto_examples_miscellaneous_plot_set_output.py`
        for an example on how to use the API.

        Parameters
        ----------
        transform : {"default", "pandas", "polars"}, default=None
            Configure output of `transform` and `fit_transform`.

            - `"default"`: Default output format of a transformer
            - `"pandas"`: DataFrame output
            - `"polars"`: Polars output
            - `None`: Transform configuration is unchanged

            .. versionadded:: 1.4
                `"polars"` option was added.

        Returns
        -------
        self : estimator instance
            Estimator instance.
        r}   r   )r   r}   )r!   r   s     r   
set_outputz_SetOutputMixin.set_output  s7    2 Kt56*,D'3<##K0r'   )r   )	r1   r2   r3   __doc__r   r   r   r   __classcell__)rj   s   @r   r   r   [  s+    1@ *+&*  ,r'   r   r   c                    t        | d      xs t        | d      xr |du}|syt        | d      st        d|  d      | j                  |      S )a)  Safely call estimator.set_output and error if it not available.

    This is used by meta-estimators to set the output for child estimators.

    Parameters
    ----------
    estimator : estimator instance
        Estimator instance.

    transform : {"default", "pandas", "polars"}, default=None
        Configure output of the following estimator's methods:

        - `"transform"`
        - `"fit_transform"`

        If `None`, this operation is a no-op.

    Returns
    -------
    estimator : estimator instance
        Estimator instance.
    r   r   Nr   zUnable to configure output for z' because `set_output` is not available.r   )r   rp   r   )ry   r   set_output_for_transforms      r   _safe_set_outputr     sw    0 		;' 	"9o. "T! 
 $ 	9l+-i[ 9   
 	
 )44r'   r   ) r   	functoolsr   typingr   r   numpyrQ   scipy.sparser   _configr	   _available_ifr   fixesr   r   r   r   r7   rK   r[   rl   rf   rt   r{   rw   r   r   r   r   r   r    r'   r   <module>r      s      .  !   ' E Jx J JZ)% )%X/ />	7 	7 ,-    -/ *   -/ *$ #F+\.
J JZ .2 &5r'   