U
    2dd                     @   s  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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 ejd
eefdd Zejdddgdd Zdd Zejdddddgejdddgdd Zejdeddejdeddejddd gejdddgd!d" Zejd#d$gd%d&gd'd( Zejddd)d*gddde d dgdd+gd,d-ggfdde d d ddd ddge ddgd.d+gd,d-ggfdd.de d dgdd,gd.d/gd,d-ggfd dde d dgddgd,d-ggfd de d d ddd ddge ddgdd+gd,d-ggfgd0d1 Z!ejd#d$gd%d&gd2d3 Z"d4d5 Z#d6d7 Z$ejdddgd8d9 Z%ejd#d$gd%d&gejddddd.dgd:d; Z&d<d= Z'ejddd/gejd>d?d@gejdddgdAdB Z(ejdCddDidEfddFidEfddGidEfddHidIfgdJdK Z)e* dLdM Z+ejdNdd?d@e,ddfdd@d@e,ddfdd?d?d dgfdd@d?dgfdOd?d@d ddgfdOd@d@ddgfdOd?d?d gfdOd@d?g fgejdPd@ej-ej.gdQdR Z/e* dSdT Z0ejdNdd?d@e,d d,fdd@d@e,dd,fdd?d?d ddd.gfdd@d?ddd.gfdUd?d@d dd.dgfdUd@d@dd.dgfdUd?d?d d.gfdUd@d?d.gfdd?d@e,ddfdd@d@e,ddfdd?d?d ddd.gfdd@d?ddd.gfdOd?d@d dd.dd,dVd+dWgfdOd@d@e,ddfdOd?d?d d.gfdOd@d?d.gfdXd?d@d d,dVd+dWgfdXd@d@d,dVd+dWgfdXd?d?d gfdXd@d?g fgejdPd@ej-ej.gdYdZ Z1d[d\ Z2ejd]d>d^d_gdd?d@e3fdd?d@e3fdd?d@ej4fdd?d@ej5fdd@d@ej5fdd@d?ej5fd.d@d@ej5fd.d@d?ej5fgd`da Z6ejd]d>d^d_gdd?d@e3fdd?d@e3fdd?d@ej4fdd?d@ej5fdd@d@ej5fdd@d?ej5fgdbdc Z7ejdddd.dgejdedfdgdhdidjgejd^d?d@gejd>d?d@gdkdl Z8ejd]d>d^d_gdd?d@ej4fdd?d@ej5fdd@d@ej5fdd@d?ej5fgdmdn Z9ejdod]d^gdpdqdrdsdtdudvdwdxdydzd{gd|d} Z:ejd>d^gd~d%d&dgdd Z;ejd]dd^gddrdddddxdddg
dd Z<dd Z=dS )    N)sparse)random)assert_array_almost_equal)assert_allcloseassert_array_equal)BSpline)LinearRegression)Pipeline)KBinsDiscretizerPolynomialFeaturesSplineTransformerestc                 C   sd   t ddd}dd }||  |s.t|| dd|sFtt | dd|s`td	S )
z+Test that output array has the given order.
         c                 S   s   t | jS )N)np	isfortranT)a r   O/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/preprocessing/tests/test_polynomial.pyis_c_contiguous   s    z?test_polynomial_and_spline_array_order.<locals>.is_c_contiguousC)orderFN)r   arangereshapefit_transformAssertionErrorr   )r   Xr   r   r   r   &test_polynomial_and_spline_array_order   s
    r    extrapolationcontinueperiodicc                 C   sL   t ddd}ddgddgddgddgddgg}td	|| d
|}dS )zATest that SplineTransformer accepts integer value knot positions.   r   r   r      r            )degreeknotsr!   N)r   r   r   r   r   )r!   r   r*   _r   r   r   %test_spline_transformer_integer_knots   s    "  r,   c                  C   s   t ddd} tdddd| }| }t|ddd	d
ddddddg
 tdddd| }|ddg}t|ddddddddg dS )z<Test that SplineTransformer generates correct features name.r$   r   r   r(   Tn_knotsr)   include_biasZx0_sp_0Zx0_sp_1Zx0_sp_2Zx0_sp_3Zx0_sp_4Zx1_sp_0Zx1_sp_1Zx1_sp_2Zx1_sp_3Zx1_sp_4Fr   bZa_sp_0Za_sp_1Za_sp_2Za_sp_3Zb_sp_0Zb_sp_1Zb_sp_2Zb_sp_3N)r   r   r   r   fitget_feature_names_outr   )r   spltfeature_namesr   r   r   %test_spline_transformer_feature_names)   s>    r5   constantlinearr)   r   r(   c                 C   sh   t ddd}t|| d|}|ddg}t||jksDt|	|}|j
d t|ksdtdS )	zsTest feature names are correct for different extrapolations and degree.

    Non-regression test for gh-25292.
    r$   r   r   )r)   r!   r   r0   r%   N)r   r   r   r   r1   r2   lenn_features_out_r   	transformshape)r!   r)   r   r3   r4   ZX_transr   r   r   7test_split_transform_feature_names_extrapolation_degreeO   s    

r<   r%   r   r.   r*   uniformquantilec                 C   s   t ddddddf }t jdgg|dddddf dggf }|dddddf }|dkrj||  }t|| |d|d}|| ||fD ]}tt j||dd	d qdS )
zTest that B-splines are indeed a decomposition of unity.

    Splines basis functions must sum up to 1 per row, if we stay in between
    boundaries.
    r   r%   d   Nr   r#   T)r.   r)   r*   r/   r!   Zaxis)r   linspaceZr_r   r1   r   sumr:   )r)   r.   r*   r!   r   ZX_trainZX_testr3   r   r   r   +test_spline_transformer_unity_decompositionb   s    
*
rC   bias	intercept)TF)FTc                 C   s   t ddddddf }t |dddf d }tdtdd| d	d
fdt|dfgd}||| t|||dd dS )z7Test that B-splines fit a sinusodial curve pretty well.r   r   r?   Nr   spline   r(   r6   r.   r)   r/   r!   olsZfit_interceptZstepsMbP?rtol)	r   rA   sinr	   r   r   r1   r   predict)rD   rE   r   ypiper   r   r   )test_spline_transformer_linear_regression   s     	rS   sample_weightexpected_knots            r   c              
   C   sT   t ddgddgddgddgddgddgddgg}tj|| ||d	}t|| d S )
Nr   r   r(   rY   rW   r   rV   rX   )r   r*   r.   rT   )r   arrayr   Z_get_base_knot_positionsr   )r*   r.   rT   rU   r   Z
base_knotsr   r   r   /test_spline_transformer_get_base_knot_positions   s    4   r[   c                 C   s   dd }t ddddddf }tdtdd	| d
dfdt|dfgd}||||dddf  t ddddddf }||}t|||dddf ddd t|dd |dd dd dS )z5Test that B-splines fit a periodic curve pretty well.c                 S   s,   t dt j |  t dt j |   d S )Nr   rV   r(   )r   rO   pi)xr   r   r   f   s    z=test_spline_transformer_periodic_linear_regression.<locals>.fr   r%   e   NrF   r$   r(   r#   rH   rI   rJ   rK   r   i-  g{Gz?)ZatolrN   r?      rL   rM   )r   rA   r	   r   r   r1   rP   r   )rD   rE   r^   r   rR   ZX_Zpredictionsr   r   r   2test_spline_transformer_periodic_linear_regression   s&    	
 rb   c                  C   s   t ddddddf } d}t|ddgdgd	ggd
}|| }t d	dgdd	gd	dgdd	gg}tt dd||d}|| dddf }t|| dS )z@Test that the backport of extrapolate="periodic" works correctlyg      @r   Nr   r#   g                    ?r)   r!   r*   rY   r   )r   rA   r   r   rZ   r   r   r   )r   r)   transformerXtZcoefZsplZXsplr   r   r   0test_spline_transformer_periodic_spline_backport   s      
"rj   c               	   C   s   t ddddddf } tdddgdgd	gd
gdgdggd}tdddgd	gd
gdgdgdggd}|| }|| }t||dddddddgf  dS )zT
    Test if shifted knots result in the same transformation up to permutation.
    r   r   r_   Nr(   r#   rd   re         @      @      @       @rf   g      "@rY   r%   r   )r   rA   r   r   r   )r   Ztransformer_1Ztransformer_2ZXt_1ZXt_2r   r   r   4test_spline_transformer_periodic_splines_periodicity   s    

ro   c           	   	   C   s   t ddddddf }t| ddgdgdgd	gd
gdggd}||}| |  t| }d| }|}td| d D ]0}t j|dd}t 	| |k st
|| }q|t j|dd}t 	| dkst
dS )z?Test that spline transformation is smooth at first / last knot.rc   r   i'  Nr#   rd   re   rk   rl   rm   rn   rf   r%   r   r@   )r   rA   r   r   maxminr8   rangediffabsr   )	r)   r   rh   ri   deltaZtolZdXtdrs   r   r   r   3test_spline_transformer_periodic_splines_smoothness   s     


rw   c              	   C   s$  t ddddddf }| }tdtd|| ddgd	t|d
gg}||| t|dgdggddg tdtd|| ddgd	t|d
gg}||| t|dgdggddg td|| dd}|| t	
t |dgg W 5 Q R X t	
t |dgg W 5 Q R X dS )z1Test that B-spline extrapolation works correctly.r`   r%   r?   NrF   rY   r6   rH   rI   rJ   ir   r7   error)r   rA   Zsqueezer	   r   r   r1   r   rP   pytestraises
ValueErrorr:   )rD   rE   r)   r   rQ   rR   r3   r   r   r   %test_spline_transformer_extrapolation'  sR    		   
r|   c                  C   sn   t jd} | ddd}d}|d }t|dddd}||}t|d	dd
}||}t||dd dS )zCTest that a B-spline of degree=0 is equivalent to KBinsDiscretizer.i| ra   r%   r   r   r>   T)r.   r)   r*   r/   zonehot-dense)n_binsencodeZstrategygvIh%<=rM   N)	r   r   RandomStateZrandnr   r   r   r
   r   )rngr   r}   r.   r3   ZsplinesZkbdZkbinsr   r   r   'test_spline_transformer_kbindiscretizer^  s       

r   r/   TFc                 C   sP   t | ||d}tddddddf }|| ||jd |jksLtdS )z8Test that transform results in n_features_out_ features.r-   r   r%   r   N)r   r   rA   r1   r:   r;   r9   r   )r.   r/   r)   r3   r   r   r   r   &test_spline_transformer_n_features_outr  s    
r   zparams, err_msg)r`   r   z&degree=\(min_degree, max_degree\) must)r   g      ?r(   r   )r%   r   r(   z'int or tuple \(min_degree, max_degree\)c              	   C   s:   dgdgg}t jt|d tf | | W 5 Q R X dS )zBTest that we raise errors for invalid input in PolynomialFeatures.r%   r   matchN)ry   rz   r{   r   r1   )paramserr_msgr   r   r   r   )test_polynomial_features_input_validation~  s    r   c                  C   s@   t dd d t jf } t t | | | d | d g}| |fS )NrW   r   r(   )r   r   ZnewaxishstackZ	ones_like)r   Pr   r   r   single_feature_degree3  s     r   z/degree, include_bias, interaction_only, indicesr   r(   sparse_Xc           
      C   sz   | \}}|r||}t |||d|}||}	|r>|	 }	t|	|dd|f  |jdkrv|jj|j|jfksvt	dS )z9Test PolynomialFeatures on single feature up to degree 3.r)   r/   interaction_onlyNr   
r   r1   r:   toarrayr   n_output_features_Zpowers_r;   Zn_features_in_r   )
r   r)   r/   r   indicesr   r   r   tfoutr   r   r   $test_polynomial_features_one_feature  s       

r   c                  C   s   t dd} | d d d df }| d d dd f }t |d |d  |d |d  |d |d  |d |d  |d |d  |d |d  |d |d  |d |d  |d |d  |d |d  g
}| |fS )NrW   r   r%   r   r   r(   )r   r   r   r   )r   x1x2r   r   r   r   two_features_degree3  s"    r   )r   r      	   r(   r(   c           
      C   sz   | \}}|r||}t |||d|}||}	|r>|	 }	t|	|dd|f  |jdkrv|jj|j|jfksvt	dS )z5Test PolynomialFeatures on 2 features up to degree 3.r   Nr   r   )
r   r)   r/   r   r   r   r   r   r   r   r   r   r   %test_polynomial_features_two_features  s     &  

r   c                  C   s  t ddd} tddd| }| }tddd	d
ddddddg
| t||| j	d ksft
tddd| }|dddg}tdddddddddddddd d!d"d#d$d%g| t||| j	d kst
td&dd| }|dddg}tddddddddddd d!d"d#d$d%g| t||| j	d ks>t
td'ddd(| }|dddg}tdd g| t||| j	d kst
tddd| }|d)d*d+g}tdd)d*d+g| d S ),N   r   r(   r   Tr)   r/   1Zx0r   r   zx0^2zx0 x1zx0 x2zx1^2zx1 x2zx2^2r%   Fr   r0   cza^2za bza czb^2zb czc^2za^3za^2 bza^2 cza b^2za b cza c^2zb^3zb^2 czb c^2zc^3r   r   r   zF40Du   ☮u   א)r   r   r   r   r1   r2   r   r8   r:   r;   r   )r   polyr4   r   r   r   test_polynomial_feature_names  s      r   degr   dtypec           
      C   s   t jd}|ddd}t|}t| ||d}|||}|||}	t	|tjsbt
|j|	jksrt
t|j|	 d S )Nr   r   r?   r   r/   r   )r   r   r   randintr   
csc_matrixr   r   astype
isinstancer   r   r   A)
r   r/   r   r   r   r   ZX_cscr   ZXt_cscXt_denser   r   r   test_polynomial_features_csc_XT  s    
  r   c           
      C   s   t jd}|ddd}t|}t| ||d}|||}||j|dd}	t	|tjsft
|j|	jksvt
t|j|	 d S )Nr   r   r   r   F)copy)r   r   r   r   r   
csr_matrixr   r   r   r   r   r   r   r   )
r   r/   r   r   r   r   X_csrr   Xt_csrr   r   r   r   test_polynomial_features_csr_Xq  s    
  r   
n_featureszmin_degree, max_degree)r   r%   )r   r   )r%   r(   )r   rY   )r(   rY   c           	      C   sl   t dgdg| d gff}t|||d}|| |j}tj| d|||d}|tdd |D kshtdS )z?
    Test that n_output_features_ is calculated correctly.
    r%   r   )r)   r   r/   )r   
min_degree
max_degreer   r/   c                 S   s   g | ]}d qS )r%   r   ).0r+   r   r   r   
<listcomp>  s     z)test_num_combinations.<locals>.<listcomp>N)r   r   r   r1   r   Z_combinationsrB   r   )	r   r   r   r   r/   r]   r   Z
num_combosZcombosr   r   r   test_num_combinations  s     
r   c           	      C   sz   t ddddd }| }t| ||d}|||}|||}t|tjsZt	|j
|j
ksjt	t|j| d S )N  r         ?r   Zrandom_stater   )sparse_randomtocsrr   r   r   r   r   r   r   r   r   r   r   )	r   r/   r   r   r   r   r   r   r   r   r   r   %test_polynomial_features_csr_X_floats  s    
  r   zero_row_index)r   r   T)r%   r   T)r   r   T)r   r(   T)r%   r(   T)r   r(   T)r   r   F)r%   r   F)r   r   F)r   r(   F)r%   r(   F)r   r(   Fc                 C   s~   t ddddd }d|| d d f< | }t|d|d}||}||}t|tjs^t|j	|j	ksntt
|j| d S )	Nr(   r   re   r   r   rd   Fr   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   'test_polynomial_features_csr_X_zero_row  s    

r   )TT)FFc                 C   sn   t ddddd }| }td| |d}||}||}t|tjsNt|j	|j	ks^tt
|j| d S )Nr   r   r   r   r   rY   r   r   )r/   r   r   r   r   r   r   r   r   r   'test_polynomial_features_csr_X_degree_4  s      

r   dim)r   r%   T)r(   r%   T)r(   r   T)r(   r(   T)r   r%   F)r(   r%   F)r(   r   F)r(   r(   Fc                 C   sl   t d|ddd }| }t| |d}||}||}t|tjsLt|j	|j	ks\tt
|j| d S )Nr   r   r   r   )r   r   )r   r   r   r   r   r   r   r   r   r   r   (test_polynomial_features_csr_X_dim_edges  s    

r   c               	   C   s   t d} tddd}d}tjt|d ||  W 5 Q R X tddd}d}tjt|d ||  W 5 Q R X | t| t	| fD ]F}tdd	d}||}t
|r| }t|t | jd d
f qdS )zCheck that PolynomialFeatures raises error when degree=0 and include_bias=False,
    and output a single constant column when include_bias=True
    )r   r   r   Fr   zWSetting degree to zero and include_bias to False would result in an empty output array.r   )r   r   zoSetting both min_degree and max_degree to zero and include_bias to False would result in an empty output array.Tr%   N)r   Zonesr   ry   rz   r{   r   r   r   r   issparser   r   r;   )r   r   r   Z_Xoutputr   r   r   1test_polynomial_features_behaviour_on_zero_degree  s"    


r   )>Znumpyr   ry   Zscipyr   Zscipy.sparser   r   Zsklearn.utils._testingr   Znumpy.testingr   r   Zscipy.interpolater   Zsklearn.linear_modelr   Zsklearn.pipeliner	   Zsklearn.preprocessingr
   r   r   markZparametrizer    r,   r5   r<   rr   rC   rS   rZ   r[   rb   rj   ro   rw   r|   r   r   r   Zfixturer   slicer   r   r   r   r   r   intZfloat32Zfloat64r   r   r   r   r   r   r   r   r   r   r   r   <module>   s  

	&


"("


&5	



	




L







 
	




