U
    f/e}f                     @   s   d dl m Z  d dlZd dlZd dlmZ d dlZd dlmZm	Z	m
Z
mZmZmZmZ d dlmZ ejddddgd	d
d Zdd ZG dd dZdd Zdd Zdd Zdd Zdd Zdd ZdS )    )datetimeN)	is_scalar)	DataFrameDatetimeIndexSeriesStringDtype	Timestamp
date_rangeisnadefaultfloat_stringmixed_float	mixed_int)paramsc                 C   sT   | j dkr&ttjdddddgdS | j dkr4|S | j d	krB|S | j d
krP|S d S )Nr         ABCcolumnsr   r   r   )paramr   nprandomrandn)requestfloat_string_frameZmixed_float_frameZmixed_int_frame r   J/tmp/pip-unpacked-wheel-tiezk1ph/pandas/tests/frame/indexing/test_where.pywhere_frame   s    



r   c                    s&   dd  t t fdd|  D S )Nc                 S   s    t | jjtjtjfo| jdkS )NZuint8)
issubclassdtypetyper   integerZfloating)sr   r   r   is_ok#   s    z_safe_add.<locals>.is_okc                 3   s.   | ]&\}} |r||d  fn||fV  qdS )   Nr   ).0cr$   r%   r   r   	<genexpr>(   s     z_safe_add.<locals>.<genexpr>)r   dictitemsdfr   r)   r   	_safe_add!   s    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e	j
deeejgdd Ze	j
ddgdgdggedgdgdggeddddgidgdgdggedgejgedgggdd Ze	j
dddgddgddggeddgddgddggddgddgddggedddgdddgd ejedgedejged!ed!gggd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Z d6d7 Z!d8d9 Z"d:d; Z#d<d= Z$d>d? Z%d@dA Z&e	j
dBi dCdDigdEdF Z'dGdH Z(dIdJ Z)dDS )KTestDataFrameIndexingWherec              	   C   sV   ddd}|}||kr@d}t jt|d |dk W 5 Q R X d S |dk}||| d S )NTc           	      S   s   t | }| ||}| |j|}| D ]<\}}tt|| | | || |jd}tj||dd q*t	|| |r|j
| j
k std S )NindexF)Zcheck_names)r/   wherevaluesr,   r   r   r2   tmassert_series_equalassert_frame_equaldtypesallAssertionError)	r.   condcheck_dtypesother1rsZrs2kvexpr   r   r   
_check_get-   s    $z=TestDataFrameIndexingWhere.test_where_get.<locals>._check_get6'>' not supported between instances of 'str' and 'int'matchr   )Tpytestraises	TypeError)selfr   r   rB   r.   msgr;   r   r   r   test_where_get,   s    
z)TestDataFrameIndexingWhere.test_where_getc                 C   sn   t dd dD }d|jdd d f< |j}ttdtdtdtd	gdddd	gd
}t|| d S )Nc                 S   s    i | ]}|t d gd |dqS )r&   r   r!   )r   )r'   r(   r   r   r   
<dictcomp>G   s    zCTestDataFrameIndexingWhere.test_where_upcasting.<locals>.<dictcomp>)float32float64int32int64r   r&   rO   rP   rQ   rR   r1   )r   ilocr8   r   r   r!   r5   r6   rJ   r.   resultexpectedr   r   r   test_where_upcastingD   s     
z/TestDataFrameIndexingWhere.test_where_upcastingc              	   C   s   ddd}|}||kr@d}t jt|d |dk W 5 Q R X d S |dkdd  }|||t| |dk}|||t|j |dk}tdd	 |jD }|||tj|d
 d S )NTc                 S   s   |  ||}t|jD ]\}}|| }| | j}|| | | jdj}	t|rZ|}
n4t|t	j
rt|d d |f |jdj}
n
|| j}
|	 r|nt	 |	||
}t||j|d}tj||dd q|rt|t	j
s|j| jk std S )NFr1   )r2   name)Zcheck_dtype)r3   	enumerater   r4   reindexr2   fillnar   
isinstancer   Zndarrayr   r9   r5   r6   r8   r:   )r.   r;   otherr<   r>   ir?   rU   dr(   oZ
new_valuesrV   r   r   r   _check_align`   s    

zETestDataFrameIndexingWhere.test_where_alignment.<locals>._check_alignrC   rD   r   r&   c                 s   s   | ]}t |jtj V  qd S )N)r    r"   r   r#   )r'   r$   r   r   r   r*      s     zBTestDataFrameIndexingWhere.test_where_alignment.<locals>.<genexpr>)r<   )T)	rG   rH   rI   r/   r4   r9   r8   r   nan)rJ   r   r   ra   r.   rK   r;   r<   r   r   r   test_where_alignment^   s    
z/TestDataFrameIndexingWhere.test_where_alignmentc              	   C   s   t tjdddddgd}|dk}|d jdd	d d f }d
}tjt|d ||| W 5 Q R X |j	d d	d d f j}t
|}d}tjt|d ||| W 5 Q R X tjt|d |d W 5 Q R X tjt|d |d W 5 Q R X d S )Nr   r   r   r   r   r   r   r&      z4other must be the same shape as self when an ndarrayrD   ,Array conditional must be same shape as selfT)r   r   r   r   r4   rG   rH   
ValueErrorr3   rS   r/   mask)rJ   r.   r;   Zerr1rK   Zerr2r=   r   r   r   test_where_invalid   s    z-TestDataFrameIndexingWhere.test_where_invalidc              	   C   s   ddd}|}||kr@d}t jt|d |dk W 5 Q R X d S |dk}||| |dk}||| |dkdd  }||| d S )	NTc           	      S   s   |   }|| d}|| }|j|tjdd}|d ksBtt	|| |r| j
 D ]>\}}t|jtjr||  std}|| j|ks\tq\d S )NTinplacerP   )copyZreindex_liker[   rg   r3   r   rb   r:   r5   r7   r8   r,   r    r"   r#   r9   r!   )	r.   r;   r<   ZdfiZecondrV   return_valuer?   r@   r   r   r   
_check_set   s    
z=TestDataFrameIndexingWhere.test_where_set.<locals>._check_setrC   rD   r   r&   )TrF   )rJ   r   r   rm   r.   rK   r;   r   r   r   test_where_set   s    


z)TestDataFrameIndexingWhere.test_where_setc                 C   sR   t tdtddd}||d dk}||d dk |j}t|| d S )Nr         abrr   r&   )r   ranger3   rZ   r2   r5   r7   rT   r   r   r   test_where_series_slicing   s    z4TestDataFrameIndexingWhere.test_where_series_slicingklassc                 C   s   t ddddgi}dgdgdgg}t dtjddgi}|||}t|| d|d< dtjdg|d< ddgddgddgg}|||}t|| d S )Nrr   r&   rd   r   FTrs   )r   r   rb   r3   r5   r7   )rJ   rv   r.   r;   rV   rU   r   r   r   test_where_array_like   s    z0TestDataFrameIndexingWhere.test_where_array_liker;   r&   r   rd   r   rp   rr   TrueFalsez
2017-01-01z
2017-01-02c              	   C   s>   t ddddgi}d}tjt|d || W 5 Q R X d S )Nrr   r&   rd   r   (Boolean array expected for the conditionrD   r   rG   rH   rf   r3   rJ   r;   r.   rK   r   r   r   test_where_invalid_input_single   s    z:TestDataFrameIndexingWhere.test_where_invalid_input_singlero      	   rq   z
2017-01-03c              	   C   sF   t dddgdddgd}d}tjt|d || W 5 Q R X d S )Nr&   rd   r   rq   rz   rD   r{   r|   r   r   r   !test_where_invalid_input_multiple   s    z<TestDataFrameIndexingWhere.test_where_invalid_input_multiplec                 C   s   t dddgdddgg}t dddgdddgg}||}t d	tjdgtjtjdgg}t|| d
ddg|_||}t tj|j|jd}t|| d S )Nr&   rd   r   ro   r      TF      ?rr   rs   r(   r2   r   )r   r3   r   rb   r5   r7   r   r2   )rJ   r.   r;   rU   rV   r   r   r   test_where_dataframe_col_match
  s    

z9TestDataFrameIndexingWhere.test_where_dataframe_col_matchc              	   C   s   d}t dddgdddgg}dg}tjt|d	 || W 5 Q R X t dddgtjtjtjgg}|t|}t	|| t
d
dd
dg}tjt|d	 || W 5 Q R X t tjtjtjgdddgg}|t|}t	|| d S )Nre   r&   rd   r   ro   r   r   TrD   F)r   rG   rH   rf   r3   r   rb   r   r5   r7   array)rJ   rK   r.   r;   rV   outr   r   r   test_where_ndframe_align  s    z3TestDataFrameIndexingWhere.test_where_ndframe_alignc                 C   s   t ddddgddddgddd}t tjtjddgddtjtjgddd}||dktj}t|| | }|j|dktjd	d
}|d kstt|| d S )Nr          @      @      @rq   rP   rM   rd   Tri   )r   r   rb   r3   r5   r7   rk   r:   )rJ   r.   rV   rU   rl   r   r   r   test_where_bug.  s      z)TestDataFrameIndexingWhere.test_where_bugc                 C   s   t tjddddg|dtjdddd	gd
dd}t tjtjddgddtjtjgdd
d}||dktj}t|| | }|j|dktjdd}|d kstt|| d S )Nr&   rd   r   ro   rM   r   r   r   r   rP   rq   Tri   )	r   r   r   rb   r3   r5   r7   rk   r:   )rJ   Z
sint_dtyper.   rV   rU   rl   r   r   r   test_where_bug_mixed?  s     z/TestDataFrameIndexingWhere.test_where_bug_mixedc                 C   s   t ddgddgddgd}t tjdgd	tjgtjtjgd}| ||kB }| }||| < |||}t|| t ddgdd
gd}t tjdgdtjgd}| ||kB }| }||| < |||}t|| d S )Nr&   rd   r   ro   r   r   )r   r&   rd   r~   r   r   r   r&   )r   r   rb   r
   rk   r3   r5   r7   )rJ   rr   rs   Zdo_not_replacerV   rU   r   r   r   test_where_bug_transpositionU  s    $

z7TestDataFrameIndexingWhere.test_where_bug_transpositionc              	   C   s   t tdddtdddtjdd}tddd}d	}tjt|d
 ||k W 5 Q R X ||j	d d d df |k }|
 }tj|jddgdf< tj|jd d df< t|| d S )NZ20130102r   )ZperiodsZ20130104r   r   r   i  r&   r   zF'>' not supported between instances of 'float' and 'datetime.datetime'rD   r   r   r   )r   r	   r   r   r   r   rG   rH   rI   rS   rk   rb   locr5   r7   )rJ   r.   ZstamprK   rU   rV   r   r   r   test_where_datetimek  s    


z.TestDataFrameIndexingWhere.test_where_datetimec                 C   s   t dttdit}d ||dk< t dtdddddd	d
dtjtjg
i}t|| t dtjddtjdtjdg}d}t	j
t|d |jt| d dd W 5 Q R X d S )NZseries
   rp   r   r&   rd   r   ro   r   r   ZTestr   zboolean setting on mixed-typerD   Tri   )r   r   rt   astypefloatr   rb   r5   r7   rG   rH   rI   r3   r
   )rJ   r.   rV   rK   r   r   r   test_where_none  s    "z*TestDataFrameIndexingWhere.test_where_nonec                 C   s<   t dgd}|}|jtk s"t||}t|| d S )Nrr   r   )r   r8   objectr9   r:   r3   r5   r7   )rJ   r.   r;   rU   r   r   r   9test_where_empty_df_and_empty_cond_having_non_bool_dtypes  s
    
zTTestDataFrameIndexingWhere.test_where_empty_df_and_empty_cond_having_non_bool_dtypesc                 C   s   dd }| }| | }|jt|| dd}t|| |jt|| ddd}|d ksjtt|| |  d}|jdd	 |d d
}|j|dk|d dd}t|| |j|dk|d dd}t|| | }| d}|t|t	d|j
|jd}t|| d S )Nc                  S   sR   t tjdd} tj| jdddf< tj| jdddf< tj| jddd	f< | S )
Nr   r   r   r   ro   r   r&   r~   rd   )r   r   r   r   rb   rS   r-   r   r   r   create  s
    z;TestDataFrameIndexingWhere.test_where_align.<locals>.creater   axisTrj   r   r   c                 S   s   |  | dk|S )Nr   )r3   )xyr   r   r   <lambda>      z=TestDataFrameIndexingWhere.test_where_align.<locals>.<lambda>)r   r2   Zrowsr&   r   )r[   Zmeanr3   pdZnotnar5   r7   r:   applyr   r2   r   )rJ   r   r.   rV   rU   rl   r   r   r   test_where_align  s*    
 z+TestDataFrameIndexingWhere.test_where_alignc                 C   s\   t ddgtjdggddgd}t ddgddggddgd}tj|| dk< t|| d S )	Ny      ?      ?rd   y      @      ?rr   rs   r   y      @      ?r   )r   r   rb   absr5   r7   )rJ   rV   r.   r   r   r   test_where_complex  s    z-TestDataFrameIndexingWhere.test_where_complexc                 C   s>  t tjdd}t ddgddgg}tddg}t ddgddggdd}|j||dd}t|| | }|j||dd	d
}|d kst	t|| t ddgddggdd}|j||dd}t|| | }|j||dd	d
}|d kst	t|| t ddgddggdd}t ddgddgg}tdtj
g}t ddgtj
tj
ggdd}|j||dd}t|| | }|j||dd	d
}|d kst	t|| t dtj
gdtj
gg}|j||dd}t|| t tjddgddtjtj
tj
gddd}| }|j||dd	d
}|d ks.t	t|| d S )Nrd   Fr   r&   rP   rM   r2   r   Tr   rj   r   r   ro   rR   r   )r   r   r   r   r   r3   r5   r7   rk   r:   rb   r   )rJ   r.   rg   r$   rV   rU   rl   r   r   r   test_where_axis  sN    z*TestDataFrameIndexingWhere.test_where_axisc           
      C   s  t jttjddttjjddddddgdd	d
}td|j|jd}t	d	|jd}t	d|jd}|j
||dd}td|j|jd}|d d|d< |d d|d< t|| | }|j
||ddd}|d kstt|| |j
||dd}td|j|jd}|d d|d< |d d|d< t|| | }|j
||ddd}|d ksdtt|| | jd	dd}| }tj|jd	d d f< |
||}t|| |j
||dd}t|| | }|j
||dd}|d kstt|| | }|j
||ddd}|d ks,tt|| | jd	d	d}	| }tj|jd d d	f< |
||	}t|| |j
||	dd}t|| | }|j
||	dd}|d kstt|| | }|j
||	ddd}|d kstt|| d S )Nr   rd   r   )r   rd   )sizerR   rM   Tr&   )Zignore_indexr   F)r   r2   r1   r   r   r   r   r   r2   r   ri   r   )r   concatr   r   r   r   randintr   r2   r   r3   r   r5   r7   rk   r:   Zdroprb   r   )
rJ   r.   rg   s1s2rU   rV   rl   d1Zd2r   r   r   test_where_axis_multiple_dtypes  st    z:TestDataFrameIndexingWhere.test_where_axis_multiple_dtypesc                 C   sH  t dddgdddgddd	gg}|d
d dd }t dddgdddgddd	gg}t|| t|||dk|d  |dd dd }t dddgdddgdddgg}t|| t|||d dkd |d dd dd }t dddgdddgd	ddgg}t|| t||d |d dk|d d  d S )Nr&   rd   r   ro   r   r   rp   r~   r   c                 S   s   | dkS )Nro   r   r   r   r   r   r   H  r   z@TestDataFrameIndexingWhere.test_where_callable.<locals>.<lambda>c                 S   s   | d S )Nr&   r   r   r   r   r   r   H  r   c                 S   s   | d dkj S )Nrd   r   )r4   r   r   r   r   r   N  r   c                 S   s   dS )Nc   r   r   r   r   r   r   N  r   r   r   c                 S   s   | dkS )Nr~   r   r   r   r   r   r   T  r   c                 S   s   | d S )Nr   r   r   r   r   r   r   T  r                     r      )r   r3   r5   r7   )rJ   r.   rU   rA   r   r   r   test_where_callableE  s        z.TestDataFrameIndexingWhere.test_where_callablec                 C   s   t tdddg|ddgd}t tdddg|ddgd}t d	d	d
gdgd}t tdddg|ddgd}|||}t|| d S )NZ20150101Z20150102Z20150103)tzdater   Z20150104Z20150105TF)r   r   r3   r5   r7   )rJ   Ztz_naive_fixtureZdf1Zdf2rg   rA   rU   r   r   r   test_where_tz_valuesY  s    z/TestDataFrameIndexingWhere.test_where_tz_valuesc                 C   sz   t tdddtdd}tdddgdddgg}||}t dtjtjgtjtjd	ggtdd}t	|| d S )
Nr   rd   r   ABCr   TFr   r   )
r   r   arangereshapelistr   r3   rb   r5   r7   )rJ   r.   rg   rU   rV   r   r   r   test_df_where_change_dtypej  s    
 z5TestDataFrameIndexingWhere.test_df_where_change_dtypekwargsr]   Nc           	      C   s  t tdddtdd}tdddgdddgg}|jd|_|jd|_|j	d|_	|j
|f|}tjd	tjgd	dgd
}tjtjtjgddgd
}tjtjdgddgd
}t |||d}t|| |jj
|d d d	f f|}t|dd}t|| d S )Nr   rd   r   r   r   TFcategoryr   )
categoriesr&   ro   r   r   r   )rX   )r   r   r   r   r   r   r   r   r   r   r3   r   ZCategoricalrb   r5   r7   r   r6   )	rJ   r   r.   rg   rU   r   r   r   rV   r   r   r   test_df_where_with_categoryv  s    z6TestDataFrameIndexingWhere.test_df_where_with_categoryc                 C   sl   t ddgddggddgd}|d d|d< ||d dk}| }tj|jdd d f< t|| d S )Nr   r&   rr   rs   )datar   r   )	r   r   r3   rk   r   rb   r   r5   assert_equalrT   r   r   r    test_where_categorical_filtering  s    z;TestDataFrameIndexingWhere.test_where_categorical_filteringc                 C   s   t dddgdddgd}tdtjd	g}t|}tj|jtd
}d|dd d f< |j	||dd}t dtjdgdtjdgd
t}t|| t|d d ddgd}t dddgdtjdgd}|d 
t|d< |j	||dd}t|| d S )Nr&   rd   r   ro   r   r   r   r   rp   r   rM   Fr   r   r   r   r1   )r   r   r   NAr   r   Zonesshapeboolr3   r   r   r5   r7   )rJ   r.   ZarrZserrg   rU   rV   Zser2r   r   r   test_where_ea_other  s    $z.TestDataFrameIndexingWhere.test_where_ea_other)*__name__
__module____qualname__rL   rW   rc   rh   rn   ru   rG   markZparametrizer   tupler   r   rw   r   r   r   r   NaTr}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r0   +   sd   2$



	!5G
r0   c              	   C   sT   t tjdd}| t k	r"|d }|dk}tt |j|ddd W 5 Q R X d S )Nro   r   r   r   F)Ztry_cast)r   r   r   r   r5   assert_produces_warningFutureWarningr3   )frame_or_seriesobjrg   r   r   r   test_where_try_cast_deprecated  s    r   c                 C   s~   | ddddg}|  }| tkr(|d n|}||dk }|d9 }t|| ||dkddddg}|d9 }t|| d S )Nr&   rd   r   ro   r   r   )rk   r   r3   r5   r   )r   rU   rV   colZ	where_resr   r   r   test_where_copies_with_noop  s    r   c                 C   s   | ddddgddddgt  d	}| ddgddgt  d	}td
ddd
g}|||}| tjddtjgddddgt  d	}t|| d S )Nrr   rs   r(   r_   Zid1Zid2Zid3Zid4)r2   r!   FT)r   r   r3   r   r   r5   r   )r   r   Zfiltered_objZ
filter_serrU   rV   r   r   r   test_where_string_dtype  s$    
 
   
r   c                  C   sv   t dgd dgd ddddgd} | | dk}t tjtjgd tddgd tjdtjdgd}t|| d S )NTro   F)ZAAAZBBBZCCCrM   )r   r3   r   r   rb   r   r5   r7   )Zdf_maskrU   rV   r   r   r   test_where_bool_comparison  s    r   c                  C   sF   t tdtjtdgddtjgd} | |  d }t	||  d S )NZ20130101Z20130103r&   rd   r   )
r   r   r   r   r   rb   r3   Znotnullr5   r7   )rV   rU   r   r   r   test_where_none_nan_coerce  s    
r   c               	   C   s^   t td} d}tjt|d | | dkdd}W 5 Q R X t ddddd	g}t|| d S )
Nr   zIn a future version of pandas all arguments of DataFrame.where except for the arguments 'cond' and 'other' will be keyword-onlyrD   r&   r   Frd   r   ro   )r   rt   r5   r   r   r3   r7   )r$   rK   rU   rV   r   r   r   "test_where_non_keyword_deprecation  s    r   )r   Znumpyr   rG   Zpandas.core.dtypes.commonr   Zpandasr   r   r   r   r   r   r	   r
   Zpandas._testingZ_testingr5   Zfixturer   r/   r0   r   r   r   r   r   r   r   r   r   r   <module>   s*   $	

     