U
    2d&A                     @   sD  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 d dlmZ ejdd	d
gejdedddd Zejdejdgdd Zejdejdgdd Zejdejdgdd Zejdejdgdd Zejdejdgdd Zejdejdgdd Zejdejdgdd Zejdejdgd d! Zd"d# Zejd$dd gejddejgejd%d&d' Zejddejgejdd	d
gd(d) Zejddejgd*d+ Zejd$dd gejddejgd,d- Z ejd.d/ejd0fgd1d2 Z!dS )3    N)config_context)
KNNImputer)nan_euclidean_distances)pairwise_distances)KNeighborsRegressor)assert_allcloseweightsuniformdistancen_neighbors      c                 C   sL   d}d}t j||}t j|d< t|| d}||}|j||fksHtd S )N
      )r   r   )r   r   )nprandomZrandnanr   fit_transformshapeAssertionError)r   r   Zn_rowsZn_colsXimputer	X_imputed r   A/tmp/pip-unpacked-wheel-zrfo1fqw/sklearn/impute/tests/test_knn.pytest_knn_imputer_shape   s    

r   nac                 C   s  t t jddd| gdddddgdddddg| ddddg| d	dd	dgddddd	gg}tjtd
d t| d| W 5 Q R X t t jddd| gdddddgdddddg| ddddg| d	dd	dgddddd	gg}t dddd| gdddddgdddddg| ddddg| d	dd	dgddddd	gg}t| d|}tjtd
d || W 5 Q R X tdddd}t t j	ddddgt j	ddt j	dgt j	ddddgt j	ddddgg}d}tjt|d || W 5 Q R X t ddgt j	dgg}d S )Nr   r         r   r            zInput X contains (infinity|NaN))matchmissing_valuesr	   r%   r   r   zInput X contains NaN)
r   arrayinfpytestZraises
ValueErrorr   fit	transformr   )r   r   ZX_fitr   msgr   r   r   +test_knn_imputer_default_with_invalid_input   s`    

r.   c                 C   s   t dd| dddgdd| dddgdd| dd| gdd| | ddgg}t| dd|}||}t | rpt|jdks~tt 	d	d

dd}||}t|d d d	ddddgf | d S )Nr         ?r   r      r   r%   r   )r0   r    r      r    )r   r'   r   r+   r,   isnananyr   r   ZarangeZreshaper   )r   r   knnZX_transformZX_testr   r   r   (test_knn_imputer_removes_all_na_features]   s    

r6   c              
   C   s   t dddddgdddddgdddddgdddddgg}t d| dddgdddddgdddd| gdd| ddgg}t dddddgdddddgdddddgdddddgg}tddd	d
}t| dd	d
}t||| t|||| d S )Nr   r   r/   r   r   r   g      @      ?r	   r&   r   r'   r   r   r   )r   ZX_zeroZX_nanr   Zimputer_zeroZimputer_nanr   r   r   *test_knn_imputer_zero_nan_imputes_the_samer   s8    			 r9   c                 C   s   t ddddgddd| gddd| g| dddgd| ddgd	d	d	d	gd
dddgg}t ddddgdddd	gdddd	gddddgddddgd	d	d	d	gd
dddgg}t| d}t||| t ddd| gddd| gddd| gddd| gddd| gd	d	d	| gddddgddddgg}d}t ddd|gddd|gddd|gddd|gddd|gd	d	d	|gddddgddddgg}t| d}t||| t ddg| dgddgddgddgdd	gdd
gg}t ddgddgd| gg}d}t ddgddgd|gg}t| d}t|||| d S )Nr   r   r   r   r0   r    r   r"   r               r$         g      5@	      g333333@)r   r'   r   r   r   r+   r,   )r   r   r   r   ZX_impute_valueX1ZX_2_1
X1_imputedr   r   r   test_knn_imputer_verify   sj    































4
rD   c              
   C   s   t ddg| dgddgd| gddg| dgdd	gg}t ddgddgddgddgddgddgdd	gg}td
| d}t||| d S )Nr   r   r0   r   r    r"   r      r!   r   r   r%   r8   )r   r   r   r   r   r   r    test_knn_imputer_one_n_neighbors   s    44rG   c              
   C   s   t ddg| dgddgd| gddg| dgdd	gg}t ddgd
dgddgddgddgd
dgdd	gg}|jd d }t|| d}t||| |jd }t|| d}t||| d S )Nr   r   r0   r   r    r"   r   rE   r!   r   g      @r   rF   )r   r'   r   r   r   r   )r   r   r   r   r   Zimputer_plus1r   r   r   *test_knn_imputer_all_samples_are_neighbors   s    44
rH   c              
   C   s   t ddg| dgddgddgddgdd	gd
dgg}t ddgddgddgddgddgdd	gd
dgg}td| d}t||| dd }t|| d}t||| dd }t|| d}t||| d S )Nr   r   r0   r   r    r   r"   r@   r   rA   r   r	   r   r%   c                 S   s   d S Nr   distr   r   r   	no_weight  s    z2test_knn_imputer_weight_uniform.<locals>.no_weightc                 S   s
   t | S rJ   )r   Z	ones_likerK   r   r   r   uniform_weight  s    z7test_knn_imputer_weight_uniform.<locals>.uniform_weightr8   )r   r   ZX_imputed_uniformr   rM   rN   r   r   r   test_knn_imputer_weight_uniform   s    4,rO   c           $      C   sB  t ddg| dgddgddgddgdd	gd
dgg}tddd}ddddddg}|||dd f ||df  ||dddd f d }dddddg}t|ddd d f || d}d|d d |f   }t j||df |d}t ddg|dgddgddgddgdd	gd
dgg}	t ddg|dgddgddgddgdd	gd
dgg}
td| d}t	|
||	 t	|
||
 t | ddgdddgdddgdddgg}t d}t d}t jddgd| d| gd}t |ddgdddgdddgdddgg}tdd| d}t	|
|| t ddddgd| d| gddd| gddddgddddgddddgddddgg}t|| d}|ddddddgf }|ddddddgf }d| }d| }|ddddddgf }d| }t j|dddddgdf  }t j|dddddgdf  }t jj||d}t jj||d}t jj||d}t ddddgd|d|gddd|gddddgddddgddddgddddgg}td| d}t	|
|| t ddd| gddd| gdd| dgddddgddddgddddgddddg| dddgg}t|dd| d}d|dddf  }d|dddf  }d|d  }d|dddf  }t j|dddf |d}t j|dddf |d} t j|d |d}!t j|dddf |d}"t ddd|gddd| gdd|!dgddddgddddgddddgddddg|"dddgg}t| dd}#t	|#
|| d S )Nr   r   r0   r   r    r   r"   r@   r   rA   r   Z	euclideanr
   )metricr   r   r$   r   rI   g      @g     3@)r   r   r%   nan_euclideanFrP   squaredr%   r/   r   )r   r   r   r   r0   r    )rU   r   )r%   r   )r   r'   r   r+   Zpredictr   Zravelaverager   r   r   sqrtmaZmasked_invalidcopyr   )$r   r   nnZ
X_rows_idxZknn_imputed_valueZX_neighbors_idxrL   r   Zmanual_imputed_valueZX_imputed_distance1ZX_imputed_distance2r   Zdist_0_1Zdist_0_2Zimputed_valuer   Zr1c1_nbor_distsZr1c3_nbor_distsZr1c1_nbor_wtZr1c3_nbor_wtZr2c3_nbor_distsZr2c3_nbor_wtZcol1_donor_valuesZcol3_donor_valuesZr1c1_impZr1c3_impZr2c3_impZr0c3_wZr1c3_wZr2c2_wZr7c0_wr0c3r1c3r2c2r7c0Zimputer_comp_wtr   r   r    test_knn_imputer_weight_distance  s    4 ,,


	






""














   







r_   c               	   C   s   t jdfdd} t dddt jgddddgddddgt jdd	d
gg}d}d}t ddd|gddddgddddg|dd	d
gg}td| d}t||| d S )NFc                 S   sD   t jj| t | d} t jj|t |d}t t | | }|S )N)mask)r   rX   r'   r3   Znansumabs)xyr%   rT   rL   r   r   r   custom_callable  s    z9test_knn_imputer_callable_metric.<locals>.custom_callabler0   r   r   r@   r   rA   g      $@g      "@g      @r   )r   rP   )r   r   r'   r   r   r   )rd   r   ZX_0_3ZX_3_0r   r   r   r   r    test_knn_imputer_callable_metric  s    6*re   working_memoryzignore:adhere to working_memoryc           
      C   s\  t d| d| gddd| gdd| dgddddgddddgddddgddddg| dddgg}t |dddf }t |dd	d	f }t |dd	d	f }t |dddddgdf }t |dd	df }t d|d|gddd|gdd|dgddddgddddgddddgddddg|dddgg}t|d
  t| d}	t|	|| W 5 Q R X d S )Nr   r   r   r   r0   r    r   r"   r   rf   r$   )r   r'   Zmeanr   r   r   r   )
r   rf   r   Zr0c1r[   r\   r]   r^   r   Zimputer_compr   r   r   $test_knn_imputer_with_simple_example  s<    
















rh   c                 C   s   t | dg| dgd| gg}t ddgddgddgg}t| d|d}t||| t d| gg}t ddgg}t||| d S )NrA   r   r   r   r&   r0   r   r'   r   r   r   r,   )r   r   rB   rC   r5   X2Z
X2_imputedr   r   r   +test_knn_imputer_not_enough_valid_distances  s    rk   c                 C   s   t | dg| dgg}t| dd}t dgdgg}t||| t ddgd| gg}t dgdgg}t||| d S )Nr   r   r1   r   r7   ri   )r   rB   r5   ZX1_expectedrj   ZX2_expectedr   r   r   'test_knn_imputer_drops_all_nan_features  s    rl   c              	   C   sj  t d| gd| g| dgddgddg| dgg}t|dd| d	}t j|ddd
f d
|dddf  d}t j|ddd
f d
|d
ddf  d}t j|dddf d
|dddf  d}t j|dddf d
|dddf  d}t d|gd|g|dgddgddg|dgg}t|dB t| ddd}	t|	|| t| ddd}
t|
|| W 5 Q R X d S )Nr   r   r0   r    r   r   rR   FrS   r   r   rQ   rg   r
   r&   )r   r'   r   rV   r   r   r   r   )r   rf   r   rL   ZX_01ZX_11ZX_20ZX_50Z
X_expectedZknn_3Zknn_4r   r   r   7test_knn_imputer_distance_weighted_not_enough_neighbors  s"    .   ****.rm   zna, allow_nan)r   FTc                 C   s"   t | d}| d |kstd S )Nr$   	allow_nan)r   Z	_get_tagsr   )r   rn   r5   r   r   r   test_knn_tags%  s    
ro   )"Znumpyr   r)   Zsklearnr   Zsklearn.imputer   Zsklearn.metrics.pairwiser   r   Zsklearn.neighborsr   Zsklearn.utils._testingr   markZparametrizeranger   r   r.   r6   r9   rD   rG   rH   rO   r_   re   filterwarningsrh   rk   rl   rm   ro   r   r   r   r   <module>   sT   
A

'
I



 
'
