U
    sVc3                     @   sb   d dl Zd dlZd dlmZmZmZ d dlmZ	 d dl
m  mZ G dd dZG dd dZdS )    N)	DataFrameIndexSeriesc                   @   s   e Zd Zejeegddd Zej	de
ed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dd Zdd Zdd Zej	ddd d!d"d#gfd$d%gd&d' Zd(d) Zd*d+ Zd,S )-
TestSample)paramsc                 C   s6   |j }|tkrtjd}ntjdd}||d dS )N
   )Zdtype)paramr   nprandomrandn)selfrequestklassZarr r   J/tmp/pip-unpacked-wheel-xj8nt62q/pandas/tests/frame/methods/test_sample.pyobj   s
    zTestSample.objtestr   c              	   C   sB  t jdd}t|jd|d|jd|d t|jd|d|jd|d t|jdt j|d|jdt j|d t|jdt j|d|jdt j|d t|jddt j|d	|jddt j|d	 g g  }}tdD ]4}t j| |	|jdd
 |	|jdd qtj|  tj|  d S )Nr   d      nrandom_stategffffff?)fracr      T)r   replacer   r   r   )
r	   r
   randinttmassert_equalsampleZRandomStaterangeseedappend)r   r   r   r"   Zos1Zos2_r   r   r   test_sample   s8     

zTestSample.test_samplec                 C   sL   t |jdddkstt |jdddks0tt |jdddksHtd S )Nr   r   g(\?r      g
ףp=
?)lenr    AssertionErrorr   r   r   r   r   test_sample_lengths?   s    zTestSample.test_sample_lengthsc              	   C   s.   d}t jt|d |jdd W 5 Q R X d S )Nzdrandom_state must be an integer, array-like, a BitGenerator, Generator, a numpy RandomState, or NonematchZa_string)r   pytestraises
ValueErrorr    r   r   msgr   r   r    test_sample_invalid_random_stateE   s    z+TestSample.test_sample_invalid_random_statec              	   C   s0   d}t jt|d |jddd W 5 Q R X d S )Nz0Please enter a value for `frac` OR `n`, not bothr+   r&   g333333?)r   r   r-   r1   r   r   r   "test_sample_wont_accept_n_and_fracN   s    z-TestSample.test_sample_wont_accept_n_and_fracc              	   C   sP   t jtdd |jdd W 5 Q R X t jtdd |jdd W 5 Q R X d S )Nz<A negative number of rows requested. Please provide `n` >= 0r+   r   z?A negative number of rows requested. Please provide `frac` >= 0g333333ӿr   r-   r)   r   r   r   $test_sample_requires_positive_n_fracT   s    z/TestSample.test_sample_requires_positive_n_fracc              	   C   s*   t jtdd |jdd W 5 Q R X d S )Nz$Only integers accepted as `n` valuesr+   g	@r   r-   r)   r   r   r   test_sample_requires_integer_n`   s    z)TestSample.test_sample_requires_integer_nc              	   C   s   d}t jt|d |jdddgd W 5 Q R X t jt|d dgd }|jd|d W 5 Q R X t jtd	d" tddd
g}|jd|d W 5 Q R X d S )N5Weights and axis to be sampled must be of same lengthr+   r&   r      r   weights      ?   z%Fewer non-zero entries in p than sizeg?r   )r.   r/   r0   r    r   )r   r   r2   bad_weightsZbad_weight_seriesr   r   r   "test_sample_invalid_weight_lengthse   s    
z-TestSample.test_sample_invalid_weight_lengthsc              	   C   s:   dgd }d}t jt|d |jd|d W 5 Q R X d S )Ngr   z.weight vector many not include negative valuesr+   r&   r:   r-   )r   r   r>   r2   r   r   r   test_sample_negative_weightss   s    
z'TestSample.test_sample_negative_weightsc              	   C   s   dgd }t j|d< d}tjt|d |jd|d W 5 Q R X dgd }t j |d< tjt|d |jd|d W 5 Q R X d S )Ng?r   r   z*weight vector may not include `inf` valuesr+   r&   r:   )r	   infr.   r/   r0   r    )r   r   Zweights_with_infr2   Zweights_with_ninfr   r   r   test_sample_inf_weightsz   s    


z"TestSample.test_sample_inf_weightsc              	   C   s6   dgd }t jtdd |jd|d W 5 Q R X d S )Nr   r   $Invalid weights: weights sum to zeror+   r&   r:   r-   )r   r   Zzero_weightsr   r   r   test_sample_zero_weights   s    
z#TestSample.test_sample_zero_weightsc              	   C   s8   t jgd }tjtdd |jd|d W 5 Q R X d S )Nr   rC   r+   r&   r:   )r	   nanr.   r/   r0   r    )r   r   Znan_weightsr   r   r   test_sample_missing_weights   s    z&TestSample.test_sample_missing_weightsc                 C   s8   d gd }d|d< t |jdd|d|jdd  d S )Nr   r<      r9   r   r   axisr;      )r   r   r    iloc)r   r   Zweights_with_Noner   r   r   test_sample_none_weights   s    
 z#TestSample.test_sample_none_weightszfunc_str,argznp.arrayr   r&   r9   r   )znp.random.MT19937r&   )znp.random.PCG64r=   c                 C   sh   t tddtddd}t||}|jdt||d}|jdtt||d}t|| d S )Nr         col1col2r&   r   )	r   r!   r   get_objr    evalcomr   r   )r   Zfunc_strargframe_or_seriesr   resultexpectedr   r   r   test_sample_random_state   s
    
z#TestSample.test_sample_random_statec                 C   s   |t d}t j }|jd|d}|jd|d}|jj|jjk rLt|jdt jdd}|jdt jdd}t	
|| d S )Nr   2   r   r=   )r	   Zaranger
   Zdefault_rngr    indexvaluesallr(   r   r   )r   rV   r   rngZresult1Zresult2r   r   r   test_sample_generator   s    
z TestSample.test_sample_generatorc              	   C   sL   t dtdi}t||}d}tjt|d |jddd W 5 Q R X d S )NAabczJReplace has to be set to `True` when upsampling the population `frac` > 1.r+   r   F)r   r   )r   listr   rR   r.   r/   r0   r    )r   rV   r   r2   r   r   r   *test_sample_upsampling_without_replacement   s    z5TestSample.test_sample_upsampling_without_replacementN)__name__
__module____qualname__r.   Zfixturer   r   r   markZparametrizerb   r!   r%   r*   r3   r4   r6   r7   r?   r@   rB   rD   rF   rL   rY   r_   rc   r   r   r   r   r      s2   

'	
r   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )TestSampleDataFramec           	   	   C   s  dgd }d|d< t tddtdddgd |d}|jdd	d
}t||jdd  ttd}d}tjt	|d |jddd
 W 5 Q R X d}tjt	|d |jdddd W 5 Q R X tjt
dd |jddd
 W 5 Q R X dgd }d|d< t|jd|d
|jd d  t tddgd d}ddg}t|jdd|d|dg  t|jdd|d|dg  dgd }d|d< t|jdd|d|jdd  t|jdd|d|jdd  d}tjt	|d |jddd W 5 Q R X d}tjt	|d |jddd W 5 Q R X ttd}tjt	d d |jddd W 5 Q R X d!}tjt	|d |jdddgd d W 5 Q R X d S )"Nr   r   r9   rG   rM   rN   a)rP   rQ   	colStringeasyweightsrk   r:   rJ   z@Strings cannot be passed as weights when sampling from a Series.r+   r&   Zweight_columnzLStrings can only be passed to weights when sampling from rows on a DataFrame)r   r;   rI   z-'String passed to weights not a valid column'Znot_a_real_column_namer<   rO   rH   rQ   columnsZrowsr[   z)No axis named 2 for object type DataFramer   )r   rI   z2No axis named not_a_name for object type DataFrameZ
not_a_namez&No axis named 1 for object type Seriesr8   )r   r!   r    r   assert_frame_equalrK   r   r.   r/   r0   KeyError)	r   easy_weight_listdfsample1serr2   Zweights_less_than_1Zsecond_column_weightZweightr   r   r   r%      sp    
 
   
" zTestSampleDataFrame.test_samplec                 C   s|   dgd }d|d< t tddtdddgd d	}|jdd|d
}t||dg  t|jddd|jdddd d S )Nr   r&   r9   r   r   rM   rN   ri   rP   rQ   rj   rH   rj   *   r   )r   rI   r   )r   r!   r    r   rm   )r   ro   rp   rq   r   r   r   test_sample_axis1%  s    
 z%TestSampleDataFrame.test_sample_axis1c              	   C   s  t dddgdddgdddd	gd
}tdddgd	ddgd
}t|jd	g |jd|d tdddgd	ddgd
}t|jd	g |jd|d tddgd	dgd
}t|jd	g |jd|d tddgddgd
}tjtdd |jd|d W 5 Q R X d S )NrG   rJ      ri   bcrO   	   r&   )r[   r9   r   r;   gMbP?i'  r   g{Gz?r   rC   r+   )	r   r   r   rm   locr    r.   r/   r0   )r   rp   rr   Zser2Zser3Zser4r   r   r   %test_sample_aligns_weights_with_frame5  s    $z9TestSampleDataFrame.test_sample_aligns_weights_with_framec              	   C   sH   t tjdddddgd}|d}td  d|d< W 5 Q R X d S )	Nr   r&   ri   rw   rx   )rl   r9   d)r   r	   r
   r   r    r   Zassert_produces_warning)r   rp   Zdf2r   r   r   test_sample_is_copyK  s    
z'TestSampleDataFrame.test_sample_is_copyc                 C   s   t t jdt jg}| }tdddg}|j|d t|| tdddgdt jt jgd}|d  }|jdddd	 |d }t	|| d S )
Nr9   r   r&   rz   )r\   r;   r;   g      ?T)r   r   r;   )
r	   arrayrE   copyr   r    r   Zassert_numpy_array_equalr   Zassert_series_equal)r   rW   rX   rr   rp   r   r   r   #test_sample_does_not_modify_weightsT  s    z7TestSampleDataFrame.test_sample_does_not_modify_weightsc                 C   sR   t tddtdddgd d}|jddd}ttd}tj|j|dd	 d S )
Nr   rM   rN   ri   rs   r&   T)Zignore_index)exact)r   r!   r    r   r   Zassert_index_equalr[   )r   rp   rW   Zexpected_indexr   r   r   test_sample_ignore_indexf  s    z,TestSampleDataFrame.test_sample_ignore_indexN)	rd   re   rf   r%   ru   r|   r~   r   r   r   r   r   r   rh      s   U	rh   )Znumpyr	   r.   Zpandasr   r   r   Zpandas._testingZ_testingr   Zpandas.core.commoncorecommonrT   r   rh   r   r   r   r   <module>   s    @