a
    hX:                     @   s  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
d Zdd ZeG dd deZG dd dZG dd dZG dd dZe Zee  ee  dd Zd'ddZd(ddZdd Zdd Zd d! ZG d"d# d#Zdd$d%d&ZdS ))    Nwraps)Protocolruntime_checkable)issparse   )
get_config   )available_if)2_create_pandas_dataframe_from_non_pandas_containerc              
   C   sN   zt | W S  tyH } z$td|  d|  d|W Y d}~n
d}~0 0 dS )zCheck library is installed.zSetting output container to 'z' requires z to be installedN)	importlibimport_moduleImportError)libraryexc r   U/var/www/html/assistant/venv/lib/python3.9/site-packages/sklearn/utils/_set_output.pycheck_library_installed   s    r   c                 C   s*   t | r&z|  W S  ty$   Y d S 0 | S N)callable	Exceptioncolumnsr   r   r   get_columns   s    r   c                   @   s8   e Zd ZU eed< dddZdd Zdd Zd	d
 ZdS )ContainerAdapterProtocolcontainer_libFc                 C   s   dS )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.
        Nr   )selfX_output
X_originalr   inplacer   r   r   create_container(   s    z)ContainerAdapterProtocol.create_containerc                 C   s   dS )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   Xr   r   r   is_supported_containerD   s    z/ContainerAdapterProtocol.is_supported_containerc                 C   s   dS )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   r   r   r   rename_columnsR   s    z'ContainerAdapterProtocol.rename_columnsc                 C   s   dS )a  Stack containers horizontally (column-wise).

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

        Returns
        -------
        stacked_Xs : container
            Stacked containers.
        Nr   )r   Xsr   r   r   hstackc   s    zContainerAdapterProtocol.hstackN)F)	__name__
__module____qualname__str__annotations__r    r"   r$   r&   r   r   r   r   r   $   s
   

r   c                   @   s2   e Zd ZdZdddZdd Zdd Zd	d
 ZdS )PandasAdapterpandasTc                 C   st   t d}t|}|r t||js\t||jr4|j}nt||jrH|j}nd }t||| d}|d urp| ||S |S )Nr-   )r!   indexcopy)r   r   
isinstance	DataFramer.   r   r$   )r   r   r   r   r   pdr.   r   r   r   r    u   s    zPandasAdapter.create_containerc                 C   s   t d}t||jS )Nr-   r   r0   r1   )r   r!   r2   r   r   r   r"      s    z$PandasAdapter.is_supported_containerc                 C   s
   ||_ |S r   r   r#   r   r   r   r$      s    zPandasAdapter.rename_columnsc                 C   s   t d}|j|ddS )Nr-   r	   )Zaxisr   concat)r   r%   r2   r   r   r   r&      s    zPandasAdapter.hstackN)Tr'   r(   r)   r   r    r"   r$   r&   r   r   r   r   r,   r   s
   
r,   c                   @   s2   e Zd ZdZdddZdd Zdd Zd	d
 ZdS )PolarsAdapterpolarsTc                 C   s`   t d}t|}t|tjr$| n|}|r8t||jsH|j||ddS |d ur\| ||S |S )Nr8   row)ZschemaZorient)r   r   r0   npZndarraytolistr1   r$   )r   r   r   r   r   plr   r   r   r       s    zPolarsAdapter.create_containerc                 C   s   t d}t||jS )Nr8   r3   )r   r!   r<   r   r   r   r"      s    z$PolarsAdapter.is_supported_containerc                 C   s
   ||_ |S r   r   r#   r   r   r   r$      s    zPolarsAdapter.rename_columnsc                 C   s   t d}|j|ddS )Nr8   
horizontal)howr4   )r   r%   r<   r   r   r   r&      s    zPolarsAdapter.hstackN)Tr6   r   r   r   r   r7      s
   
r7   c                   @   s(   e Zd Zdd Zedd Zdd ZdS )ContainerAdaptersManagerc                 C   s
   i | _ d S r   )adaptersr   r   r   r   __init__   s    z!ContainerAdaptersManager.__init__c                 C   s   dht | jB S )Ndefault)setr@   rA   r   r   r   supported_outputs   s    z*ContainerAdaptersManager.supported_outputsc                 C   s   || j |j< d S r   )r@   r   )r   adapterr   r   r   register   s    z!ContainerAdaptersManager.registerN)r'   r(   r)   rB   propertyrE   rG   r   r   r   r   r?      s   
r?   c              
   C   sn   | j jdd }ztj| W S  tyh } z2ttj }td| d| d|W Y d}~n
d}~0 0 dS )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__r(   splitADAPTERS_MANAGERr@   KeyErrorlistkeys
ValueError)	containermodule_namer   Zavailable_adaptersr   r   r   _get_adapter_from_container   s    rS   c                 C   s4   t | |d }ztj| W S  ty.   Y dS 0 dS )zGet container adapter.denseN)_get_output_configrL   r@   rM   )method	estimatordense_configr   r   r   _get_container_adapter   s
    rY   c                 C   s\   t |di }| |v r||  }nt |  d }tj}||vrTt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 rT   )getattrr   rL   rE   rP   sorted)rV   rW   Zest_sklearn_output_configrX   rE   r   r   r   rU      s    
rU   c                 C   sb   t | |}|d dkst|s"|S |d }t|rFtd|  dtj| }|j|||jd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.
    rT   rC   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   )	rU   _auto_wrap_is_configuredr   rP   
capitalizerL   r@   r    get_feature_names_out)rV   data_to_wrapZoriginal_inputrW   Zoutput_configrX   rF   r   r   r   _wrap_data_with_container  s     

rb   c                    s   t   fdd}|S )z@Wrapper used by `_SetOutputMixin` to automatically wrap methods.c                    sr    | |g|R i |}t |trdt|d || g|dd  R }tt|dr`t||S |S t||| S )Nr   r	   _make)r0   tuplerb   hasattrtyperc   )r   r!   argskwargsra   Zreturn_tuplefrV   r   r   wrapped=  s    

z$_wrap_method_output.<locals>.wrappedr   )rj   rV   rk   r   ri   r   _wrap_method_output:  s    rl   c                 C   s    t | dt }t| do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\   rD   re   )rW   auto_wrap_output_keysr   r   r   r^   Q  s    
r^   c                       s8   e Zd ZdZd fdd	ZeeddddZ  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.
    rn   c                    s   t  jf i | t|ts,|d u s,td|d u r@t | _d S ddd}t | _| D ]P\}}t| |rZ||vrvqZ| j	| || j
vrqZtt| ||}t| || qZd S )Nz6auto_wrap_output_keys must be None or a tuple of keys.rn   )rn   fit_transform)super__init_subclass__r0   rd   rP   rD   rm   itemsre   add__dict__rl   r\   setattr)clsro   rh   Zmethod_to_keyrV   keyZwrapped_methodrJ   r   r   rt   h  s*    
z!_SetOutputMixin.__init_subclass__Nc                C   s*   |du 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.
        NrZ   rn   )re   rZ   )r   rn   r   r   r   
set_output  s    

z_SetOutputMixin.set_output)rq   )	r'   r(   r)   __doc__rt   r
   r^   r|   __classcell__r   r   r{   r   rp   ^  s   	 rp   rq   c                C   sJ   t | dpt | do|du}|s$dS t | ds>td|  d| j|d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.
    rn   rr   Nr|   zUnable to configure output for z' because `set_output` is not available.rq   )re   rP   r|   )rW   rn   Zset_output_for_transformr   r   r   _safe_set_output  s    



r   )N)N) r   	functoolsr   typingr   r   numpyr:   Zscipy.sparser   _configr   Z_available_ifr
   fixesr   r   r   r   r,   r7   r?   rL   rG   rS   rY   rU   rb   rl   r^   rp   r   r   r   r   r   <module>   s2   	M,
	
#.M