B
    x\G              	   @   s~  d dl mZ d dlZd dlZd dlmZmZ d dlZd dl	m
Z
 d dlZd dlmZmZ d dlmZmZ d dlmZ d dlm  mZ d dlmZmZmZmZ d d	lmZ ee
d
dedddZ ee
ddedddZ!ee d " e d #de d #de d #ddZ$ee!d " e!d #de!d #de!d #ddZ%eej&j'ddddedddZ(eej&j'ddddedddZ)edd ede* ee+e " e " d e " e " d Z,ee+e!" e!" d e!" e!" d Z-ee+e(e(d! #dd"Z.ee+e)e)d! #dd"Z/ee+e$e$d d"Z0ee+e%e%d d"Z1W dQ R X ej2j3ej4 d#d$G d%d& d&e5Z6dS )'    )print_functionN)catch_warningssimplefilter)randn)_np_version_under1p13compat)	DataFramePanel)expressions)assert_almost_equalassert_frame_equalassert_panel_equalassert_series_equal)pprint_thingi'     ZABCDZfloat64)columnsdtyped   ABZfloat32CZint64DZint32)r   r   r   r      )i'  r   )size)e   r   T)recordignore   )ItemAItemBZItemCZItemD"   )r   r   znot using numexpr)reasonc               @   s  e Zd Zdd Zdd ZdNddZd	d
 ZdddddddhfddZdOddZdPddZ	dde
fddZdd Zdd Zejjejddd  Zd!d" Zd#d$ Zejjejdd%d& Zd'd( Zd)d* Zejjejdd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!ej"d?e#d@dAdBdCgd@dAdBdCggdDdEdFdGgdHe#ddgddggdDdGgdHfe#d@dIdBdCgd@dJdBdCgd@dAdAdKggdDdEdFdGgdHe#ddgddgddggdDdGgdHfgdLdM Z$dS )QTestExpressionsc             C   s>   t  | _t | _t | _t | _t	 | _
tj| _d S )N)_framecopyframe_frame2frame2_mixedmixed_mixed2mixed2_integerintegerexpr_MIN_ELEMENTS)selfmethod r2   <lib/python3.7/site-packages/pandas/tests/test_expressions.pysetup_method?   s    




zTestExpressions.setup_methodc             C   s   | j t_ d S )N)r/   r.   )r0   r1   r2   r2   r3   teardown_methodH   s    zTestExpressions.teardown_methodFTc          	      s   dt _ddddddg}tjs&|d x|D ]  } dkr@d}|rZ fd	d
} |_n
tt|}t d ||}	t d ||}
y*|r dkr|	j	j
dkst||	|
 W q, tk
r   td|j   Y q,X q,W d S )Nr   addsubmulmodtruedivfloordivdivc                s   t  |S )N)getattr)xy)arithdfr2   r3   <lambda>X   s    z0TestExpressions.run_arithmetic.<locals>.<lambda>FTfzFailed test with operator %r)r.   r/   r   PY3append__name__r=   operatorset_use_numexprr   ZkindAssertionError	Exceptionr   )r0   rA   otherassert_funccheck_dtype	test_flex
operationsZoperator_nameopexpectedresultr2   )r@   rA   r3   run_arithmeticK   s0    






zTestExpressions.run_arithmeticc             C   sH   |  | j| jt | j | jjd d df | jjd d df tdd d S )Nr   T)rM   )rS   r-   r   ilocr   )r0   r2   r2   r3   test_integer_arithmeticj   s
    z'TestExpressions.test_integer_arithmeticgtltgeleeqnec          	      s   dt _t d ddddddg}x|D ] |rD fd	d
} |_n
tt }t d ||}t d t   ||}	t  }
y0 |kr|
stdn|
rtd|||	 W q& t	k
r   t
d   t
d|   Y q&X q&W dS )z
        tests solely that the result is the same whether or not numexpr is
        enabled.  Need to test whether the function does the correct thing
        elsewhere.
        r   TrV   rW   rX   rY   rZ   r[   c                s   t  |S )N)r=   )r>   r?   )r@   rA   r2   r3   rB   ~   s    z,TestExpressions.run_binary.<locals>.<lambda>Fz Did not use numexpr as expected.zUsed numexpr unexpectedly.zFailed test with operation %rztest_flex was %rN)r.   r/   Zset_test_moderF   r=   rG   rH   Zget_test_resultrI   rJ   r   )r0   rA   rK   rL   rN   Znumexpr_opsrO   rP   rQ   rR   Zused_numexprr2   )r@   rA   r3   
run_binaryq   s.    






zTestExpressions.run_binaryNc             K   s   | j ||tfddi| | j ||tfddi| |r|d kr\td |d }td | j||tfddi| | j||tfddi| d S )NrN   FTr   )rS   r   r.   rH   r\   )r0   rA   rK   binary_compr\   kwargsr2   r2   r3   	run_frame   s    

zTestExpressions.run_framec             K   s8   | j ||tfddi| | j ||tfddi| d S )NrN   FT)rS   r   r   )r0   ZserrK   r]   r^   r2   r2   r3   
run_series   s    zTestExpressions.run_seriesc             K   s   | j |||fddi| | j |||fddi| |r||d krH|d }| j|||fddi| | j|||fddi| d S )NrN   FTr   )rS   r\   )r0   ZpanelrK   r]   r\   rL   r^   r2   r2   r3   	run_panel   s    zTestExpressions.run_panelc             C   s   |  | j| j d S )N)r_   r-   )r0   r2   r2   r3   test_integer_arithmetic_frame   s    z-TestExpressions.test_integer_arithmetic_framec             C   s0   |  | jjd d df | jjd d df  d S )Nr   )r`   r-   rT   )r0   r2   r2   r3   test_integer_arithmetic_series   s    z.TestExpressions.test_integer_arithmetic_serieszignore:\nPanel:FutureWarningc             C   s   |  ttjdd d S )Nr   r   )ra   _integer2_panelnprandomrandint)r0   r2   r2   r3   test_integer_panel   s    z"TestExpressions.test_integer_panelc             C   s   |  | j| j d S )N)r_   r'   )r0   r2   r2   r3   test_float_arithemtic_frame   s    z+TestExpressions.test_float_arithemtic_framec             C   s0   |  | jjd d df | jjd d df  d S )Nr   )r`   r'   rT   )r0   r2   r2   r3   test_float_arithmetic_series   s    z,TestExpressions.test_float_arithmetic_seriesc             C   s   | j ttj d dd d S )Ng?g?)r]   )ra   _frame2_panelre   rf   r   )r0   r2   r2   r3   test_float_panel   s    z TestExpressions.test_float_panelc             C   s   | j | j| jdd d S )NF)r\   )r_   r+   )r0   r2   r2   r3   test_mixed_arithmetic_frame   s    z+TestExpressions.test_mixed_arithmetic_framec             C   s2   x,| j jD ] }| j| j | | j | dd q
W d S )Nr   )r]   )r+   r   r`   )r0   colr2   r2   r3   test_mixed_arithmetic_series   s    z,TestExpressions.test_mixed_arithmetic_seriesc             C   s   | j ttjdddd d S )Nr   r   )r]   )ra   _mixed2_panelre   rf   rg   )r0   r2   r2   r3   test_mixed_panel   s    z TestExpressions.test_mixed_panelc             C   sH   |  | j| jt | j | jjd d df | jjd d df tdd d S )Nr   T)rM   )rS   r%   r   rT   r   )r0   r2   r2   r3   test_float_arithemtic   s    (z%TestExpressions.test_float_arithemticc             C   sB   |  | j| jt x*| jjD ]}|  | j| | j| t qW d S )N)rS   r)   r   r   r   )r0   rn   r2   r2   r3   test_mixed_arithmetic   s    z%TestExpressions.test_mixed_arithmeticc             C   sh   |  j tjjddt| j d9  _ | | j | j t | | j jd d df | j jd d df t d S )Nr      )r   )	r-   re   rf   rg   shaperS   r   rT   r   )r0   r2   r2   r3   test_integer_with_zeros   s
    $z'TestExpressions.test_integer_with_zerosc             C   s   t tjd | j| jd}|r tt tjd| j| jd}|r@tt tjd| j| jd}|r`tt tjd| j| jd}|std S )Nevaluate+)r.   _can_use_numexprrG   r6   r%   rI   r)   r'   )r0   rR   r2   r2   r3   test_invalid   s    



zTestExpressions.test_invalidc                sH    fdd}t d |  t d t d |  t   |  d S )Nc           	      s   x j  jf j jfgD ]\} }xdD ]\}}|dkr:q(|dkrPttdd }ntt|d }|d k	r(t||| | d}|| jkst	tj
||| | dd}tj
||| | dd}t|trt|| nt||j t||||d}|r(t	q(W qW d S )	N))r6   ry   )r7   -)r8   *)r<   /)powz**r   r<   r:   rx   T)use_numexprF)r%   r'   r)   r+   r=   rG   r.   rz   _is_mixed_typerI   rx   
isinstancer   tmr   assert_numpy_array_equalvalues)rC   f2rP   op_strrR   rQ   )r0   r2   r3   testit  s.    
z/TestExpressions.test_binary_ops.<locals>.testitFTr   )r.   rH   set_numexpr_threads)r0   r   r2   )r0   r3   test_binary_ops  s    #


zTestExpressions.test_binary_opsc                sH    fdd}t d |  t d t d |  t   |  d S )Nc        
   	      s   x j  jf j jfgD ]\} }| }| d }|}|d }xdD ]\}}tt|}t||||d}||jksrt	tj
||||dd}tj
||||dd}	t|trt||	 nt||	j t||||d}|r@t	q@W qW d S )Nr   ))rV   >)rW   <)rX   z>=)rY   z<=)rZ   z==)r[   z!=rx   T)r   F)r%   r'   r)   r+   r=   rG   r.   rz   r   rI   rx   r   r   r   r   r   r   )
rC   r   Zf11Zf12Zf21Zf22rP   r   rR   rQ   )r0   r2   r3   r   9  s*    

z0TestExpressions.test_boolean_ops.<locals>.testitFTr   )r.   rH   r   )r0   r   r2   )r0   r3   test_boolean_ops8  s     


z TestExpressions.test_boolean_opsc                sH    fdd}t d |  t d t d |  t   |  d S )Nc                 s   x~ j  j j jgD ]f} x`dD ]X}tj| jtjd}|| t	
|| j| jd }t
|| j| jd }t|| q W qW d S )N)TF)r   r   )r%   r'   r)   r+   re   emptyrv   Zbool_Zfillr.   wherer   r   r   )rC   ZcondcrR   rQ   )r0   r2   r3   r   b  s    

z*TestExpressions.test_where.<locals>.testitFTr   )r.   rH   r   )r0   r   r2   )r0   r3   
test_wherea  s    


zTestExpressions.test_wherec       	   
   C   sX  t tjddktjddkd}d}d}d}xt||D ]\}}tjrX|dkr@tt|}t	
|| }tjt|d ||| W d Q R X tjt|d ||j|j W d Q R X tjt|d ||jd	 W d Q R X tjt|d |d
|j W d Q R X tjt|d |d
| W d Q R X tjt|d ||d	 W d Q R X q@W d S )N
   g      ?)ab)r<   r:   r;   r   )r~   r~   z//z**z+operator %r not implemented for bool dtypesr<   )matchTF)r   re   rf   randzipr   rD   r=   rG   reescapepytestZraisesNotImplementedErrorr   r   )	r0   rA   namesopsmsgrP   namerC   Zerr_msgr2   r2   r3   !test_bool_ops_raise_on_arithmeticu  s*    
z1TestExpressions.test_bool_ops_raise_on_arithmeticc             C   s  d}t tj|dktj|dkd}d}d}dddd}d	d
dd}xt||D ]\}}tt|}	tt|||  }
|dkrtsqXtj	dddf tj
dd& |	||}|
||}t|| W d Q R X tj
dd. |	|j|j}|
|j|j}t|| W d Q R X tj
dd* |	|jd}|
|jd}t|| W d Q R X tj
dd* |	d|j}|
d|j}t|| W d Q R X tj
dd& |	d|}|
d|}t|| W d Q R X tj
dd& |	|d}|
|d}t|| W d Q R X W d Q R X qXW d S )Nr   g      ?)r   r   )r6   r8   r7   )ry   r}   r|   |&^or_and_xor)r   r   r   r|   T   )Zmin_elementsF)Zcheck_stacklevel)r   re   rf   r   r   r=   rG   r   r   r   Zassert_produces_warningr   r   r   r   )r0   nrA   r   r   ZsubsZ	sub_funcsrP   r   rC   Zferer2   r2   r3    test_bool_ops_warn_on_arithmetic  sJ    






z0TestExpressions.test_bool_ops_warn_on_arithmeticztest_input,expectedr   r   ru   Zaar   r   r   r   )r   r   r   Zbbc             C   s<   |j d d ddgf |j d d ddgf }t|| d S )Nr   r   )Zlocr[   r   )r0   Z
test_inputrQ   rR   r2   r2   r3   test_bool_ops_column_name_dtype  s    z/TestExpressions.test_bool_ops_column_name_dtype)FT)NT)N)%rF   
__module____qualname__r4   r5   rS   rU   r\   r_   r`   r   ra   rb   rc   r   markZslowfilterwarningsrh   ri   rj   rl   rm   ro   rr   rs   rt   rw   r{   r   r   r   r   r   Zparametrizer   r   r2   r2   r2   r3   r"   <   sR   	 
!

,)/"r"   )7Z
__future__r   rG   r   warningsr   r   Znumpyre   Znumpy.randomr   r   Zpandasr   r   Zpandas.core.apir   r	   Zpandas.core.computationr
   r.   Zpandas.util.testingutilZtestingr   r   r   r   r   Zpandas.io.formats.printingr   listr#   r&   r$   Zastyper(   r*   rf   rg   r,   Z	_integer2FutureWarningdictZ_frame_panelrk   Z_integer_panelrd   Z_mixed_panelrq   r   ZskipifZ_USE_NUMEXPRobjectr"   r2   r2   r2   r3   <module>   s\   





