o
    iHK                     @   s$  d dl Z d dlZd dlZd dlmZ d dlmZmZ d dl	m
Z
mZmZ d dlmZmZ dd fdd	Zd
d Zdd Zdd Zdd Zdd Zdd Zejddge e dd Zdd Zdd Zejdddgd d! Zd"d# Zd$d% Zejd&ej d'd(d)dd*fej d'ej d'd+d)dd+fej d'd(d,d dd+fej d'ej d'd+d-d dd.fej d'd(d/d dd0fej d'ej d'd+d1d dd2fej d'd(d)d2d2fej d'ej d'd+d)d+d+fej d'd(d3d d2d4fej d'ej d'd+d5d d+d2fg
ejd6d7d8gd9d: Z!d;d< Z"d=d> Z#d?d@ Z$dAdB Z%ejdCd)dDdEgfdFd dGdHgggejdId7d8gdJdK Z&dLdM Z'dNdO Z(ejdPdQdRgejdSg dTdUdV Z)ejdWd)dXd gdYdZ Z*ejdPdQdRgejdWd)d[d gd\d] Z+dS )^    N)make_pipeline)FunctionTransformerStandardScaler)_convert_containerassert_allclose_dense_sparseassert_array_equal)CSC_CONTAINERSCSR_CONTAINERSc                 O      | S N )Xakr   r   o/home/kim/smarthome/.venv/lib/python3.10/site-packages/sklearn/preprocessing/tests/test_function_transformer.py<lambda>       r   c                    s    fdd}|S )Nc                    s&     |   | | | S r   )appendextendupdate)r   argskwargs
args_storefunckwargs_storer   r   _func   s   


z_make_func.<locals>._funcr   )r   r   r   r   r   r   r   
_make_func   s   r   c                  C   s   g } i }t dd}ttt| |||d | |gks'J dj| d|r1J dj|dg | d d < |  tt| ||}t||dd | |gksYJ dj| d|rcJ dj|dd S )N
         z*transform should have returned X unchangedz5Incorrect positional arguments passed to func: {args})r   z3Unexpected keyword arguments passed to func: {args})err_msg)	nparangereshaper   r   r   	transformformatclear)r   r   r   Ztransformedr   r   r   test_delegate_to_func   s<   



r)   c                  C   s0   t dd} ttt j| t |  d S )Nr   r   )r#   r$   r%   r   r   log1pr&   r   r   r   r   test_np_logD   s
   r,   c                  C   sH   t jddddd} tt jtddd}t|| t j| dd d S 	Nr      r   numr      decimalskw_args)r#   linspacer%   r   arounddictr   r&   r   Fr   r   r   test_kw_argN   s   r;   c                  C   sR   t jddddd} tt jtddd}d|jd	< t|| t j| dd d S )
Nr   r.   r   r/   r   r1   r2   r4   r3   	r#   r6   r%   r   r7   r8   r5   r   r&   r9   r   r   r   test_kw_arg_updateW   s   
r=   c                  C   sT   t jddddd} tt jtddd}tdd|_t|| t j| dd d S r-   r<   r9   r   r   r   test_kw_arg_resetb   s   r>   c                  C   sV   t g dd} tt jt jtddd}t||	| t jt | dd d S )Nr.      	      r!   r!   r1   r2   )r   inverse_funcZinv_kw_args)
r#   arrayr%   r   sqrtr7   r8   r   inverse_transformr&   r9   r   r   r   test_inverse_transformm   s   rH   sparse_containerc                 C   s   t jg dt jdd}| d ur| |}tt jt j| d uddd}d}tjt	|d |
| W d    n1 s;w   Y  tt jt j| d uddd}t  tdt	 ||}W d    n1 sgw   Y  t||| d S )	Nr?   dtyperC   T)r   rD   Zaccept_sparsecheck_inversevalidatezThe provided functions are not strictly inverse of each other. If you are sure you want to proceed regardless, set 'check_inverse=False'.matcherror)r#   rE   float64r%   r   rF   r7   pytestwarnsUserWarningfitexpm1r*   warningscatch_warningssimplefilterfit_transformr   rG   )rI   r   transZwarning_messageZXtr   r   r   test_check_inverse|   s6   
r\   c                  C   s   t jg dt jdd} tt jd ddd}t  tdt	 |
|  W d    n1 s0w   Y  td t jddd}t  tdt	 |
|  W d    d S 1 sYw   Y  d S )Nr?   rJ   rC   T)r   rD   rL   rM   rP   )r#   rE   rQ   r%   r   rV   rW   rX   rY   rT   rU   )r   r[   r   r   r   /test_check_inverse_func_or_inverse_not_provided   s   



"r]   c                  C   s@   t d} | tjdd}t }||}t|dsJ d S )Npandasd   r   loc)	rR   importorskip	DataFramer#   randomZrandnr   rZ   hasattr)pdZX_dftransformerZ
X_df_transr   r   r   test_function_transformer_frame   s
   

rg   X_typerE   Zseriesc                    s   dddddddd   D d	g d
}t| dgd}fdd} fdd}t||ddd}d}tjt|d || W d   dS 1 sPw   Y  dS )zKCheck that `FunctionTransformer.check_inverse` raises error on mixed dtype.r.   r!   r1   fivesix)onetwothreer       c                 S   s   i | ]\}}||qS r   r   ).0keyvaluer   r   r   
<dictcomp>       zJtest_function_transformer_raise_error_with_mixed_dtype.<locals>.<dictcomp>object)rk   rl   rm   rk   rk   r    rn   rq   Zcolumns_namerK   c                    s$   t j fddt jD tdS )Nc                    s   g | ]} |  qS r   r   ro   i)r   mappingr   r   
<listcomp>   s    zXtest_function_transformer_raise_error_with_mixed_dtype.<locals>.func.<locals>.<listcomp>rJ   )r#   rE   rangesizert   r+   )rx   r+   r   r      s   $zDtest_function_transformer_raise_error_with_mixed_dtype.<locals>.funcc                    s    t fdd| D  dgdS )Nc                    s   g | ]} | qS r   r   )ro   x)inverse_mappingr   r   ry          z`test_function_transformer_raise_error_with_mixed_dtype.<locals>.inverse_func.<locals>.<listcomp>rq   ru   )r   r+   )rh   rK   r}   r   r   rD      s   zLtest_function_transformer_raise_error_with_mixed_dtype.<locals>.inverse_funcFT)r   rD   rM   rL   L'check_inverse' is only supported when all the elements in `X` is numerical.rN   N)itemsr   r   rR   raises
ValueErrorrU   )rh   datar   rD   rf   msgr   )rh   rK   r}   rx   r   6test_function_transformer_raise_error_with_mixed_dtype   s   "r   c                  C   sT   t d} | g dg dd}tdd dd dd	}||}t||d
  dS )z8Check support for dataframes with only numerical values.r^   r.   r!   r1   )r@   r    rn   r   bc                 S   s   | d S Nr!   r   r|   r   r   r   r          z`test_function_transformer_support_all_nummerical_dataframes_check_inverse_True.<locals>.<lambda>c                 S   s   | d S r   r   r   r   r   r   r      r   Tr   rD   rL   r!   N)rR   ra   rb   r   rZ   r   )re   dfrf   Zdf_outr   r   r   Ntest_function_transformer_support_all_nummerical_dataframes_check_inverse_True   s   

r   c                  C   sz   t d} tdd dd dd}| g dg dd}d	}t jt|d
 || W d   dS 1 s6w   Y  dS )zYCheck error is raised when check_inverse=True.

    Non-regresion test for gh-25261.
    r^   c                 S   r
   r   r   r   r   r   r   r      r   zQtest_function_transformer_with_dataframe_and_check_inverse_True.<locals>.<lambda>Tr   r   r   r   cr   r   rN   N)rR   ra   r   rb   r   r   rU   )re   rf   Zdf_mixedr   r   r   r   ?test_function_transformer_with_dataframe_and_check_inverse_True   s   
"r   z.X, feature_names_out, input_features, expectedr_   r1   
one-to-one)x0x1x2r   c                 C      dS )Nr   r   rf   input_featuresr   r   r   r     r   c                 C   r   )Nr   der   r   r   r   r   r     r   r   c                 C      t |d S )N)r   tupler   r   r   r   r         )r   r   r   r   c                 C   r   N)r   r   r   r   r   r   r      r   r   c                 C   r   )N)r   r   r   r   r   r   r   5  r   )r   r   r   r   c                 C   r   r   r   r   r   r   r   r   <  r   rM   TFc                 C   sj   t | trtd}|| } t||d}||  ||}t |tj	s'J |j
tks.J t|| d S )Nr^   feature_names_outrM   )
isinstancer8   rR   ra   rb   r   rU   get_feature_names_outr#   ndarrayrK   rt   r   )r   r   r   expectedrM   re   rf   namesr   r   r   /test_function_transformer_get_feature_names_out   s   
O



r   c                  C   sZ   t ddd} tjdd}| | | d}t|tjsJ |jt	ks&J t
|d d S )Nr   Fr   r_   r!   r   )r   r#   rc   randrZ   r   r   r   rK   rt   r   )rf   r   r   r   r   r   Btest_function_transformer_get_feature_names_out_without_validationT  s   

r   c                  C   s^   t  } tjdd}| | d}tjt|d |   W d    d S 1 s(w   Y  d S )Nr_   r!   zCThis 'FunctionTransformer' has no attribute 'get_feature_names_out'rN   )	r   r#   rc   r   rZ   rR   r   AttributeErrorr   )rf   r   r   r   r   r   3test_function_transformer_feature_names_out_is_None_  s   

"r   c                  C   s   dd } dd }t | |tdddd}td	}|tjd
tjd
d}|| |	 }t
|tjs9J |jtks@J t|d d S )Nc                 S   s    t j| t jt| |gddS )Nr.   Zaxis)r#   concatenaterc   r   len)r   nr   r   r   add_n_random_featuresj  s    zYtest_function_transformer_feature_names_out_uses_estimator.<locals>.add_n_random_featuresc                 S   s$   | j d }t|dd t|D  S )Nr   c                 S   s   g | ]}d | qS )Zrndr   rv   r   r   r   ry   o  rs   zitest_function_transformer_feature_names_out_uses_estimator.<locals>.feature_names_out.<locals>.<listcomp>)r5   listrz   )rf   r   r   r   r   r   r   m  s   
zUtest_function_transformer_feature_names_out_uses_estimator.<locals>.feature_names_outr1   )r   T)r   r   r5   rM   r^   r_   r   )r   r   Zrnd0Zrnd1Zrnd2)r   r8   rR   ra   rb   r#   rc   r   rZ   r   r   r   rK   rt   r   )r   r   rf   re   r   r   r   r   r   :test_function_transformer_feature_names_out_uses_estimatori  s   
 
r   c                  C   sz   dd } dd }t ddgddgddgg}t| |d	d
}||}|j|jd ks,J || |j|jd ks;J dS )zSTest that function transformer does not reset estimator in
    `inverse_transform`.c                 S   s&   t | jd df}t j| |fddS )Nr   r.   r   )r#   Zonesshaper   )r   ZX_oner   r   r   add_constant_feature  s   zHtest_function_transformer_validate_inverse.<locals>.add_constant_featurec                 S   s   | d d d df S )Nr   r+   r   r   r   inverse_add_constant  s   zHtest_function_transformer_validate_inverse.<locals>.inverse_add_constantr.   r!   r1   r@   T)r   rD   rM   N)r#   rE   r   rZ   Zn_features_in_r   rG   )r   r   r   r[   X_transr   r   r   *test_function_transformer_validate_inverse  s   

r   zfeature_names_out, expectedpetcolorc                 C      dd |D S )Nc                 S      g | ]}| d qS )Z_outr   )ro   r   r   r   r   ry     rs   <lambda>.<locals>.<listcomp>r   )Zestr   r   r   r   r         Zpet_outZ	color_outin_pipelinec           	         s   t d}|ddgddgd} fdd}t| d	}|r#t|}||}t||js0J | }t|tj	s<J |j
tksCJ t|| d
S )zHCheck that get_feature_names_out works with DataFrames with string data.r^   dogcatredgreen)r   r   c                    s0    dkr| S  d | j }| jtt| j |dS )Nr   columns)r   renamer8   zip)r   namer   r   r   r     s   zCtest_get_feature_names_out_dataframe_with_string_data.<locals>.funcr   r   N)rR   ra   rb   r   r   rZ   r   r   r#   r   rK   rt   r   )	r   r   r   re   r   r   rf   r   r   r   r   r   5test_get_feature_names_out_dataframe_with_string_data  s   

r   c               	   C   s  t d} | g dg dd}ttjdd}t  tdt	 |j
dd W d	   n1 s3w   Y  ||}t|| jsEJ t|jd
dg tdd }|j
dd t  tdt	 ||}W d	   n1 ssw   Y  t|| jsJ t|jd
dg tdd }dD ]-}|j
|d d| d| d}t jt	|d || W d	   n1 sw   Y  q|j
dd t  tdt	 || W d	   d	S 1 sw   Y  d	S )z5Check behavior of set_output with different settings.r^   r   r      r_   r   r   r   rP   r&   Nr   r   c                 S   s   d|  S r   r   r   r   r   r   r     r   z&test_set_output_func.<locals>.<lambda>c                 S   s
   t | S r   )r#   asarrayr   r   r   r   r     s   
 )r^   polarsz'When `set_output` is configured to be 'z'.*z DataFrame.*rN   default)rR   ra   rb   r   r#   logrW   rX   rY   rT   
set_outputrZ   r   r   r   rS   )re   r   ftr   Zft_npr&   r   r   r   r   test_set_output_func  s@   




"r   c                  C   s   t d} dd }tttj|dt }| jddgddgd	d
ggddgd}||}|	 
 ddgks7J t|tjs?J dS )zCheck that we have a consistence between the feature names out of
    `FunctionTransformer` and the feature names in of the next step in the pipeline.

    Non-regression test for:
    https://github.com/scikit-learn/scikit-learn/issues/27695
    r^   c                 S   r   )Nc                 S      g | ]}|d  qS Z__logr   ro   r   r   r   r   ry     r~   zStest_consistence_column_name_between_steps.<locals>.with_suffix.<locals>.<listcomp>r   _r   r   r   r   with_suffix     z?test_consistence_column_name_between_steps.<locals>.with_suffixr   r.   r!   r1   r@   r    rn   r   r   r   Za__logZb__logN)rR   ra   r   r   r#   r*   r   rb   rZ   r   tolistr   r   )re   r   Zpipeliner   r   r   r   r   *test_consistence_column_name_between_steps  s   
$
r   dataframe_libr^   r   transform_output)r   r^   r   c                 C   s   t | }|dkrt | |g dg dd}dd }t|dj|d}||}tt|t| |	 }t
|j|d	|jksHJ | |d	|jksTJ d	S )
z8Check that we overwrite the column names when we should.numpyr   r   r   c                 S   r   )Nc                 S   r   r   r   r   r   r   r   ry     r~   zYtest_function_transformer_overwrite_column_names.<locals>.with_suffix.<locals>.<listcomp>r   r   r   r   r   r     r   zEtest_function_transformer_overwrite_column_names.<locals>.with_suffixr   r   N)rR   ra   rb   r   r   rZ   r   r#   r   r   r   r   r   )r   r   libr   r   rf   r   feature_namesr   r   r   0test_function_transformer_overwrite_column_names  s   



r   r   c                 C   r   )Nc                 S   r   _logr   r   r   r   r   ry     rs   r   r   r   r   r   r   r     r   c                 C   sn   t d}|g dg dd}t| d}||}tt|t| | }t	|j
t	|ks5J dS )zCheck the same as `test_function_transformer_overwrite_column_names`
    but for the specific case of pandas where column names can be numerical.r^   r   r   )r   r.   r   N)rR   ra   rb   r   rZ   r   r#   r   r   r   r   )r   re   r   rf   r   r   r   r   r   :test_function_transformer_overwrite_column_names_numerical  s   


r   c                 C   r   )Nc                 S   r   r   r   r   r   r   r   ry   /  rs   r   r   r   r   r   r   r   /  r   c                    s~   t  }|g dg dd} fdd}t||d}d}t jt|d ||j W d	   d	S 1 s8w   Y  d	S )
zCheck that we raise an error when `func` returns a dataframe with new
    column names that become inconsistent with `get_feature_names_out`.r   r   r   c                    s&    dkr| j ddidS |  ddiS )Nr^   r   r   r   )r   )r   r   r   r   r   :  s   zAtest_function_transformer_error_column_inconsistent.<locals>.funcr   z:The output generated by `func` have different column namesrN   N)rR   ra   rb   r   r   r   rZ   r   )r   r   r   r   r   rf   r"   r   r   r   3test_function_transformer_error_column_inconsistent,  s   

"r   ),rW   r   r#   rR   Zsklearn.pipeliner   Zsklearn.preprocessingr   r   Zsklearn.utils._testingr   r   r   Zsklearn.utils.fixesr   r	   r   r)   r,   r;   r=   r>   rH   markZparametrizer\   r]   rg   r   r   r   rc   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s    
*
	
#
									K

.


