U
    >vf5                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlm	Z
 d dlmZmZmZ d dlmZ ejdd Zejdd Zejd	d
 Zejdd Zejdd Zejdd Zejdd Zejdd Zejdd Zejdd Zejdd Zejjej  ddG dd dZ!dS )    N)option_context)	DataFrameIndexSeries)expressionsc                   C   s   t tjddtdddS )N'     ABCDfloat64columnsdtyper   nprandomrandnlist r   r   A/tmp/pip-unpacked-wheel-vdrwu74i/pandas/tests/test_expressions.py_frame   s    r   c                   C   s   t tjddtdddS )Nd   r   r	   r
   r   r   r   r   r   r   _frame2   s    r   c                 C   s8   t | d  | d d| d d| d ddS 	NABZfloat32Cint64DZint32)r   r   r   r   r   copyZastyper   r   r   r   _mixed   s    
r!   c                 C   s8   t | d  | d d| d d| d ddS r   r   r   r   r   r   _mixed2(   s    
r#   c                   C   s    t tjjddddtdddS )N   r   )r   r   sizer	   r   r   r   r   r   randintr   r   r   r   r   _integer4   s
      r)   c                 C   s   | t jjddt | d S )Nr      r%   )r   r   r(   shape)r)   r   r   r   _integer_randint;   s    r,   c                   C   s    t tjjddddtdddS )Nr$   r   )e   r   r%   r	   r   r   r'   r   r   r   r   	_integer2A   s
      r.   c                 C   s   | d j  S Nr   valuesr   r    r   r   r   _arrayH   s    r2   c                 C   s   | d j  S r/   r0   r"   r   r   r   _array2M   s    r3   c                 C   s   | d j  S Nr   r0   )r!   r   r   r   _array_mixedR   s    r5   c                 C   s   | d j  S r4   r0   )r#   r   r   r   _array_mixed2W   s    r6   znot using numexpr)reasonc                   @   s  e Zd Zejdddd ZeeedddZ	ej
dd	d
dddddgej
dddgej
dddddddgdd Zej
dd	d
dddddgej
dddgdd Zdd Zej
dej
d d!d"d#d$d%gej
d&d'd(gd)d* Zej
d&d'd(gd+d, Zej
d-ddgej
dddddgd.d/ Zej
d0d1d2d3gd4d5 Zej
d0d6d7d8gd9d: Zej
d;ed<d=d>d?gd<d=d>d?ggd@dAdBdCgdDeddgddggd@dCgdDfed<dEd>d?gd<dFd>d?gd<d=d=dGggd@dAdBdCgdDeddgddgddggd@dCgdDfgdHdI Zej
ddJej
dKdLdMdN Zej
dOdPdQdRdSgej
dTeeegej
dUdVdWgdXdY ZdZS )[TestExpressionsT)Zautousec                 c   s   t j}d V  |t _d S N)expr_MIN_ELEMENTS)selfmin_elementsr   r   r   save_min_elements^   s    z!TestExpressions.save_min_elements)flexopnamec              	      s\   |r fdd} |_ n
tt }tdd || |}W 5 Q R X t  || |}||fS )Nc                    s   t |  |S r9   )getattr)xyr@   r   r   <lambda>g       z)TestExpressions.call_op.<locals>.<lambda>compute.use_numexprF)__name__rA   operatorr   r:   get_test_result)dfotherr?   r@   opexpectedresultr   rD   r   call_opd   s    

zTestExpressions.call_opfixturer)   r.   r,   r   r   r!   r#   r?   Farithaddsubmulmodtruedivfloordivc           	      C   s   | |}dt_| ||||\}}|dkrFtdd |jjD sFtt	|| t
t|jD ]X}| |jd d |f |jd d |f ||\}}|dkr|jjdkstt	|| q`d S )Nr   rW   c                 s   s   | ]}|j d kV  qdS )fN)kind).0rB   r   r   r   	<genexpr>   s     z6TestExpressions.test_run_arithmetic.<locals>.<genexpr>rY   )getfixturevaluer:   r;   rP   allZdtypesr1   AssertionErrortmassert_equalrangelenr   ilocr   rZ   )	r<   requestrQ   r?   rR   rK   rO   rN   ir   r   r   test_run_arithmetict   s    
0z#TestExpressions.test_run_arithmeticc              	   C   sz   | |}|j}tdd | d }W 5 Q R X dt_td | ||||\}}	t }
|
sjt	dt
|	| 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.
        rG   Fr$   r   Tz Did not use numexpr as expected.N)r]   rH   r   r   r:   r;   Zset_test_moderP   rJ   r_   r`   ra   )r<   re   rQ   r?   comparison_oprK   rR   rL   rO   rN   Zused_numexprr   r   r   test_run_binary   s    

zTestExpressions.test_run_binaryc                 C   sp   t jd}t jd}ttjd ||d}|r4tttjd||d}|rPtttjd||d}|sltd S )NiAB r   evaluate+)r   r   r   r:   _can_use_numexprrI   rS   r_   )r<   arrayZarray2rO   r   r   r   test_invalid   s    zTestExpressions.test_invalidz>ignore:invalid value encountered in true_divide:RuntimeWarningzopname,op_str)rS   rk   )rT   -)rU   *)rW   /)pow**zleft_fix,right_fix)r2   r3   )r5   r6   c              	      sd   | | | | fdd}tdd |  W 5 Q R X td |  t  |  d S )Nc               	      s   dkrd S t t} t < d}td|t tj|   dd}tj|   dd}W 5 Q R X t	|| t
| d}|rtd S )Nrr   z/invalid value encountered in divide|true_divideignoreTuse_numexprFrj   )rA   rI   warningscatch_warningsfilterwarningsRuntimeWarningr:   rj   r`   assert_numpy_array_equalrl   r_   )rM   msgrO   rN   leftop_strr@   rightr   r   testit   s    

z/TestExpressions.test_binary_ops.<locals>.testitrG   Fr$   r]   r   r:   Zset_numexpr_threads)r<   re   r@   r   left_fix	right_fixr   r   r}   r   test_binary_ops   s    


zTestExpressions.test_binary_opsc              	      sb   | || | fdd}tdd |  W 5 Q R X td |  t  |  d S )Nc                     sb   d } d } }t j|| dd}t j|| dd}t|| t |||d}|r^td S )Nr$   Tru   Frj   )r:   rj   r`   r{   rl   r_   )Zf12Zf22rM   rO   rN   rh   r~   r   r   r   r      s    z3TestExpressions.test_comparison_ops.<locals>.testitrG   Fr$   r   )r<   re   rh   r   r   r   r   r   r   test_comparison_ops   s    


z#TestExpressions.test_comparison_opscondc              	      sV   | | fdd}tdd |  W 5 Q R X td |  t  |  d S )Nc                     sX   t jjt jd} |   t| jjd }t | jjd }t	|| d S )N)r   r$   )
r   emptyr+   Zbool_fillr:   wherer1   r`   r{   )crO   rN   r   rK   r   r   r     s
    
z*TestExpressions.test_where.<locals>.testitrG   Fr$   r   )r<   re   r   rQ   r   r   r   r   
test_where  s    

zTestExpressions.test_wherezop_str,opname)rq   rW   )z//rX   )rs   rr   c              	   C   s*  t tjddktjddkd}d| d}tt|}t|}tj	t
|d ||| W 5 Q R X tj	t
|d ||j|j W 5 Q R X tj	t
|d ||jd W 5 Q R X tj	t
|d |d|j 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 )	N
         ?abz
operator 'z!' not implemented for bool dtypes)matchTF)r   r   r   randrA   rI   reescapepytestZraisesNotImplementedErrorr   r   )r<   r   r@   rK   r|   rY   err_msgr   r   r   !test_bool_ops_raise_on_arithmetic"  s     &

z1TestExpressions.test_bool_ops_raise_on_arithmetic)rk   rS   )rp   rU   )ro   rT   c              
   C   s  d}t tj|dktj|dkd}dddd}dd	d
d}tt|}tt|||  }|dkrjd S tjdddN t & |||}	|||}
t	|	|
 W 5 Q R X t . ||j
|j}	||j
|j}
t|	|
 W 5 Q R X t * ||j
d}	||j
d}
t|	|
 W 5 Q R X t * |d|j
}	|d|j
}
t|	|
 W 5 Q R X t & |d|}	|d|}
t	|	|
 W 5 Q R X t & ||d}	||d}
t	|	|
 W 5 Q R X W 5 Q R X d S )Nr   r   r   |&^)rk   rp   ro   or_and_xor)r   r   r   ro   T   )r=   F)r   r   r   r   rA   rI   r`   rv   Zassert_produces_warningassert_frame_equalr   r   Zassert_series_equal)r<   r   r@   nrK   subsZ	sub_funcsrY   Zferer   r   r    test_bool_ops_warn_on_arithmetic>  sB    &












z0TestExpressions.test_bool_ops_warn_on_arithmeticztest_input,expectedr   r$   r*   Zaar   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   )locner`   r   )r<   Z
test_inputrN   rO   r   r   r   test_bool_ops_column_name_dtypen  s    .z/TestExpressions.test_bool_ops_column_name_dtype)rS   rT   rU   rV   rW   rX   axis)r   r$   c           	   	   C   s   |}|dkr |j dd d f }n|j d d df }dt_t||}tdd |||d}W 5 Q R X |||d}t|| d S )Nr$   r   rG   F)r   )rd   r:   r;   rA   r   r`   r   )	r<   r   rR   r   rK   rL   Zop_funcrN   rO   r   r   r   test_frame_series_axis  s    
z&TestExpressions.test_frame_series_axisrM   __mod____rmod____floordiv____rfloordiv__boxscalarr   c              	   C   s   dt _tdd}||}t||}||}tdd ||}W 5 Q R X t|| t|D ]`\}	}
|t	kr~|j
|	df }n||	 }ztt|
||}W n tk
r   Y q^X ||ks^tq^d S )Nr   i2   rG   F)r:   r;   r   ZarangerA   r   r`   ra   	enumerater   rd   intZeroDivisionErrorr_   )r<   rM   r   r   dataobjmethodrO   rN   rf   elemZscalar_resultr   r   r   ,test_python_semantics_with_numexpr_installed  s"    
z<TestExpressions.test_python_semantics_with_numexpr_installedN)rH   
__module____qualname__r   rQ   r>   staticmethodboolstrrP   markZparametrizerg   ri   rn   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r8   \   s   

   
 
 
- 
 

 	r8   )"rI   r   rw   Znumpyr   r   Zpandasr   Zpandas._testingZ_testingr`   Zpandas.core.apir   r   r   Zpandas.core.computationr   r:   rQ   r   r   r!   r#   r)   r,   r.   r2   r3   r5   r6   r   ZskipifZUSE_NUMEXPRr8   r   r   r   r   <module>   s@   










