
    sgDK                     j   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 fdZd Zd	 Zd
 Zd Zd Zd Zej.                  j1                  ddgez   ez         d        Zd Zd Zej.                  j1                  dddg      d        Zd Zd Zej.                  j1                  dej>                  jA                  dd      dddfej>                  jA                  d      ej>                  jA                  d      ddddfej>                  jA                  dd      d ddfej>                  jA                  d      ej>                  jA                  d      dd dd fej>                  jA                  dd      d! dd"fej>                  jA                  d      ej>                  jA                  d      dd# dd$fej>                  jA                  dd      dd$d$fej>                  jA                  d      ej>                  jA                  d      ddddfej>                  jA                  dd      d% d$d&fej>                  jA                  d      ej>                  jA                  d      dd' dd$fg
      ej.                  j1                  d(d)d*g      d+               Z!d, Z"d- Z#d. Z$d/ Z%ej.                  j1                  d0dd1d2gfd3 d4d5ggg      ej.                  j1                  d6d)d*g      d7               Z&d8 Z'd9 Z(ej.                  j1                  d:d;d<g      ej.                  j1                  d=g d>      d?               Z)ej.                  j1                  d@ddA g      dB        Z*ej.                  j1                  d:d;d<g      ej.                  j1                  d@ddC g      dD               Z+y)E    N)make_pipeline)FunctionTransformerStandardScaler)_convert_containerassert_allclose_dense_sparseassert_array_equal)CSC_CONTAINERSCSR_CONTAINERSc                     | S N )Xaks      h/var/www/html/venv/lib/python3.12/site-packages/sklearn/preprocessing/tests/test_function_transformer.py<lambda>r      s         c                       fd}|S )Nc                 z    j                  |        j                  |       j                  |        |       S r   )appendextendupdate)r   argskwargs
args_storefunckwargs_stores      r   _funcz_make_func.<locals>._func   s6    !$F#Awr   r   )r   r   r   r   s   ``` r   
_make_funcr      s     Lr   c                     g } i }t        j                  d      j                  d      }t        t	        t        | |            j                  |      |d       | |gk(  sJ dj                  |              |rJ dj                  |             g | d d  |j                          t	        t        | |            j                  |      }t        ||d       | |gk(  sJ dj                  |              |rJ dj                  |             y )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   transformeds       r   test_delegate_to_funcr-      sK    JL
		"f%AJz<@AKKAN	4 	  W>EE:EVW 
 W<CCCVW JqM%:|,il  Q L
 	  W>EE:EVW 
 W<CCCVWLr   c                      t        j                  d      j                  d      } t        t	        t         j
                        j                  |       t        j
                  |              y )Nr!   r"   )r&   r'   r(   r   r   log1pr)   r   s    r   test_np_logr1   D   sF    
		"f%A BHH%//2
r   c                      t        j                  ddd      j                  d      } t        t         j                  t        d            }t        |j                  |       t        j                  | d             y 	Nr      r!   numr"      decimalskw_args)r&   linspacer(   r   arounddictr   r)   r   Fs     r   test_kw_argrA   N   sS    
Aqb!))&1ABIItQ/?@A q{{1~ryyQ'?@r   c                     t        j                  ddd      j                  d      } t        t         j                  t        d            }d|j                  d	<   t        |j                  |       t        j                  | d             y )
Nr   r4   r!   r5   r"   r7   r8   r:   r9   	r&   r<   r(   r   r=   r>   r;   r   r)   r?   s     r   test_kw_arg_updaterD   W   sa    
Aqb!))&1ABIItQ/?@AAIIj q{{1~ryyQ'?@r   c                     t        j                  ddd      j                  d      } t        t         j                  t        d            }t        d      |_        t        |j                  |       t        j                  | d             y r3   rC   r?   s     r   test_kw_arg_resetrF   b   s_    
Aqb!))&1ABIItQ/?@Aa AI q{{1~ryyQ'?@r   c                  \   t        j                  g d      j                  d      } t        t         j                  t         j
                  t        d            }t        |j                  |j                  |             t        j
                  t        j                  |       d             y )Nr4      	      r$   r$   r7   r8   )r   inverse_funcinv_kw_args)
r&   arrayr(   r   sqrtr=   r>   r   inverse_transformr)   r?   s     r   test_inverse_transformrR   m   ss    
''/A 	WWYY!$	A
 	AKKN+
		"''!*q)r   sparse_containerc                    t        j                  g dt         j                        j                  d      }|  | |      }t	        t         j
                  t         j                  | d udd      }d}t        j                  t        |      5  |j                  |       d d d        t	        t         j                  t         j                  | d udd      }t        j                         5  t        j                  dt               |j!                  |      }d d d        t#        ||j%                               y # 1 sw Y   xY w# 1 sw Y   1xY w)	NrH   dtyperL   T)r   rM   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&   rO   float64r(   r   rP   r=   pytestwarnsUserWarningfitexpm1r/   warningscatch_warningssimplefilterfit_transformr   rQ   )rS   r   transwarning_messageXts        r   test_check_inverserj   |   s   
bjj199&AA#QWWYY&d2E	"  
k	9 		!  XXXX&d2E 
	 	 	" $g{3  #$ !E$;$;B$?@ $ $s   D8(,E8EEc                  4   t        j                  g dt         j                        j                  d      } t	        t         j
                  d dd      }t        j                         5  t        j                  dt               |j                  |        d d d        t	        d t         j
                  dd      }t        j                         5  t        j                  dt               |j                  |        d d d        y # 1 sw Y   oxY w# 1 sw Y   y xY w)NrH   rU   rL   T)r   rM   rX   rY   r\   )r&   rO   r]   r(   r   rb   rc   rd   re   r`   ra   )r   rg   s     r   /test_check_inverse_func_or_inverse_not_providedrl      s     	bjj199&AAXXDtE 
	 	 	" g{3		!  tE 
	 	 	" g{3		!   s   (,D,DDDc                      t        j                  d      } | j                  t        j                  j                  dd            }t               }|j                  |      }t        |d      sJ y )Npandasd   r!   loc)	r^   importorskip	DataFramer&   randomrandnr   rf   hasattr)pdX_dftransformer
X_df_transs       r   test_function_transformer_framerz      sW    			X	&B<<		R01D%'K**40J:u%%%r   X_typerO   seriesc                 X   	
 dddddd

j                         D ci c]  \  }}||
 c}}	dg d}t        | d	g
      }
fd} 	fd}t        ||dd      }d}t        j                  t
        |      5  |j                  |       ddd       yc c}}w # 1 sw Y   yxY w)zKCheck that `FunctionTransformer.check_inverse` raises error on mixed dtype.r4   r$   r7   fivesix)onetwothreer#      object)r   r   r   r   r   r#   r   valuecolumns_namerV   c                     t        j                  t        | j                        D cg c]
  }| |       c}t              S c c}w )NrU   )r&   rO   rangesizer   )r   imappings     r   r   zDtest_function_transformer_raise_error_with_mixed_dtype.<locals>.func   s2    xxaff>11>fMM>s   Ac                 P    t        | D cg c]  }|   	 c}dg      S c c}w )Nr   r   )r   )r   xr{   rV   inverse_mappings     r   rM   zLtest_function_transformer_raise_error_with_mixed_dtype.<locals>.inverse_func   s1    !)*+A_Q+!	
 	
+s   #FT)r   rM   rY   rX   L'check_inverse' is only supported when all the elements in `X` is numerical.rZ   N)itemsr   r   r^   raises
ValueErrorra   )r{   keyr   datar   rM   rx   msgrV   r   r   s   `       @@@r   6test_function_transformer_raise_error_with_mixed_dtyper      s     A&UCG4;MMODjc5uczDOE6DdF'%PDN
 &uDK YC	z	-  - E, s   B?B  B)c                      t        j                  d      } | j                  g dg dd      }t        d d d      }|j	                  |      }t        ||d	z          y
)z8Check support for dataframes with only numerical values.rn   r4   r$   r7   )rI   r#   r   r   bc                     | dz   S Nr$   r   r   s    r   r   z`test_function_transformer_support_all_nummerical_dataframes_check_inverse_True.<locals>.<lambda>   s
    q1u r   c                     | dz
  S r   r   r   s    r   r   z`test_function_transformer_support_all_nummerical_dataframes_check_inverse_True.<locals>.<lambda>   s
    QU r   Tr   rM   rX   r$   N)r^   rq   rr   r   rf   r   )rv   dfrx   df_outs       r   Ntest_function_transformer_support_all_nummerical_dataframes_check_inverse_Truer      sV    			X	&B	II6	7B%?$K
 &&r*F a0r   c                     t        j                  d      } t        d d d      }| j                  g dg dd      }d	}t        j                  t
        |
      5  |j                  |       ddd       y# 1 sw Y   yxY w)zYCheck error is raised when check_inverse=True.

    Non-regresion test for gh-25261.
    rn   c                     | S r   r   r   s    r   r   zQtest_function_transformer_with_dataframe_and_check_inverse_True.<locals>.<lambda>   s    q r   c                     | S r   r   r   s    r   r   zQtest_function_transformer_with_dataframe_and_check_inverse_True.<locals>.<lambda>   s     r   Tr   r   r   r   cr   r   rZ   N)r^   rq   r   rr   r   r   ra   )rv   rx   df_mixedr   s       r   ?test_function_transformer_with_dataframe_and_check_inverse_Truer      sn    
 
		X	&B%{$K ||)/BCH
XC	z	- "!" " "s   A66A?z.X, feature_names_out, input_features, expectedro   r7   
one-to-one)x0x1x2r   c                      y)Nr   r   rx   input_featuress     r   r   r         r   c                      y)Nr   der   r   s     r   r   r     r   r   r   c                     t        |      dz   S )N)r   tupler   s     r   r   r         n0E0N r   )r   r   r   r   c                     t        |      dz   S N)r   r   r   s     r   r   r      r   r   r   c                     t        |      dz   S )N)r   r   r   s     r   r   r   5  r   r   )r   r   r   r   c                     t        |      dz   S r   r   r   s     r   r   r   <  r   r   rY   TFc                 H   t        | t              r&t        j                  d      }|j	                  |       } t        ||      }|j                  |        |j                  |      }t        |t        j                        sJ |j                  t        k(  sJ t        ||       y )Nrn   feature_names_outrY   )
isinstancer>   r^   rq   rr   r   ra   get_feature_names_outr&   ndarrayrV   r   r   )r   r   r   expectedrY   rv   rx   namess           r   /test_function_transformer_get_feature_names_outr      s    ^ !T  *LLO%+hK OOA--n=EeRZZ(((;;&   uh'r   c                     t        dd      } t        j                  j                  dd      }| j	                  |       | j                  d      }t        |t        j                        sJ |j                  t        k(  sJ t        |d       y )Nr   Fr   ro   r$   r   )r   r&   rs   randrf   r   r   r   rV   r   r   )rx   r   r   s      r   Btest_function_transformer_get_feature_names_out_without_validationr   T  sp    %uUK
		sAAa --j9EeRZZ(((;;&   uj)r   c                      t               } t        j                  j                  dd      }| j	                  |       d}t        j                  t        |      5  | j                          d d d        y # 1 sw Y   y xY w)Nro   r$   zCThis 'FunctionTransformer' has no attribute 'get_feature_names_out'rZ   )	r   r&   rs   r   rf   r^   r   AttributeErrorr   )rx   r   r   s      r   3test_function_transformer_feature_names_out_is_Noner   _  s`    %'K
		sAAa 
OC	~S	1 ,))+, , ,s   A33A<c                     d } d }t        | |t        d      d      }t        j                  d      }|j	                  t
        j                  j                  d      t
        j                  j                  d      d	      }|j                  |       |j                         }t        |t
        j                        sJ |j                  t        k(  sJ t        |d
       y )Nc                     t        j                  | t         j                  j                  t	        |       |      gd      S )Nr4   axis)r&   concatenaters   r   len)r   ns     r   add_n_random_featureszYtest_function_transformer_feature_names_out_uses_estimator.<locals>.add_n_random_featuresj  s+    ~~q"))..Q";<1EEr   c                 z    | j                   d   }t        |      t        |      D cg c]  }d| 	 c}z   S c c}w )Nr   rnd)r;   listr   )rx   r   r   r   s       r   r   zUtest_function_transformer_feature_names_out_uses_estimator.<locals>.feature_names_outm  s:    $N#%(&CQQCy&CCC&Cs   8r7   )r   T)r   r   r;   rY   rn   ro   r   )r   r   rnd0rnd1rnd2)r   r>   r^   rq   rr   r&   rs   r   rf   r   r   r   rV   r   r   )r   r   rx   rv   r   r   s         r   :test_function_transformer_feature_names_out_uses_estimatorr   i  s    FD &"+q		K 
		X	&B	BIINN3/biinnS6IJ	KBb!--/EeRZZ(((;;&   u@Ar   c                  $   d } d }t        j                  ddgddgddgg      }t        | |d      }|j                  |      }|j                  |j
                  d   k(  sJ |j                  |       |j                  |j
                  d   k(  sJ y	)
zSTest that function transformer does not reset estimator in
    `inverse_transform`.c                 |    t        j                  | j                  d   df      }t        j                  | |fd      S )Nr   r4   r   )r&   onesshaper   )r   X_ones     r   add_constant_featurezHtest_function_transformer_validate_inverse.<locals>.add_constant_feature  s1    Q(~~q%jq11r   c                     | d d d df   S )Nr   r0   s    r   inverse_add_constantzHtest_function_transformer_validate_inverse.<locals>.inverse_add_constant  s    CRCyr   r4   r$   r7   rI   T)r   rM   rY   N)r&   rO   r   rf   n_features_in_r   rQ   )r   r   r   rg   X_transs        r   *test_function_transformer_validate_inverser     s    2 	1a&1a&1a&)*A!)E
 !!!$G1771:---	G$1771:---r   zfeature_names_out, expectedpetcolorc                 2    |D cg c]  }| d	 c}S c c}w )N_outr   )estr   r   s      r   r   r     s    7As$Z7 7   pet_out	color_outin_pipelinec                     t        j                  d      }|j                  ddgddgd      } fd}t        |       }|rt	        |      }|j                  |      }t        ||j                        sJ |j                         }t        |t        j                        sJ |j                  t        k(  sJ t        ||       y	)
zHCheck that get_feature_names_out works with DataFrames with string data.rn   dogcatredgreen)r   r   c                     dk(  r| S  d | j                         }| j                  t        t        | j                   |                  S )Nr   columns)r   renamer>   zip)r   namer   s     r   r   zCtest_get_feature_names_out_dataframe_with_string_data.<locals>.func  sA    ,H$T1995D88DQYY)=$>8??r   r   r   N)r^   rq   rr   r   r   rf   r   r   r&   r   rV   r   r   )	r   r   r   rv   r   r   rx   r   r   s	   `        r   5test_get_feature_names_out_dataframe_with_string_datar     s     
		X	&B
eU^ug6FGHA@ &4CTUK#K0''*Ggr||,,,--/EeRZZ(((;;&   uh'r   c                     t        j                  d      } | j                  g dg dd      }t        t        j
                  d      }t        j                         5  t        j                  dt               |j                  d       d	d	d	       |j                  |      }t        || j                        sJ t        |j                  d
dg       t        d       }|j                  d       t        j                         5  t        j                  dt               |j                  |      }d	d	d	       t        || j                        sJ t        |j                  d
dg       t        d       }dD ]R  }|j                  |       d| d| d}t        j                  t        |      5  |j                  |       d	d	d	       T |j                  d       t        j                         5  t        j                  dt               |j                  |       d	d	d	       y	# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   y	xY w)z5Check behavior of set_output with different settings.rn   r   r!      ro   r   r   r   r\   r)   Nr   r   c                     d| z  S r   r   r   s    r   r   z&test_set_output_func.<locals>.<lambda>  s
    q1u r   c                 ,    t        j                  |       S r   )r&   asarrayr   s    r   r   z&test_set_output_func.<locals>.<lambda>  s    "**Q- r   )rn   polarsz'When `set_output` is configured to be 'z'.*z DataFrame.*rZ   default)r^   rq   rr   r   r&   logrc   rd   re   r`   
set_outputrf   r   r   r   r_   )rv   r   ftr   ft_npr)   r   s          r   test_set_output_funcr    s   			X	&B
9=9:A	RVV|	DB 
	 	 	" *g{3
)* q!Ggr||,,,wc
3	_	-BMMHM% 
	 	 	" &g{3""1%& gr||,,,wc
3   78E) #	9-5i[I; O  	 \\+S1 	#"	# 	## 
y)		 	 	" g{3A A* *& &	# 	#
 s0   -H',H40I2,I'H14H>I
	Ic                  n   t        j                  d      } d }t        t        t        j
                  |      t                     }| j                  ddgddgdd	ggd
dg      }|j                  |      }|j                         j                         ddgk(  sJ t        |t        j                        sJ y)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
    rn   c                 2    |D cg c]  }|dz   	 c}S c c}w N__logr   _r   r   s      r   with_suffixz?test_consistence_column_name_between_steps.<locals>.with_suffix      +014w111r   r  r4   r$   r7   rI   r#   r   r   r   r   a__logb__logN)r^   rq   r   r   r&   r/   r   rr   rf   r   tolistr   r   )rv   r  pipeliner   r   s        r   *test_consistence_column_name_between_stepsr    s     
		X	&B2 BHHDnFVH 
1v1v1v.c
	CB$$R(G))+22488LLLLgrzz***r   dataframe_librn   r  transform_output)r  rn   r  c                    t        j                  |       }|dk7  rt        j                  |       |j                  g dg dd      }d }t        |      j	                  |      }|j                  |      }t        t        j                  |      t        j                  |             |j                         }t        |j                         |d|j                        k(  sJ |j                          |d|j                        k(  sJ y)	z8Check that we overwrite the column names when we should.numpyr   r   r   c                 2    |D cg c]  }|dz   	 c}S c c}w r  r   r  s      r   r  zEtest_function_transformer_overwrite_column_names.<locals>.with_suffix  r  r   r  r  N)r^   rq   rr   r   r
  rf   r   r&   r  r   r   r   r  )r  r  libr   r  rx   r   feature_namess           r   0test_function_transformer_overwrite_column_namesr"    s     

m
,C7",-	Y];	<B2 &DOO" P K ''+Grzz'*BJJrN;557M Kbjj$AAAA![rzz%BBBBr   r   c                 2    |D cg c]  }| d	 c}S c c}w N_logr   r  s      r   r   r         u$EtvT]$E $Er   c                 b   t        j                  d      }|j                  g dg dd      }t        |       }|j	                  |      }t        t        j                  |      t        j                  |             |j                         }t        |j                        t        |      k(  sJ y)zCheck the same as `test_function_transformer_overwrite_column_names`
    but for the specific case of pandas where column names can be numerical.rn   r   r   )r   r4   r  N)r^   rq   rr   r   rf   r   r&   r  r   r   r   )r   rv   r   rx   r   r!  s         r   :test_function_transformer_overwrite_column_names_numericalr(    s     
		X	&B	)6	7B%8IJK''+Grzz'*BJJrN;557M D$7777r   c                 2    |D cg c]  }| d	 c}S c c}w r$  r   r  s      r   r   r   /  r&  r   c                     t        j                         }|j                  g dg dd      } fd}t        ||      }d}t        j                  t
        |      5  |j                  |      j                   ddd       y# 1 sw Y   yxY w)	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                 \    dk(  r| j                  ddi      S | j                  ddi      S )Nrn   r   r   r   )r   )r   r  s    r   r   zAtest_function_transformer_error_column_inconsistent.<locals>.func:  s3    H$99c3Z90099c3Z((r   r   z:The output generated by `func` have different column namesrZ   N)r^   rq   rr   r   r   r   rf   r   )r  r   r   r   r   rx   r%   s   `      r   3test_function_transformer_error_column_inconsistentr,  ,  sx     

m
,C	Y];	<B) &4CTUKJG	z	1 .!!"%--. . .s   BB),rc   r  r&   r^   sklearn.pipeliner   sklearn.preprocessingr   r   sklearn.utils._testingr   r   r   sklearn.utils.fixesr	   r
   r   r-   r1   rA   rD   rF   rR   markparametrizerj   rl   rz   r   r   r   rs   r   r   r   r   r   r   r   r  r  r"  r(  r,  r   r   r   <module>r3     s      * E 
 ? /C 'WTAAA +dVn-D~-UV A W AF&& GX#67 8:1"  4 IINN3"	
 ))..%BIINN3,?@	
 IINN3":	
 ))..%BIINN3,?@?	
 IINN3"N#	
 ))..%BIINN3,?@N	
 IINN3"	
 ))..%BIINN3,?@	
 IINN3"N 	
 ))..%BIINN3,?@N	
AGJV dE]3( 4WJX("*,B0.0 !	w'(	7)[9QR u6( 7(6+\+. 8X*>?+-LMC N @C, EF8	8 8X*>?EF.	 @
.r   