o
    ?HhX:                     @   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   s>   zt | W S  ty } ztd|  d|  d|d}~ww )zCheck library is installed.zSetting output container to 'z' requires z to be installedN)	importlibimport_moduleImportError)libraryexc r   Y/home/air/sanwanet/gpt-api/venv/lib/python3.10/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 w | 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      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(       z)ContainerAdapterProtocol.create_containerc                 C   r   )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   r"   z/ContainerAdapterProtocol.is_supported_containerc                 C   r   )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   r"   z'ContainerAdapterProtocol.rename_columnsc                 C   r   )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   r"   zContainerAdapterProtocol.hstackN)F)	__name__
__module____qualname__str__annotations__r!   r$   r&   r(   r   r   r   r   r   $   s   
 
r   c                   @   2   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r|j}nt||jr$|j}nd }t||| d}|d ur8| ||S |S )Nr0   )r#   indexcopy)r   r   
isinstance	DataFramer1   r   r&   )r   r   r   r   r    pdr1   r   r   r   r!   u   s   zPandasAdapter.create_containerc                 C      t d}t||jS )Nr0   r   r3   r4   )r   r#   r5   r   r   r   r$         z$PandasAdapter.is_supported_containerc                 C   
   ||_ |S r   r   r%   r   r   r   r&         zPandasAdapter.rename_columnsc                 C      t d}|j|ddS )Nr0   r	   )axisr   concat)r   r'   r5   r   r   r   r(         zPandasAdapter.hstackNTr)   r*   r+   r   r!   r$   r&   r(   r   r   r   r   r/   r   s    
r/   c                   @   r.   )PolarsAdapterpolarsTc                 C   s`   t d}t|}t|tjr| n|}|rt||js$|j||ddS |d ur.| ||S |S )NrC   row)schemaorient)r   r   r3   npndarraytolistr4   r&   )r   r   r   r   r    plr   r   r   r!      s   zPolarsAdapter.create_containerc                 C   r6   )NrC   r7   )r   r#   rJ   r   r   r   r$      r8   z$PolarsAdapter.is_supported_containerc                 C   r9   r   r   r%   r   r   r   r&      r:   zPolarsAdapter.rename_columnsc                 C   r;   )NrC   
horizontal)howr=   )r   r'   rJ   r   r   r   r(      r?   zPolarsAdapter.hstackNr@   rA   r   r   r   r   rB      s    
rB   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)setrN   rO   r   r   r   supported_outputs   s   z*ContainerAdaptersManager.supported_outputsc                 C   s   || j |j< d S r   )rN   r   )r   adapterr   r   r   register   s   z!ContainerAdaptersManager.registerN)r)   r*   r+   rP   propertyrS   rU   r   r   r   r   rM      s
    
rM   c              
   C   s^   | j jdd }ztj| W S  ty. } zttj }td| d| d|d}~w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__r*   splitADAPTERS_MANAGERrN   KeyErrorlistkeys
ValueError)	containermodule_namer   available_adaptersr   r   r   _get_adapter_from_container   s    rb   c                 C   s0   t | |d }ztj| W S  ty   Y dS w )zGet container adapter.denseN)_get_output_configrZ   rN   r[   )method	estimatordense_configr   r   r   _get_container_adapter   s   rh   c                 C   s\   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 rc   )getattrr   rZ   rS   r^   sorted)re   rf   est_sklearn_output_configrg   rS   r   r   r   rd      s   
rd   c                 C   sb   t | |}|d dkst|s|S |d }t|r#t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.
    rc   rQ   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   )	rd   _auto_wrap_is_configuredr   r^   
capitalizerZ   rN   r!   get_feature_names_out)re   data_to_wraporiginal_inputrf   output_configrg   rT   r   r   r   _wrap_data_with_container  s    

rt   c                    s   t   fdd}|S )z@Wrapper used by `_SetOutputMixin` to automatically wrap methods.c                    sr    | |g|R i |}t |tr2t|d || g|dd  R }tt|dr0t||S |S t||| S )Nr   r	   _make)r3   tuplert   hasattrtyperu   )r   r#   argskwargsrq   return_tuplefre   r   r   wrapped=  s   

z$_wrap_method_output.<locals>.wrappedr   )r}   re   r~   r   r|   r   _wrap_method_output:  s   r   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_keysrp   	transform)rk   rR   rw   )rf   auto_wrap_output_keysr   r   r   rn   Q  s   
rn   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.
    r   c                    s   t  jdi | t|ts|d u std|d u r t | _d S ddd}t | _| D ](\}}t| |r:||vr;q-| j	| || j
vrGq-tt| ||}t| || q-d S )Nz6auto_wrap_output_keys must be None or a tuple of keys.r   )r   fit_transformr   )super__init_subclass__r3   rv   r^   rR   r   itemsrw   add__dict__r   rk   setattr)clsr   rz   method_to_keyre   keywrapped_methodrX   r   r   r   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.
        Nri   r   )rw   ri   )r   r   r   r   r   
set_output  s   

z_SetOutputMixin.set_output)r   )	r)   r*   r+   __doc__r   r
   rn   r   __classcell__r   r   r   r   r   ^  s
    	 r   r   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.
    r   r   Nr   zUnable to configure output for z' because `set_output` is not available.r   )rw   r^   r   )rf   r   set_output_for_transformr   r   r   _safe_set_output  s   



r   r   ) r   	functoolsr   typingr   r   numpyrG   scipy.sparser   _configr   _available_ifr
   fixesr   r   r   r   r/   rB   rM   rZ   rU   rb   rh   rd   rt   r   rn   r   r   r   r   r   r   <module>   s4   	M,

	#.M