U
    }h:                     @   s  d dl Z d dl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lmZ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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d.fejd%ejd%d)d/d dd0fejd%d&d'd0d0fejd%ejd%d)d'd)d)fejd%d&d1d d0d2fejd%ejd%d)d3d d)d0fg
ejd4d5d6gd7d8 Z d9d: Z!d;d< Z"d=d> Z#d?d@ Z$ejdAd'dBdCgfdDd dEdFgggejdGd5d6gdHdI Z%dJdK Z&dS )L    N)sparse)make_pipeline)FunctionTransformer_safe_indexing)_convert_containerassert_allclose_dense_sparseassert_array_equalc                 O   s   | S N )Xakr   r   Y/tmp/pip-unpacked-wheel-ig1s1lm8/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sNtdj| d|rbtdj|dg | d d < |	  tt| ||}t||dd | |gkstdj| d|rt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AssertionErrorformatclear)r   r   r   Ztransformedr   r   r   test_delegate_to_func   sL    

  

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_logE   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_argO   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_updateX   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_resetc   s    r>   c                  C   sZ   t ddddgd} tt jt jtddd}t||	| t jt | dd d S )	Nr.      	      r    r    r1   r2   )r   inverse_funcZinv_kw_args)
r"   arrayr$   r   sqrtr7   r8   r	   inverse_transformr%   r9   r   r   r   test_inverse_transformn   s    rG   c               
   C   s\  t jddddgt jdd} | t| t| g}|D ]}t|rLd}nd}tt j	t j
|ddd	}d
}tjt|d || W 5 Q R X tt jt j|ddd	}t  tdt ||}W 5 Q R X t||| q8tt jd ddd}t  tdt ||  W 5 Q R X td t jddd}t  tdt ||  W 5 Q R X d S )Nr.   r?   r@   rA   dtyperB   TF)r   rC   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   rC   rK   rL   )r"   rD   Zfloat64r$   r   Z
csr_matrixZ
csc_matrixissparser   rE   r7   pytestwarnsUserWarningfitexpm1r*   warningscatch_warningssimplefilterfit_transformr   rF   )ZX_denseZX_listr   rJ   transZwarning_messageZXtr   r   r   test_check_inverse}   s\    

   
   
r[   c                  C   s@   t d} | tjdd}t }||}t|ds<t	d S )Npandasd   r   loc)
rQ   importorskip	DataFramer"   randomZrandnr   rY   hasattrr&   )pdZX_dftransformerZ
X_df_transr   r   r   test_function_transformer_frame   s
    

re   X_typerD   Zseriesc              	      s   dddddddd   D d	d
ddd
d
ddg}t| dgd}fdd} fdd}t||ddd}d}tjt|d || W 5 Q R X dS )zKCheck that `FunctionTransformer.check_inverse` raises error on mixed dtype.r.   r    r1   Zfivesix)onetwothreer      c                 S   s   i | ]\}}||qS r   r   ).0keyvaluer   r   r   
<dictcomp>   s      zJtest_function_transformer_raise_error_with_mixed_dtype.<locals>.<dictcomp>objectrh   ri   rj   r   rk   rn   Zcolumns_namerI   c                    s$   t j fddt jD tdS )Nc                    s   g | ]}t  | qS r   r   rl   i)r   mappingr   r   
<listcomp>   s     zXtest_function_transformer_raise_error_with_mixed_dtype.<locals>.func.<locals>.<listcomp>rH   )r"   rD   rangesizerp   r+   )rt   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   )rl   x)inverse_mappingr   r   ru      s     z`test_function_transformer_raise_error_with_mixed_dtype.<locals>.inverse_func.<locals>.<listcomp>rn   rq   )r   r+   )rf   rI   ry   r   r   rC      s    zLtest_function_transformer_raise_error_with_mixed_dtype.<locals>.inverse_funcFT)r   rC   rL   rK   L'check_inverse' is only supported when all the elements in `X` is numerical.rM   N)itemsr   r   rQ   raises
ValueErrorrT   )rf   datar   rC   rd   msgr   )rf   rI   ry   rt   r   6test_function_transformer_raise_error_with_mixed_dtype   s        r   c                  C   sX   t d} | dddgdddg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   rk   r   bc                 S   s   | d S Nr    r   rx   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   rC   rK   N)rQ   r_   r`   r   rY   r   )rc   dfrd   Zdf_outr   r   r   Ntest_function_transformer_support_all_nummerical_dataframes_check_inverse_True   s    
  
r   c               	   C   sh   t d} tdd dd dd}| dddgd	d
dgd}d}t jt|d || W 5 Q R X dS )zYCheck error is raised when check_inverse=True.

    Non-regresion test for gh-25261.
    r\   c                 S   s   | S r
   r   r   r   r   r   r      r   zQtest_function_transformer_with_dataframe_and_check_inverse_True.<locals>.<lambda>Tr   r.   r    r1   r   r   cr   rz   rM   N)rQ   r_   r   r`   r|   r}   rT   )rc   rd   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   s   dS )Nr   r   rd   input_featuresr   r   r   r     r   c                 C   s   dS )Nr   der   r   r   r   r   r     r   r   c                 C   s   t |d S )N)r   tupler   r   r   r   r     r   )r   r   r   r   c                 C   s   t |d S N)r   r   r   r   r   r   r   #  r   )r   r   r   c                 C   s   t |d S )N)r   r   r   r   r   r   r   8  r   )r   r   r   r   c                 C   s   t |d S r   r   r   r   r   r   r   ?  r   rL   TFc                 C   sj   t | trtd}|| } t||d}||  ||}t |tj	sNt
|jtks\t
t|| d S )Nr\   feature_names_outrL   )
isinstancer8   rQ   r_   r`   r   rY   get_feature_names_outr"   ndarrayr&   rI   rp   r	   )r   r   r   expectedrL   rc   rd   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>t|j	t
ksLtt|d d S )Nr   Fr   r]   r    r   )r   r"   ra   randrY   r   r   r   r&   rI   rp   r	   )rd   r   r   r   r   r   Btest_function_transformer_get_feature_names_out_without_validationW  s    

r   c               	   C   sH   t  } tjdd}| | d}tjt|d |   W 5 Q R X d S )Nr]   r    zCThis 'FunctionTransformer' has no attribute 'get_feature_names_out'rM   )	r   r"   ra   r   rY   rQ   r|   AttributeErrorr   )rd   r   r   r   r   r   3test_function_transformer_feature_names_out_is_Noneb  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srt|jtkstt|d d S )Nc                 S   s    t j| t jt| |gddS )Nr.   Zaxis)r"   concatenatera   r   len)r   nr   r   r   add_n_random_featuresm  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   rr   r   r   r   ru   r  s     zitest_function_transformer_feature_names_out_uses_estimator.<locals>.feature_names_out.<locals>.<listcomp>)r5   listrv   )rd   r   r   r   r   r   r   p  s    
zUtest_function_transformer_feature_names_out_uses_estimator.<locals>.feature_names_outr1   )r   T)r   r   r5   rL   r\   r]   r   )r   r   Zrnd0Zrnd1Zrnd2)r   r8   rQ   r_   r`   r"   ra   r   rY   r   r   r   r&   rI   rp   r	   )r   r   rd   rc   r   r   r   r   r   :test_function_transformer_feature_names_out_uses_estimatorl  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sXt|| |j|jd ksvt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   rC   rL   N)r"   rD   r   rY   Zn_features_in_r   r&   rF   )r   r   r   rZ   X_transr   r   r   *test_function_transformer_validate_inverse  s    

r   zfeature_names_out, expectedpetcolorc                 C   s   dd |D S )Nc                 S   s   g | ]}| d qS )Z_outr   )rl   r   r   r   r   ru     s     z<lambda>.<locals>.<listcomp>r   )Zestr   r   r   r   r     r   Zpet_outZ	color_outin_pipelinec                 C   s   t d}|ddgddgd}t| d}|r8t|}||}t||jsRt| }t|t	j
sjt|jtksxtt|| dS )	zHCheck that get_feature_names_out works with DataFrames with string data.r\   ZdogcatZredZgreen)r   r   r   N)rQ   r_   r`   r   r   rY   r   r&   r   r"   r   rI   rp   r	   )r   r   r   rc   r   rd   r   r   r   r   r   5test_get_feature_names_out_dataframe_with_string_data  s    


r   c               	   C   s   t d} | dddgdddgd}ttjd	d
}t  tdt	 |j
dd W 5 Q R X ||}t|| jsztt|jddg tdd }d}t jt	|d |j
dd W 5 Q R X ||}t|| jstt|jddg dS )z5Check behavior of set_output with different settings.r\   r.   r    r1   r      r]   r   r   r   rO   )r%   r   r   c                 S   s   d|  S r   r   r   r   r   r   r     r   z&test_set_output_func.<locals>.<lambda>z6should return a DataFrame to follow the set_output APIrM   N)rQ   r_   r`   r   r"   logrV   rW   rX   rS   Z
set_outputrY   r   r&   r	   columnsrR   )rc   r   ftr   r   r   r   r   test_set_output_func  s     



r   )'rV   Znumpyr"   rQ   Zscipyr   Zsklearn.pipeliner   Zsklearn.preprocessingr   Zsklearn.utilsr   Zsklearn.utils._testingr   r   r	   r   r)   r,   r;   r=   r>   rG   r[   re   markZparametrizer   r   r   ra   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s   
*
	7
									K

