3
Ud             	   @   s  U d dl mZ d dlmZ d dlmZ d dlZd dlmZm	Z	 d dl
Z
d dlZd dlmZmZmZ d dlZd dlmZ d dljjZd dlmZmZmZ d dlZd d	lmZmZm Z m!Z! d dl"j#Z$d d
l%m&Z& d dl'm(Z( d dl)m*Z*m+Z+ d dl,j-j.j/Z/d dl,m0Z0m1Z1m2Z2 d dl3m4Z4m5Z5 d dl6m7Z7m8Z8m9Z9m:Z:m;Z; ej<dd e+D ddd Z=ej<e/j>ddd Z?ej<dd Z@ej<dd ZAdd ZBdd ZCdd  ZDd!d" ZEd#d$ ZFd%d& ZGeHe7jIe:ZJejKG d'd( d(ZLejKG d)d* d*eLZMG d+d, d,eMZNG d-d. d.eNZOd/d0 ZPG d1d2 d2ZQd3d4 ZRd5d6 ZSG d7d8 d8ZTejKG d9d: d:ZUejKG d;d< d<eUZVG d=d> d>eVZWG d?d@ d@eUZXejKG dAdB dBZYG dCdD dDeYZZG dEdF dFeYZ[G dGdH dHeYZ\edIZ]G dJdK dKZ^ejKdLdM Z_ejKdNdO Z`e2e&jae1dPZ>eebe	e0 f >ejcjdde+ejcjdde>dQdR ZedSdT ZfdUdV ZgdWdX ZhdYdZ Zid[d\ Zjd]d^ Zkd_d` Zlejcjddadxejcjdddemenfejcjddeemenfdfdg Zoejcjddhdiejpdjejcjqe jr dkdldmgdndo Zsdpdq Ztdrds Zudtdu ZvG dvdw dwZwdS )y    )LooseVersion)reduce)productN)DictType)randrandintrandn)PerformanceWarning)is_boolis_list_like	is_scalar)	DataFrameSeriescompat
date_range)pytables)_NUMEXPR_VERSION)NumExprClobberingError_engines)BaseExprVisitorPandasExprVisitorPythonExprVisitor)_NUMEXPR_INSTALLED_USE_NUMEXPR)_arith_ops_syms_binary_math_ops_binary_ops_dict_special_case_arith_ops_syms_unary_math_opsc          	   c   s>   | ]6}t j|t jj|d kot dt dt ddV  qdS )numexprznumexpr enabled->z, installed->)reason)marksN)pytestparammarkZskipifr   r   ).0engine r(   V/var/www/html/virt/lib64/python3.6/site-packages/pandas/tests/computation/test_eval.py	<genexpr>)   s   r*   )paramsc             C   s   | j S )N)r$   )requestr(   r(   r)   r'   '   s    r'   c             C   s   | j S )N)r$   )r,   r(   r(   r)   parser8   s    r-   c               C   s   t rttdkrtjd dS )Nz2.6.9znumexpr is >= 2.6.9r    )r   r   r   r#   skipr(   r(   r(   r)   ne_lt_2_6_9=   s    
r/   c               C   s6   t r(ttdkrtS tdd tD S n
tjd d S )Nz2.6.9c             s   s   | ]}|dkr|V  qdS )floorceilN)r0   r1   r(   )r&   xr(   r(   r)   r*   J   s    z#unary_fns_for_ne.<locals>.<genexpr>znumexpr is not present)r   r   r   r   tupler#   r.   r(   r(   r(   r)   unary_fns_for_neD   s
    r4   c             C   s
   t |  jS )N)r   Zhas_neg_frac)r'   r(   r(   r)   engine_has_neg_fracO   s    r5   c             C   s^   t | }t|rTy
|| |S  tk
rR } zt|jdr@tjS  W Y d d }~X nX || |S )Nz6negative number cannot be raised to a fractional power)r   r5   
ValueErrorstr
startswithnpnan)lhscmp1rhsr'   cer(   r(   r)   _eval_single_binS   s    
r@   c             C   s@   t | tr t |tjr |jdkp>t |to>t | tjo>| jdkS )N   )
isinstancer   r9   ndarrayndim)r;   r=   r(   r(   r)   _series_and_2d_ndarraya   s     rE   c             C   s(   t | trt |tp&t |to&t | tS )N)rB   r   r   )r;   r=   r(   r(   r)   _series_and_frameg   s    rF   c             C   s   t | tot |tjjjS )N)rB   boolpdcoreZgenericZNDFrame)r;   r=   r(   r(   r)   _bool_and_framem   s    rJ   c             C   s   t |ttjfotj| S )N)rB   complexr9   Zcomplexfloatingisnan)resultexpectedr(   r(   r)   _is_py3_complex_incompatq   s    rO   c            
   @   sR  e Zd Zedd Zedd Zdd Zdd Zd	d
 Zdd Z	e
jje
jjdddddddgddddddgde
jjdddgddgddd Zdd Ze
jjd d! Zd"d# Zd$d% Zejd&d' Ze
jjd(d) Ze
jjd*d+ Ze
jj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"dBdC Z#didEdFZ$dGdH Z%dIdJ Z&dKdL Z'dMdN Z(e
jjdDe)e*dOdPe)e+dOdjdQe)e,dOdPdRkgdSdT Z-e
jjdDe.e*dOe.e+dOdOdQe.e,dOdRkgdUdV Z/dWdX Z0dYdZ Z1e
jjd[e2j3e2j4gd\d] Z5d^d_ Z6d`da Z7dbdc Z8ddde Z9dfdg Z:dhS )kTestEvalNumexprPandasc             C   s   dd l }|| _d| _d| _d S )Nr   r    pandas)r    ner'   r-   )clsrR   r(   r(   r)   setup_classz   s    z!TestEvalNumexprPandas.setup_classc             C   s   | ` | `t| dr| `d S )NrR   )r'   r-   hasattrrR   )rS   r(   r(   r)   teardown_class   s    
z$TestEvalNumexprPandas.teardown_classc             C   s   t tdd}tj||dk< t tdd}tj||dk< t tddttdtddtjtjdg|f| _t tddttdtddtjtjdg|f| _t f| _t f| _	| j| j | _
| j| j	 | _d S )N
      g      ?rA      )r   r   r9   r:   r	   r   pandas_lhsespandas_rhsesscalar_lhsesscalar_rhseslhsesrhses)selfZnan_df1Znan_df2r(   r(   r)   
setup_data   s     



z TestEvalNumexprPandas.setup_datac             C   s8   t j| _| jd d d | _t j| _t| _t| _	d| _
d S )NrA   -~not )rb   rc   rd   )expr_cmp_ops_symscmp_opscmp2_ops_bool_ops_symsbin_opsr   special_case_ops_good_arith_ops	arith_ops	unary_ops)r`   r(   r(   r)   	setup_ops   s    zTestEvalNumexprPandas.setup_opsc                s(    j    j  t fddt _d S )Nc                s
   |  j kS )N)r'   )r2   )r`   r(   r)   <lambda>   s    z4TestEvalNumexprPandas.setup_method.<locals>.<lambda>)rp   ra   filterr   current_engines)r`   methodr(   )r`   r)   setup_method   s    z"TestEvalNumexprPandas.setup_methodc             C   s    | ` | `| `| `| `| `| `d S )N)r^   r_   r]   r\   r[   rZ   rs   )r`   rt   r(   r(   r)   teardown_method   s    z%TestEvalNumexprPandas.teardown_methodr<   z!=z==z<=z>=<>rR   eqlegeltgt)idscmp2c             C   s   xt | j| j| jD ]r\}}}t|||| j}t|||| j}t|||| j}d| d| d| d}	tj|	| j| jd}
| j	|
| qW d S )Nz(lhs z rhs) z (lhs z rhs))r'   r-   )
r   r^   r_   rk   r@   r'   rH   evalr-   check_equal)r`   r<   r   r;   r=   Zbinoplhs_newrhs_newrN   exrM   r(   r(   r)   test_complex_cmp_ops   s    z*TestEvalNumexprPandas.test_complex_cmp_opsc             C   sx   t tjddttjdtj f}t tjddttjdtj f}x*t||| jD ]\}}}| j||| qXW d S )NrW   rX   )size)rW   rX   )rX   )rW   rX   )rX   )r   tmZrandboolr   r   rh   check_simple_cmp_op)r`   Z
bool_lhsesZ
bool_rhsesr;   r=   cmp_opr(   r(   r)   test_simple_cmp_ops   s    

z)TestEvalNumexprPandas.test_simple_cmp_opsc             C   s4   x.t | j| j| jD ]\}}}| j||| qW d S )N)r   r^   rn   r_   check_binary_arith_op)r`   r;   opr=   r(   r(   r)   test_binary_arith_ops   s    z+TestEvalNumexprPandas.test_binary_arith_opsc             C   s.   x(t | j| jD ]\}}| j|d| qW d S )N%)r   r^   r_   check_modulus)r`   r;   r=   r(   r(   r)   test_modulus   s    z"TestEvalNumexprPandas.test_modulusc             C   s.   x(t | j| jD ]\}}| j|d| qW d S )Nz//)r   r^   r_   check_floor_division)r`   r;   r=   r(   r(   r)   test_floor_division   s    z)TestEvalNumexprPandas.test_floor_divisionc             C   s.   x(t | j| jD ]\}}| j|d| qW d S )Nz**)r   r^   r_   	check_pow)r`   r;   r=   r(   r(   r)   test_pow   s    zTestEvalNumexprPandas.test_powc             C   s4   x.t | j| j| jD ]\}}}| j||| qW d S )N)r   r^   rh   r_   check_single_invert_op)r`   r;   r   r=   r(   r(   r)   test_single_invert_op   s    z+TestEvalNumexprPandas.test_single_invert_opc             C   s4   x.t | j| j| jD ]\}}}| j||| qW d S )N)r   r^   rh   r_   check_compound_invert_op)r`   r;   r   r=   r(   r(   r)   test_compound_invert_op   s    z-TestEvalNumexprPandas.test_compound_invert_opc             C   sH   | j }d}x8t| j |||| jD ] \}}}}}| j||||| q W d S )Nrw   rx   )rw   rx   )r^   r   r_   check_chained_cmp_op)r`   Zmidsrh   r;   r<   midr   r=   r(   r(   r)   test_chained_cmp_op   s
     z)TestEvalNumexprPandas.test_chained_cmp_opc             C   sZ   t |trtj|| n>t |tr0tj|| n&t |tjrJtj|| n||ksVt	d S )N)
rB   r   r   assert_frame_equalr   assert_series_equalr9   rC   assert_numpy_array_equalAssertionError)r`   rM   rN   r(   r(   r)   r      s    

z!TestEvalNumexprPandas.check_equalc                s    fdd}||||}||||}|d k	r|d k	rd| d| d}	d| d| d}
d| d| d	}t |d
| j}x2|	|
|fD ]$}tj| j jd}tj|| qW d S )Nc                s   t | || jS )N)r@   r'   )leftrightr   )r`   r(   r)   check_operands  s    zBTestEvalNumexprPandas.check_chained_cmp_op.<locals>.check_operandszlhs z mid z rhsz mid and mid z(lhs z mid) & (mid z rhs)&)r'   r-   )r@   r'   rH   r   r-   r   assert_almost_equal)r`   r;   r<   r   r   r=   r   r   r   ex1ex2ex3rN   r   rM   r(   )r`   r)   r      s    z*TestEvalNumexprPandas.check_chained_cmp_opc             C   s   d| d}d}|d
krZt | rZtjt|d" tj|| j| j||dd W d Q R X n0t|||| j}tj|| j| jd	}| j	|| d S )Nzlhs z rhszonly list-like( or dict-like)? objects are allowed to be passed to (DataFrame\.)?isin\(\), you passed a (\[|')bool(\]|')|argument of type 'bool' is not iterableinnot in)match)r;   r=   )r'   r-   
local_dict)r'   r-   )r   r   )
r   r#   raises	TypeErrorrH   r   r'   r-   r@   r   )r`   r;   r<   r=   r   msgrN   rM   r(   r(   r)   r     s    z)TestEvalNumexprPandas.check_simple_cmp_opc             C   s   d| d}t j|| j| jd}t|||| j}tj|| d| d| d}t j|| j| jd}t|||| j}| j|||| d S )Nzlhs z rhs)r'   r-   z rhs )rH   r   r'   r-   r@   r   r   check_alignment)r`   r;   arith1r=   r   rM   rN   nlhsr(   r(   r)   r   '  s    z+TestEvalNumexprPandas.check_binary_arith_opc             C   sT   y|j |\}}W n tttfk
r,   Y n$X | jjd| d}tj|j| d S )Nznlhs z ghs)	alignr6   r   AttributeErrorrR   evaluater   r   values)r`   rM   r   ghsr   rN   r(   r(   r)   r   2  s    z%TestEvalNumexprPandas.check_alignmentc             C   sz   d| d}t j|| j| jd}|| }tj|| | jjd| d}t|t	t
frftj|j| ntj||j  d S )Nzlhs z rhs)r'   r-   z	expected )rH   r   r'   r-   r   r   rR   r   rB   r   r   r   item)r`   r;   r   r=   r   rM   rN   r(   r(   r)   r   A  s    z#TestEvalNumexprPandas.check_modulusc             C   s~   d| d}| j dkr@tj|| j | jd}|| }| j|| n:d}tjt|d" tj|||d| j | jd W d Q R X d S )	Nzlhs z rhspython)r'   r-   zGunsupported operand type\(s\) for //: 'VariableNode' and 'VariableNode')r   )r;   r=   )r   r'   r-   )r'   rH   r   r-   r   r#   r   r   )r`   r;   r   r=   r   resrN   r   r(   r(   r)   r   M  s    
z*TestEvalNumexprPandas.check_floor_divisionc             C   sn   yt |d|| j}W nT tk
rh } z8t|jdrV| jdkrNtjt| qXtj}n W Y d d }~X nX |S )Nz**z6negative number cannot be raised to a fractional powerr   )	r@   r'   r6   r7   r8   r#   r.   r9   r:   )r`   r;   r=   rN   r?   r(   r(   r)   get_expected_pow_resulta  s    
z-TestEvalNumexprPandas.get_expected_pow_resultc          
   C   s   d| d}| j ||}tj|| j| jd}t|rrt|rrt||rrd}tjt	|d t
j|| W d Q R X nRt
j|| d| d| d}tj|| j| jd}| j | j |||}t
j|| d S )Nzlhs z rhs)r'   r-   z-(DataFrame.columns|numpy array) are different)r   z(lhs z rhs) )r   rH   r   r'   r-   r   rO   r#   r   r   r   r   r   )r`   r;   r   r=   r   rN   rM   r   r(   r(   r)   r   p  s    
zTestEvalNumexprPandas.check_powc       	      C   s   x||fD ]}y|j t}W n$ tk
r@   tjt|g}Y nX | }tjd| j| jd}t	j
|| x(| jD ]}t	j
|tjd|| jd qpW q
W d S )Nz~elb)r'   r-   )astyperG   r   r9   arrayrH   r   r'   r-   r   r   rs   )	r`   r;   r<   r=   elZelbrN   rM   r'   r(   r(   r)   r     s    z,TestEvalNumexprPandas.check_single_invert_opc             C   s   ddg}d| d}d}t |r`||kr`tjt|d" tj|| j| j||dd W d Q R X nt |rt |rtd	d
 ||f\}}t	|||| j}t |r| }n| }tj|| j| jd}t
j|| x.| jD ]$}	tj|| j| jd}
t
j|
| qW d S )Nr   znot inz~(lhs z rhs)zonly list-like( or dict-like)? objects are allowed to be passed to (DataFrame\.)?isin\(\), you passed a (\[|')float(\]|')|argument of type 'float' is not iterable)r   )r;   r=   )r'   r-   r   c             S   s   t j| gS )N)r9   r   )r2   r(   r(   r)   rq     s    z@TestEvalNumexprPandas.check_compound_invert_op.<locals>.<lambda>)r'   r-   )r   r#   r   r   rH   r   r'   r-   mapr@   r   r   rs   )r`   r;   r<   r=   Z
skip_theser   r   rN   rM   r'   Zevr(   r(   r)   r     s*    z.TestEvalNumexprPandas.check_compound_invert_opr;   c             C   s   | | S )Nr(   )r`   r   var_namer(   r(   r)   r     s    zTestEvalNumexprPandas.exc             C   s  | j d}ttdd}| jdkrVd}tjt|d tj|| j| j	d}W d Q R X n2d}tjt
|d tj|| j| j	d}W d Q R X ttddd	}| jdkrd
}tjt|d tj|| j| j	d}W d Q R X n&| }tj|| j| j	d}tj|| ttdddk}| }tj|| j| j	d}tj|| tdddgtddkd}| jdkrtjtdd tj|| j| j	d}W d Q R X n2d}tjt
|d tj|| j| j	d}W d Q R X d S )Nrc   rX   rY   r    z-couldn't find matching opcode for 'invert_dd')r   )r'   r-   z0ufunc 'invert' not supported for the input types)r   z)couldn't find matching opcode for 'invertg      ?arA   g       @   )br>   zunknown type objectz#bad operand type for unary ~: 'str')rX   rY   )r   r   r	   r'   r#   r   NotImplementedErrorrH   r   r-   r   r   r   r   r   r6   )r`   rf   r;   r   rM   expectr(   r(   r)   test_frame_invert  s8    

 
  z'TestEvalNumexprPandas.test_frame_invertc             C   s  | j d}ttd}| jdkrTd}tjt|d tj|| j| j	d}W d Q R X n2d}tjt
|d tj|| j| j	d}W d Q R X ttddd}| jdkrd	}tjt|d tj|| j| j	d}W d Q R X n&| }tj|| j| j	d}tj|| ttdd
k}| }tj|| j| j	d}tj|| tdddg}| jdkrztjtdd tj|| j| j	d}W d Q R X n2d}tjt
|d tj|| j| j	d}W d Q R X d S )Nrc   rX   r    z-couldn't find matching opcode for 'invert_dd')r   )r'   r-   z0ufunc 'invert' not supported for the input types)r   z)couldn't find matching opcode for 'invertg      ?r   rA   g       @zunknown type objectz#bad operand type for unary ~: 'str')r   r   r	   r'   r#   r   r   rH   r   r-   r   r   r   r   r   r6   )r`   rf   r;   r   rM   r   r(   r(   r)   test_series_invert  s8    

 
  z(TestEvalNumexprPandas.test_series_invertc             C   s   | j d}ttdd}| }tj|| j| jd}tj|| tt	dd
d}| }tj|| j| jd}tj|| tt
dddk}| jdkrd}tjt|d	 tj|| j| jd}W d Q R X n&| }tj|| j| jd}tj|| d S )Nrb   rX   rY   )r'   r-   )r   g      ?r    z*couldn't find matching opcode for 'neg_bb')r   )rX   rY   )r   r   r	   rH   r   r'   r-   r   r   r   r   r#   r   r   )r`   rf   r;   r   rM   r   r(   r(   r)   test_frame_negate  s"    

 z'TestEvalNumexprPandas.test_frame_negatec             C   s   | j d}ttd}| }tj|| j| jd}tj|| tt	ddd}| }tj|| j| jd}tj|| tt
ddk}| jdkrd}tjt|d tj|| j| jd}W d Q R X n&| }tj|| j| jd}tj|| d S )	Nrb   rX   )r'   r-   )r   g      ?r    z*couldn't find matching opcode for 'neg_bb')r   )r   r   r	   rH   r   r'   r-   r   r   r   r   r#   r   r   )r`   rf   r;   r   rM   r   r(   r(   r)   test_series_negate1  s"    

 z(TestEvalNumexprPandas.test_series_negaterX   rY   )r   g      ?c             C   s2   | j d}|}tj|| j| jd}tj|| d S )N+)r'   r-   )r   rH   r   r'   r-   r   r   )r`   r;   rf   r   rM   r(   r(   r)   test_frame_posK  s    
z$TestEvalNumexprPandas.test_frame_posc             C   s2   | j d}|}tj|| j| jd}tj|| d S )Nr   )r'   r-   )r   rH   r   r'   r-   r   r   )r`   r;   rf   r   rM   r(   r(   r)   test_series_pos]  s    
z%TestEvalNumexprPandas.test_series_posc             C   st  d}t jt|d tjd| j| jd W d Q R X tjd| j| jddksNttjd| j| jddksjttjd	| j| jddksttjd| j| jddksttjd| j| jddksttjd| j| jddksttjd| j| jddk sttjd| j| jddksttjd| j| jddks4ttjd| j| jddksRttjd| j| jddksptd S ) Nz%bad operand type for unary ~: 'float')r   z~1.0)r'   r-   z-1.0)r-   r'         ?z+1.0z~1rA   z-1z+1z~TrueTz~FalseFz-Truez-Falsez+Truez+Falseg      r   re   rA   r   re   re   r   rA   r   )r#   r   r   rH   r   r'   r-   r   )r`   r   r(   r(   r)   test_scalar_unaryo  s    z'TestEvalNumexprPandas.test_scalar_unaryc             C   s:   t jtjdtjddddd	dd
dddddgtjd d S )NzK[-True, True, ~True, +True,-False, False, ~False, +False,-37, 37, ~37, +37]TF%   )dtypere   r   rA   r   re   r   iir   )r   r   rH   r   r9   r   Zobject_)r`   r(   r(   r)   test_unary_in_array  s"    z)TestEvalNumexprPandas.test_unary_in_arrayr   c             C   s^   t jdtjdg|di}|jd}|jtjdgks:t|jd}|jtjdgksZtd S )Nr2   r   )r   zx < -0.1Fz-5 > x)rH   r   r9   r   r   r   r   )r`   r   dfr   r(   r(   r)   test_float_comparison_bin_op  s
    

z2TestEvalNumexprPandas.test_float_comparison_bin_opc             C   s   d}|d7 }|d7 }|d7 }|d7 }t jjdd	d
ttdd
f\}}}}x>|D ]6}d}tjt|d tj|| j	| j
d W d Q R X qPW d S )N1 or 21 and 2a and ba or b1 or 2 and (3 + 2) > 32 * x > 2 or 1 and 22 * df > 3 and 1 or ar   rA   rY   z;cannot evaluate scalar only bool ops|'BoolOp' nodes are not)r   )r'   r-   )r   r   )r   r   )r   )r   )r   )r9   randomr	   r   r#   r   r   rH   r   r'   r-   )r`   exprsr2   r   r   r   r   r   r(   r(   r)   test_disallow_scalar_bool_ops  s    &
z3TestEvalNumexprPandas.test_disallow_scalar_bool_opsc             C   sh  d}t jd| j| jd}|dks$tt|s0td}t jd| j| jd}|dksTtt|s`td}t jd| j| jd}| stt|stt|sttjdg}t jd| j| jd}t	j
|tjdg |jdksttjdg}t jd| j| jd}t	j
|tjdg |jdks ttjdg}t jd| j| jd}t	j
|tjdg |jdksdtd S )	NrA   r2   )r'   r-   g      ?F)rA   )rA   )rA   )rH   r   r'   r-   r   r   r   r9   r   r   r   shape)r`   r2   rM   r(   r(   r)   test_identical  s2    
z$TestEvalNumexprPandas.test_identicalc             C   s(   d}t j|| j| jd}|dks$td S )Nz1 + 2 *         5 - 1 + 2 )r'   r-      )rH   r   r'   r-   r   )r`   exprM   r(   r(   r)   test_line_continuation  s    z,TestEvalNumexprPandas.test_line_continuationc             C   s   d}t j|| j| jd}tj|}||ks.tt jddddgi}d}|jd|d	}|j	sbtd
}|jd|d	}|j
ddgd d f }tj|| d}|jd|d	}|j
dgd d f }tj|| d S )Nz1000000000.006)r'   r-   Ag~  eAg$  eAg'1  eAg  eAzA < z.4fg   eAzA > rA   rY   zA == )rH   r   r'   r-   r9   float64r   r   queryemptylocr   r   )r`   r   rM   rN   r   cutoffexactr(   r(   r)   test_float_truncation  s     

z+TestEvalNumexprPandas.test_float_truncationc             C   s|   t jdddggdddgd}d}tjt|d |jd W d Q R X t j }d	|j_tjt|d |jd
 W d Q R X d S )Nr   Zfoobarclass)columnsz4Python keyword not valid identifier in numexpr query)r   z
class == 0lambdazlambda == 0)rH   r   r#   r   SyntaxErrorr   indexname)r`   r   r   r(   r(   r)   test_disallow_python_keywords  s    z3TestEvalNumexprPandas.test_disallow_python_keywordsN)r;   )rX   rY   );__name__
__module____qualname__classmethodrT   rV   ra   rp   ru   rv   r#   r%   slowparametrizer   r   r   r   r   tdskip_if_windowsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r	   r   r   r   r   r   r   r   r9   float32r   r   r   r   r   r   r   r(   r(   r(   r)   rP   x   sl   &	
#
+/



!rP   c                   s0   e Zd Ze fddZdd Zdd Z  ZS )TestEvalNumexprPythonc                s(   t  j  dd l}|| _d| _d| _d S )Nr   r    r   )superrT   r    rR   r'   r-   )rS   rR   )	__class__r(   r)   rT     s
    
z!TestEvalNumexprPython.setup_classc             C   sP   t tdd tj| _| jd d d	 | _dd tjD | _t| _	t
| _d
| _d S )Nc             S   s   | dkS )Nr   not in)r   r   r(   )r2   r(   r(   r)   rq   
  s    z1TestEvalNumexprPython.setup_ops.<locals>.<lambda>rA   c             S   s   g | ]}|dkr|qS )andor)r   r  r(   )r&   sr(   r(   r)   
<listcomp>  s    z3TestEvalNumexprPython.setup_ops.<locals>.<listcomp>r   rb   rc   re   )r   rb   rc   )listrr   rf   rg   rh   ri   rj   rk   r   rl   rm   rn   ro   )r`   r(   r(   r)   rp     s    zTestEvalNumexprPython.setup_opsc             C   sH   d| d| d}d}t jt|d tj|| j| jd W d Q R X d S )Nzlhs z mid z rhsz"'BoolOp' nodes are not implemented)r   )r'   r-   )r#   r   r   rH   r   r'   r-   )r`   r;   r<   r   r   r=   r   r   r(   r(   r)   r     s    z*TestEvalNumexprPython.check_chained_cmp_op)r   r   r   r   rT   rp   r   __classcell__r(   r(   )r   r)   r     s   	
r   c                   s0   e Zd Ze fddZdd Zdd Z  ZS )TestEvalPythonPythonc                s   t  j  d| _d| _d S )Nr   )r   rT   r'   r-   )rS   )r   r(   r)   rT     s    
z TestEvalPythonPython.setup_classc             C   sT   d| d}t j|| j| jd}|| }tj|| t|||| j}tj|| d S )Nzlhs z rhs)r'   r-   )rH   r   r'   r-   r   r   r@   )r`   r;   r   r=   r   rM   rN   r(   r(   r)   r      s    z"TestEvalPythonPython.check_modulusc             C   sN   y|j |\}}W n tttfk
r,   Y nX td| d}tj|| d S )Nznlhs z ghs)r   r6   r   r   r   r   r   )r`   rM   r   r   r   rN   r(   r(   r)   r   *  s    z$TestEvalPythonPython.check_alignment)r   r   r   r   rT   r   r   r  r(   r(   )r   r)   r    s   
r  c                   s(   e Zd Ze fddZdd Z  ZS )TestEvalPythonPandasc                s   t  j  d| _d| _d S )Nr   rQ   )r   rT   r'   r-   )rS   )r   r(   r)   rT   7  s    
z TestEvalPythonPandas.setup_classc             C   s   t j| ||||| d S )N)rP   r   )r`   r;   r<   r   r   r=   r(   r(   r)   r   =  s    z)TestEvalPythonPandas.check_chained_cmp_op)r   r   r   r   rT   r   r  r(   r(   )r   r)   r  6  s   r  c              O   s
   t jj S )N)r9   r   r	   )argskwargsr(   r(   r)   rq   A  s    rq   c               @   sB   e Zd Zejjddddddgejjdejejgdd	 Z	d
S )TestTypeCastingr   r   rb   *z**/dtc             C   s   t jddt|d}d| d}tj|||d}|jj|ks>t|jj|ksNtt j|t| d| d}tj|||d}|jj|kst|jj|kstt j|t| d S )	NrX   r   )
data_gen_fr   zdf z 3)r'   r-   z3 z df)	r   makeCustomDataframefrH   r   r   r   r   r   )r`   r'   r-   r   r  r   r  r   r(   r(   r)   test_binop_typecastingI  s    z&TestTypeCasting.test_binop_typecastingN)
r   r   r   r#   r%   r   r9   r   r   r  r(   r(   r(   r)   r
  H  s   r
  c             C   s   t | jjtjS )N)
issubclassr   typer9   Z
datetime64)r2   r(   r(   r)   _is_datetime`  s    r  c              G   s0   t ttjd|  }ttjtt| }|o.|S )NZis_monotonic)anyr   operator
attrgetterr   xorr  )r  Znot_monoZonly_one_dtr(   r(   r)   should_warnd  s    r  c               @   sp   e Zd ZdZed Zdd Zdd Zd	d
 Zej	j
dd Zdd Zdd Zdd Zej	j
dd Zdd ZdS )TestAlignmentiur  r  c             C   s8   d}t jddtd}tj|||d}t j||d  d S )Nzdf * ~2rX   r   )r  )r'   r-   rY   )r   r  r  rH   r   r   )r`   r'   r-   r  r   r   r(   r(   r)   test_align_nested_unary_opo  s    z(TestAlignment.test_align_nested_unary_opc       
      C   s   t | j| j| j}tjdd tjdt x|D ]\}}}tjddt	||d}tjddt	||d}t
|j|jrtjt tjd||d}	W d Q R X ntjd||d}	tj|	||  q2W W d Q R X d S )	NT)recordalwaysrW   )r  
r_idx_type
c_idx_type   zdf + df2)r'   r-   )r   lhs_index_typesindex_typeswarningscatch_warningssimplefilterRuntimeWarningr   r  r  r  r   assert_produces_warningrH   r   r   )
r`   r'   r-   r  Zlr_idx_typeZrr_idx_typer"  r   df2r   r(   r(   r)   test_basic_frame_alignmentu  s    z(TestAlignment.test_basic_frame_alignmentc       	      C   s   t | jdd}x||D ]t\}}tjddt||d}tjd||d}tj||dk  tt	|j
 |j|jd}tjd||d}tj|||k  qW d S )	NrY   )repeatrW   )r  r!  r"  zdf < 2)r'   r-   )r   r   zdf < df3)r   r$  r   r  r  rH   r   r   r   r	   r   r   r   )	r`   r'   r-   r  r!  r"  r   r   df3r(   r(   r)   test_frame_comparison  s    z#TestAlignment.test_frame_comparisonc             C   s   t | j| j| j| j}tjdd tjdt x|D ]\}}}}tjddt	||d}tjddt	||d}	tjddt	||d}
t
|j|	j|
jrtjt tjd	||d
}W d Q R X ntjd	||d
}tj|||	 |
  q6W W d Q R X d S )NT)r  r   r   rY   )r  r!  r"     rX   zdf + df2 + df3)r'   r-   )r   r$  r%  r&  r'  r(  r)  r   r  r  r  r   r*  rH   r   r   )r`   r'   r-   r  r1c1r2c2r   r+  r.  r   r(   r(   r)   #test_medium_complex_frame_alignment  s     z1TestAlignment.test_medium_complex_frame_alignmentc                sf    fdd}t | j| jd}tjdd2 tjdt x|D ]\}}}|||| q>W W d Q R X d S )	Nc                s   t jddt| |d}t||}ttjjd|d d }t|j	|j	rnt j
t tjd d}W d Q R X ntjd d}| dks|dkr dkr|j|n|| }n|| }t j|| d S )NrW   )r  r!  r"  rX   zdf + s)r'   r-   r  r    )r   r  r  getattrr   r9   r   r	   r  r   r*  r)  rH   r   addr   )r!  r"  
index_namer   r   r  r   rN   )r'   r-   r(   r)   testit  s    
z?TestAlignment.test_basic_frame_series_alignment.<locals>.testitr   r   T)r  r   )r   r   )r   r$  r%  r&  r'  r(  r)  )r`   r'   r-   r9  r  r!  r"  r8  r(   )r'   r-   r)   !test_basic_frame_series_alignment  s    z/TestAlignment.test_basic_frame_series_alignmentc                s    fdd}t dddgdddgd}tjdd	2 tjd
t x|D ]\}}}|||| qFW W d Q R X t dgdgd}tjdd	2 tjd
t x|D ]\}}}|||| qW W d Q R X d S )Nc                s   t jddt| |d}t||}ttjjd|d d }t|j	|j	rnt j
t tjd d}W d Q R X ntjd d}| dks|dkr dkr|j|n|| }n|| }t j|| d S )	NrW      )r  r!  r"  rX   zs + df)r'   r-   r  r    )r   r  r  r6  r   r9   r   r	   r  r   r*  r)  rH   r   r7  r   )r!  r"  r8  r   r   r  r   rN   )r'   r-   r(   r)   r9    s    
z?TestAlignment.test_basic_series_frame_alignment.<locals>.testitr  r  r  r   r   T)r  ignorer  )r   r   )r   r   )r   r&  r'  r(  r)  )r`   r'   r-   r9  r  r!  r"  r8  r(   )r'   r-   r)   !test_basic_series_frame_alignment  s    z/TestAlignment.test_basic_series_frame_alignmentc             C   sF  t | j| jdd}tjdd tjdt x|D  ]\}}}}tjddt	||d	}t
||}	ttjjd
|	d d
 }
d| d}d| d}t|j|
jrtjt tj|||d}W d Q R X tjt tj|||d}W d Q R X n tj|||d}tj|||d}|dkr6|dkr6|dkr6tj|| q6W W d Q R X d S )Nr   r  r   r   T)r  r   rW   )r  r!  r"  rX   zs z dfzdf z s)r'   r-   r  r    )r   r  )r   r   )r   r$  r%  r&  r'  r(  r)  r   r  r  r6  r   r9   r   r	   r  r   r*  rH   r   r   )r`   r'   r-   r  r!  r"  r   r8  r   r   r  r;   r=   r   r   r(   r(   r)   test_series_frame_commutativity  s*    
z-TestAlignment.test_series_frame_commutativityc             C   s  dd l }t| j| j| j| j}d}d}d| }tjddx tjdt xb|D ]X\}}	}
}|jdd	g}|jd
dg}t	j
||t||
d}t	j
||t|	|d}tt j||}ttj j||d | }|	dks|dkr|dkr|j|}n|| }n|| }|dks|
dkr:|dkr0|j|}n|| }n|| }t|j|j|jr~t	jt tjd||d}W d Q R X ntjd||d}|j|jkstt	j|| qRW W d Q R X d S )Nr   r   rX   rY   T)r  r   r   r   r   r+  )r  r!  r"  r  r    zdf2 + s + df)r'   r-   )r   r   r$  r%  r&  r'  r(  r)  choicer   r  r  r6  localsgetr   r9   r	   r7  r  r   r*  rH   r   r   r   r   )r`   r'   r-   r   r  nm1m2r1  r3  r2  r4  r8  Zobj_namer   r+  r   r  Z	expected2rN   r   r(   r(   r)   #test_complex_series_frame_alignment  sB    


z1TestAlignment.test_complex_series_frame_alignmentc          !   C   sv  t tdd}ttd}|dkr(t}nd}tj| tjd||d W d Q R X ttd}tjd tjd||d W d Q R X t tdd}ttd}tjd tjd||d W d Q R X t tdd}ttd}|dk}|st}nd}tj|n}tjd||d |sht|d	ks(t	t
|d
 j}	tj|j|jd	  }
d|
dd}|	|ksht	W d Q R X d S )Ni  rW   i'  r    Fzdf + s)r'   r-   r   rA   r   z_Alignment difference on axis 1 is larger than an order of magnitude on term 'df', by more than z.4gz; performance may suffer)r   r	   r   r
   r   r*  rH   r   lenr   r7   messager9   log10r   r   )r`   r'   r-   r   r  seenZis_python_engineZwrnwr   ZlogedrN   r(   r(   r)   +test_performance_warning_for_poor_alignment=  s8    z9TestAlignment.test_performance_warning_for_poor_alignmentN)r  r  r  )r  )r   r   r   r%  r$  r  r,  r/  r#   r%   r   r5  r:  r=  r>  rE  rK  r(   r(   r(   r)   r  j  s   %2r  c            	   @   s~  e Zd Zedd Ze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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/d0 Zejjd1d2d3d2d4gej g dIgejj!d6d7d8 Z"ejjd1d2d3dJgd9d: Z#ejjd;d2d3d2d4gej g dKd2d4igd<d= Z$d>d? Z%d@dA Z&dBdC Z'dDdE Z(dFdG Z)dHS )LTestOperationsNumExprPandasc             C   s   d| _ d| _tjtj | _d S )Nr    rQ   )r'   r-   rf   r   rg   rn   )rS   r(   r(   r)   rT   p  s    z'TestOperationsNumExprPandas.setup_classc             C   s   | ` | `d S )N)r'   r-   )rS   r(   r(   r)   rV   v  s    z*TestOperationsNumExprPandas.teardown_classc             O   s4   | j |d< | j|d< |jddd |d< tj||S )Nr'   r-   levelr   rA   )r'   r-   poprH   r   )r`   r  r	  r(   r(   r)   r   z  s    

z TestOperationsNumExprPandas.evalc       
      C   s&  | j }xtdd |D ]}d| d}d| d}d| d}|dkr~d	}tjt|d
 tj|| j| jd W d Q R X qt	d|d| j}| j|| j| jd}||kst
t	||d| j}| j|d|i| j| jd}	|	|kst
t	d||d | j}| j|d|i| j| jd}	|	|kst
qW d S )Nc             S   s   | dkS )Nz//r(   )r2   r(   r(   r)   rq     s    zCTestOperationsNumExprPandas.test_simple_arith_ops.<locals>.<lambda>z1 z 1zx z (x + 1)r   not inz&argument of type 'int' is not iterable)r   )r'   r-   rA   r2   )r   r'   r-   )r   rO  )rn   rr   r#   r   r   rH   r   r'   r-   r@   r   )
r`   opsr   r   r   r   r   expecr2   yr(   r(   r)   test_simple_arith_ops  s(     z1TestOperationsNumExprPandas.test_simple_arith_opsc             C   sT   xNt tjddD ]<\}}}| d| d| }| j|}t|}||kstqW d S )NTF )TF)TF)r   rf   rj   r   r   )r`   r   r;   r=   r   r   r   r(   r(   r)   test_simple_bool_ops  s
    
z0TestOperationsNumExprPandas.test_simple_bool_opsc             C   sT   xNt tjddD ]<\}}}| d| d| }| j|}t|}||kstqW d S )NTrueFalserT  )rV  rW  )rV  rW  )r   rf   rj   r   r   )r`   r   r;   r=   r   r   r   r(   r(   r)   test_bool_ops_with_constants  s    
z8TestOperationsNumExprPandas.test_bool_ops_with_constantsc             C   sP   t dddd}tt d}d}tjt|d | jd||d	d
 W d Q R X d S )Nr   r0  rX      rW   z?N-dimensional objects, where N > 2, are not supported with eval)r   zx + y)r2   rR  )r   )r	   r   r#   r   r   r   )r`   r2   rR  r   r(   r(   r)   test_4d_ndarray_fails  s
    z1TestOperationsNumExprPandas.test_4d_ndarray_failsc             C   s   | j d}|dkstd S )N1rA   )r   r   )r`   r2   r(   r(   r)   test_constant  s    
z)TestOperationsNumExprPandas.test_constantc             C   s0   t tdd}| jdd|id}tj|| d S )NrW   rY   r   )r   )r   r	   r   r   r   )r`   r   r+  r(   r(   r)   test_single_variable  s    z0TestOperationsNumExprPandas.test_single_variablec          .   C   s`  t jdg}d}d|i}tjt | j|dd}W d Q R X tj|t jdg tjt | j|dd}W d Q R X tj|t jdg tjt | jddd}W d Q R X d	}||ksttjt | jddd}W d Q R X d	}||ksttjt | jd
dd}W d Q R X d	}||ks&ttjt | jd
dd}W d Q R X d	}||ks\td S )NrA   zs / 1r  F)truedivg      ?Tz1 / 2g      ?zs / 2)r9   r   r   r*  FutureWarningr   r   r   )r`   r  r   dr   rQ  r(   r(   r)   test_truediv  s2    z(TestOperationsNumExprPandas.test_truedivc          	   C   s:   t tjjdd}tjtdd | jd W d Q R X d S )NrX   r   zname 'x' is not defined)r   zdf[x > 2] > 2)r   r9   r   r	   r#   r   	NameErrorr   )r`   r   r(   r(   r)   &test_failing_subscript_with_name_error  s    zBTestOperationsNumExprPandas.test_failing_subscript_with_name_errorc             C   sD   t tjjdd}| jdd|id}|d |dk }tj|| d S )NrX   r   z(df + 1)[df > 2]r   )r   rA   rY   )r   r9   r   r	   r   r   r   )r`   r   rM   rN   r(   r(   r)   test_lhs_expression_subscript  s    z9TestOperationsNumExprPandas.test_lhs_expression_subscriptc             C   s   t tjjddtdd}d}|j|jk }d}|j|j |j }d}|j|j |j|jdk   }|||f}|||f}	x0t||	D ]"\}
}t	j
|| j|
d	|id
 qW d S )NrX   r   abc)r   zdf.a < df.bzdf.a + df.b + df.czdf.a + df.b + df.c[df.b < 0]r   r   )r   )r   r9   r   r	   r  r   r   r>   zipr   r   r   )r`   r   expr1Zexpec1Zexpr2Zexpec2Zexpr3Zexpec3r   Zexpecsr?   rQ  r(   r(   r)   test_attr_expression  s    

z0TestOperationsNumExprPandas.test_attr_expressionc             C   sf   t tjjddtdd}t tjjdd}d}d}tjt|d | j|||dd	 W d Q R X d S )
NrX   r   re  )r   zdf = df2z%cannot assign without a target object)r   )r   r+  )r   )	r   r9   r   r	   r  r#   r   r6   r   )r`   r   r+  rg  r   r(   r(   r)   test_assignment_fails  s    z1TestOperationsNumExprPandas.test_assignment_failsc          "      s  t tjjddtdd  j tjtdd  j	d W d Q R X d}tjt|d  j	d	 W d Q R X t
jrzd
}nd}tjt|d  j	d W d Q R X j }|d |d  |d< j   j	ddd tj | j }|d |d  |d< j   j	ddd tj | fdd}|  j }d|d  |d< tj | j   fdd}|  j   j	ddd d}tjt|d  j	d W d Q R X j  | j	dd i dd j }|d |d  |d< tj | d S )NrX   rY   ab)r   zinvalid syntax)r   zd c = a + bz5left hand side of an assignment must be a single namezd,c = a + bzcannot assign to function callzcan't assign to function callzTimestamp("20131001") = a + br   r   z	a = a + bT)inplacer>   z	c = a + bc                 s    j  } d}| jddd | S )NrA   z	a = 1 + bT)rk  )copyr   )r   r   )orig_dfr(   r)   r  "  s    z=TestOperationsNumExprPandas.test_assignment_column.<locals>.frA   c                 sJ   d}  j j } jddd | j }tj| j dd |jd ksFtd S )NrA   z	a = a + bT)rk  F)check_names)r   rl  r   r   r   r   r   r   )r   Zold_arM   )r   r(   r)   r  /  s    

z#can only assign a single expressionz	c = a = bzc = df.a + df.br   )r   targetrk  )r   r9   r   r	   r  rl  r#   r   r   r   r   PY38r   r   )r`   r   rN   r  r(   )r   rm  r)   test_assignment_column   sP    z2TestOperationsNumExprPandas.test_assignment_columnc             C   s6   t dgdgd}|jd}tdg}tj|| d S )N       )r   r   za in [11, -32]Ti)r   r   r   r   r   )r`   r   rM   rN   r(   r(   r)   test_column_inG  s    

z*TestOperationsNumExprPandas.test_column_inc             C   s`   t tjjddtdd}|jddd}|d k	s4t|j }|d |d	  |d
< tj	|| d S )NrX   rY   rj  )r   z	c = a + bF)rk  r   r   r>   )
r   r9   r   r	   r  r   r   rl  r   r   )r`   r   actualrN   r(   r(   r)   assignment_not_inplaceN  s    z2TestOperationsNumExprPandas.assignment_not_inplacec             C   s   t jdddgdddgd}|j }|d |d	  |d
< |d
 |d	  |d< |jddd}tj|| |d ksrt|d d |d< |d d |d< |jddd}tj|| |d kstd}tjt	|d |jddd W d Q R X d S )NrA   rY   r   r0  rX   rY  )r   r   r   r   r>   r`  z$
        c = a + b
        d = c + bT)rk  r?   z$
        a = a - 1
        e = a + 2z@Multi-line expressions are only valid if all expressions contain)r   z(
            a = b + 2
            b - 2F)
rH   r   rl  r   r   r   r   r#   r   r6   )r`   r   rN   ansr   r(   r(   r)   test_multi_line_expressionY  s*    z6TestOperationsNumExprPandas.test_multi_line_expressionc             C   s   t jdddgdddgd}|j }|d |d	  |d
< |d
 |d	  |d< |jddd}tj|| |d d |d< |d d |d< |jddd}tj|| d S )NrA   rY   r   r0  rX   rY  )r   r   r   r   r>   r`  z$
        c = a + b
        d = c + bF)rk  r?   z$
        a = a - 1
        e = a + 2)rH   r   rl  r   r   r   )r`   r   rN   r(   r(   r)   &test_multi_line_expression_not_inplace~  s    zBTestOperationsNumExprPandas.test_multi_line_expression_not_inplacec             C   sr   t jdddgdddgd}|j }d}|d	 | |d
< |d
 | |d< |jddd}tj|| |d ksntd S )NrA   rY   r   r0  rX   rY  )r   r   r;  r   r>   r`  z?
        c = a * @local_var
        d = c + @local_var
        T)rk  )rH   r   rl  r   r   r   r   )r`   r   rN   Z	local_varrw  r(   r(   r)   )test_multi_line_expression_local_variable  s    zETestOperationsNumExprPandas.test_multi_line_expression_local_variablec             C   s   t jdddgdddgd}dd	 }|j }|d
 |dd |d< |d |dd |d< |jddd}tj|| |d ks~td S )NrA   rY   r   r0  rX   rY  )r   r   c             S   s   |S )Nr(   )r   r   r(   r(   r)   
local_func  s    zbTestOperationsNumExprPandas.test_multi_line_expression_callable_local_variable.<locals>.local_funcr   r;  r>   r`  zM
        c = a * @local_func(1, 7)
        d = c + @local_func(1, 7)
        T)rk  )rH   r   rl  r   r   r   r   )r`   r   r{  rN   rw  r(   r(   r)   2test_multi_line_expression_callable_local_variable  s    zNTestOperationsNumExprPandas.test_multi_line_expression_callable_local_variablec             C   s   t jdddgdddgd}dd	 }|j }|d
 |ddd |d< |d |ddd |d< |jddd}tj|| |d kstd S )NrA   rY   r   r0  rX   rY  )r   r   c             S   s   |S )Nr(   )r   r   r(   r(   r)   r{    s    znTestOperationsNumExprPandas.test_multi_line_expression_callable_local_variable_with_kwargs.<locals>.local_funcr   r;  )r   r   r>   r`  zU
        c = a * @local_func(b=7, a=1)
        d = c + @local_func(b=7, a=1)
        T)rk  )rH   r   rl  r   r   r   r   )r`   r   r{  rN   rw  r(   r(   r)   >test_multi_line_expression_callable_local_variable_with_kwargs  s    zZTestOperationsNumExprPandas.test_multi_line_expression_callable_local_variable_with_kwargsc          
   C   s\   t jdddgdddgd}|j }d}tjt|d	 |jd
 W d Q R X tj|| d S )NrA   rY   r   r0  rX   rY  )r   r   z%cannot assign without a target object)r   za = 1)	rH   r   rl  r#   r   r6   r   r   r   )r`   r   Zdf_origr   r(   r(   r)   test_assignment_in_query  s    z4TestOperationsNumExprPandas.test_assignment_in_queryc             C   sz   t jdddgdddgd}|j }||d dk }|jd	d
d tj|| i }ddi}| jd|d
d tj|| d S )NrA   rY   r   r0  rX   rY  )r   r   r   za == 2T)rk  z	a = 1 + 2)ro  rk  )rH   r   rl  r   r   r   r   Zassert_dict_equal)r`   r   rN   r(   r(   r)   test_query_inplace  s    z.TestOperationsNumExprPandas.test_query_inplaceinvalid_targetrA   catrY   r   zignore::FutureWarningc             C   sj   d}d}t jt|d | j||dd W d Q R X t|drft jt|d | j||dd W d Q R X d S )Nz)Cannot assign expression output to targetz	a = 1 + 2)r   T)ro  rk  rl  F)r#   r   r6   r   rU   )r`   r  r   
expressionr(   r(   r)   test_cannot_item_assign  s    
z3TestOperationsNumExprPandas.test_cannot_item_assignc             C   s6   d}d}t jt|d | j||dd W d Q R X d S )Nz"Cannot return a copy of the targetz	a = 1 + 2)r   F)ro  rk  )r#   r   r6   r   )r`   r  r   r  r(   r(   r)   test_cannot_copy_item  s    z1TestOperationsNumExprPandas.test_cannot_copy_itemro  c             C   sN   d}| j ||dddkstd}tjt|d | j ||dd W d Q R X d S )Nz1 + 2F)ro  rk  r   z0Cannot operate inplace if there is no assignment)r   T)r   r   r#   r   r6   )r`   ro  r  r   r(   r(   r)   test_inplace_no_assignment  s
    z6TestOperationsNumExprPandas.test_inplace_no_assignmentc             C   sR   t jddtddd}|dk }| jdd|id}|dk }t j|| t j|| d S )NrY   pr  )r  r"  r!  zdf < 2r   )r   )r   r  r  r   r   )r`   r   r?   rr2   r(   r(   r)   *test_basic_period_index_boolean_expression  s    zFTestOperationsNumExprPandas.test_basic_period_index_boolean_expressionc             C   sB   t jddtddd}| jdd|id}||d	k  }t j|| d S )
NrY   r  r  )r  r"  r!  zdf[df < 2 + 3]r   )r   r   rX   )r   r  r  r   r   )r`   r   r  r?   r(   r(   r)   ,test_basic_period_index_subscript_expression  s    zHTestOperationsNumExprPandas.test_basic_period_index_subscript_expressionc             C   sR   t jddtddd}| jdd|id}|||dk  dk  |d  }t j|| d S )NrY   r  r  )r  r"  r!  zdf[df[df < 2] < 2] + df * 2r   )r   )r   r  r  r   r   )r`   r   r  r?   r(   r(   r)   -test_nested_period_index_subscript_expression  s    zITestOperationsNumExprPandas.test_nested_period_index_subscript_expressionc             C   sV   t tdd}tddd|d< | jdd|i| j| jd}|jd	k }tj||d
d d S )NrX   r   z1/1/2012)Zperiodsdates1zdf.dates1 < 20130101r   )r   r'   r-   Z20130101F)rn  )	r   r	   r   r   r'   r-   r  r   r   )r`   r   r   rQ  r(   r(   r)   test_date_boolean  s    

z-TestOperationsNumExprPandas.test_date_booleanc          /   C   sP  | j dkr0tjd| j| j d}|s(ttjd| j| j d}|sDttjd| j| j d}| sbttjd| j| j d}|s~ttjd| j| j d}|sttjd| j| j d}|sttjd	| j| j d}|sttjd
| j| j d}|sttjd| j| j d}| sttjd| j| j d}|sLtnd}tjt|d tjd| j| j d W d Q R X tjt|d tjd| j| j d W d Q R X tjt|d tjd| j| j d W d Q R X tjt|d tjd| j| j d W d Q R X d}tjt|d tjd| j| j d W d Q R X tjt|d tjd| j| j d W d Q R X d S )Nr   z1 in [1, 2])r'   r-   z2 in (1, 2)z3 in (1, 2)z3 not in (1, 2)z[3] not in (1, 2)z[3] in ([3], 2)z[[3]] in [[[3]], 2]z(3,) in [(3,), 2]z(3,) not in [(3,), 2]z[(3,)] in [[(3,)], 2]z'In' nodes are not implemented)r   z[(3,)] in (1, 2, [(3,)])z!'NotIn' nodes are not implementedz[3] not in (1, 2, [[3]]))r-   rH   r   r'   r   r#   r   r   )r`   r   r   r(   r(   r)   test_simple_in_ops)  sN    
z.TestOperationsNumExprPandas.test_simple_in_opsN)rA   r   )rA   r   )rA   r   )*r   r   r   r   rT   rV   r   rS  rU  rX  rZ  r\  r]  ra  rc  rd  rh  ri  rq  rt  rv  rx  ry  rz  r|  r}  r~  r  r#   r%   r   r9   r   filterwarningsr  r  r  r  r  r  r  r  r(   r(   r(   r)   rL  n  sB   	#G%	 0

rL  c                   s`   e Zd Ze f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  ZS )TestOperationsNumExprPythonc                s:   t  j  d| _d| _tjtj | _tdd | j| _d S )Nr    r   c             S   s   | dkS )Nr   not in)r   r  r(   )r2   r(   r(   r)   rq   i  s    z9TestOperationsNumExprPython.setup_class.<locals>.<lambda>)	r   rT   r'   r-   rf   r   rg   rn   rr   )rS   )r   r(   r)   rT   c  s
    
z'TestOperationsNumExprPython.setup_classc             C   s:   d}dj dd }d}tj|| j| jd}||ks6td S )NrA   z * r   !   )r'   r-   )joinrH   r   r'   r-   r   )r`   r   rf   rN   r   r(   r(   r)   test_check_many_exprsk  s
    z1TestOperationsNumExprPython.test_check_many_exprsc             C   sN   t tjjdd}d}tjt|d  tjdd|i| j	| j
d W d Q R X d S )NrX   r   z"'BoolOp' nodes are not implemented)r   zdf > 2 and df > 3r   )r   r-   r'   )r   r9   r   r	   r#   r   r   rH   r   r-   r'   )r`   r   r   r(   r(   r)   test_fails_andr  s    z*TestOperationsNumExprPython.test_fails_andc             C   sN   t tjjdd}d}tjt|d  tjdd|i| j	| j
d W d Q R X d S )NrX   r   z"'BoolOp' nodes are not implemented)r   zdf > 2 or df > 3r   )r   r-   r'   )r   r9   r   r	   r#   r   r   rH   r   r-   r'   )r`   r   r   r(   r(   r)   test_fails_or}  s    z)TestOperationsNumExprPython.test_fails_orc             C   sN   t tjjdd}d}tjt|d  tjdd|i| j	| j
d W d Q R X d S )NrX   r   z'Not' nodes are not implemented)r   z
not df > 2r   )r   r-   r'   )r   r9   r   r	   r#   r   r   rH   r   r-   r'   )r`   r   r   r(   r(   r)   test_fails_not  s    z*TestOperationsNumExprPython.test_fails_notc             C   sL   t tjjdd}d}d}tjt|d tj|| j	| j
d W d Q R X d S )NrX   r   z(df + 2)[df > 1] > 0 & (df > 0)z$cannot evaluate scalar only bool ops)r   )r-   r'   )r   r9   r   r	   r#   r   r   rH   r   r-   r'   )r`   r   r   r   r(   r(   r)   test_fails_ampersand  s
    z0TestOperationsNumExprPython.test_fails_ampersandc             C   sL   t tjjdd}d}d}tjt|d tj|| j	| j
d W d Q R X d S )NrX   r   z(df + 2)[df > 1] > 0 | (df > 0)z$cannot evaluate scalar only bool ops)r   )r-   r'   )r   r9   r   r	   r#   r   r   rH   r   r-   r'   )r`   r   r   r   r(   r(   r)   test_fails_pipe  s
    z+TestOperationsNumExprPython.test_fails_pipec          
   C   s   xt tjdd	D ]n\}}}| d| d| }|d
kr`d}tjt|d | j| W d Q R X q| j|}t|}||kstqW d S )NrV  rW  rT  r   r  z"'BoolOp' nodes are not implemented)r   )rV  rW  )rV  rW  )r   r  )r   rf   rj   r#   r   r   r   r   )r`   r   r;   r=   r   r   r   r   r(   r(   r)   rX    s    
z8TestOperationsNumExprPython.test_bool_ops_with_constantsc             C   s   xt tjd
dD ]z\}}}d| d}|dkrbd}tjt|d tj|| j| j	d	 W d Q R X qtj|| j| j	d	}t|}||kst
qW d S )NTFzlhs z rhsr   r  z"'BoolOp' nodes are not implemented)r   )r'   r-   )TF)TF)r   r  )r   rf   rj   r#   r   r   rH   r   r'   r-   r   )r`   r   r;   r=   r   r   r   r   r(   r(   r)   rU    s     z0TestOperationsNumExprPython.test_simple_bool_ops)r   r   r   r   rT   r  r  r  r  r  r  rX  rU  r  r(   r(   )r   r)   r  a  s   r  c                   s    e Zd Ze fddZ  ZS )TestOperationsPythonPythonc                s:   t  j  d | _| _tjtj | _tdd | j| _d S )Nr   c             S   s   | dkS )Nr   not in)r   r  r(   )r2   r(   r(   r)   rq     s    z8TestOperationsPythonPython.setup_class.<locals>.<lambda>)	r   rT   r'   r-   rf   r   rg   rn   rr   )rS   )r   r(   r)   rT     s    
z&TestOperationsPythonPython.setup_class)r   r   r   r   rT   r  r(   r(   )r   r)   r    s   r  c                   s    e Zd Ze fddZ  ZS )TestOperationsPythonPandasc                s(   t  j  d| _d| _tjtj | _d S )Nr   rQ   )r   rT   r'   r-   rf   r   rg   rn   )rS   )r   r(   r)   rT     s    
z&TestOperationsPythonPandas.setup_class)r   r   r   r   rT   r  r(   r(   )r   r)   r    s   r  c               @   s   e Zd Zedd Ze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 Zdd Zdd ZdS )TestMathPythonPythonc             C   s   d| _ d| _t| _t| _d S )Nr   rQ   )r'   r-   r   Z	unary_fnsr   
binary_fns)rS   r(   r(   r)   rT     s    z TestMathPythonPython.setup_classc             C   s   | ` | `d S )N)r'   r-   )rS   r(   r(   r)   rV     s    z#TestMathPythonPython.teardown_classc             O   s4   | j |d< | j|d< |jddd |d< tj||S )Nr'   r-   rM  r   rA   )r'   r-   rN  rH   r   )r`   r  r	  r(   r(   r)   r     s    

zTestMathPythonPython.evalc             C   sv   t dtjjdi}|j}xV|D ]N}| d}| j|}tjdd tt||}W d Q R X tj	||dd q W d S )Nr   rW   z(a)r<  )allF)rn  )
r   r9   r   r	   r   r   errstater6  r   r   )r`   r4   r   r   fnrf   gotr   r(   r(   r)   test_unary_functions  s    


z)TestMathPythonPython.test_unary_functionsc          
   C   sL   xFdD ]>}d| d}t jt|d | d}| j| W d Q R X qW d S )Nr0   r1   "z" is not a supported function)r   z(100))r0   r1   )r#   r   r6   r   )r`   r/   r4   r  r   rf   r(   r(   r)   )test_floor_and_ceil_functions_raise_error  s
    

z>TestMathPythonPython.test_floor_and_ceil_functions_raise_errorc             C   s   t tjjdtjjdd}|j}|j}xZ| jD ]P}| d}| j|}tjdd t	t|||}W d Q R X t
j||dd q2W d S )NrW   )r   r   z(a, b)r<  )r  F)rn  )r   r9   r   r	   r   r   r  r   r  r6  r   r   )r`   r   r   r   r  rf   r  r   r(   r(   r)   test_binary_functions  s    

z*TestMathPythonPython.test_binary_functionsc             C   sd   t tjjdtjjdd}|jd| j| jdd |j}tjtj	|j
|j}tj||dd d S )NrW   )r   r   ze = arctan2(sin(a), b)T)r'   r-   rk  F)rn  )r   r9   r   r	   r   r'   r-   r?   Zarctan2sinr   r   r   r   )r`   r   r  r   r(   r(   r)   test_df_use_case  s    z%TestMathPythonPython.test_df_use_casec             C   s`   t tjjdtjjdd}|jd| j| jdd |j}tj|j	|j
 }tj||dd d S )NrW   )r   r   ze = sin(a + b)T)r'   r-   rk  F)rn  )r   r9   r   r	   r   r'   r-   r?   r  r   r   r   r   )r`   r   r  r   r(   r(   r)    test_df_arithmetic_subexpression
  s
    z5TestMathPythonPython.test_df_arithmetic_subexpressionc             C   s   t dtjjdj|i}|jj|ks*t|jd| j	| j
dd |j}tj|j}|j|jksbt||jkspttj||dd d S )Nr   rW   z
b = sin(a)T)r'   r-   rk  F)rn  )r   r9   r   r	   r   r   r   r   r   r'   r-   r   r  r   r   )r`   r   Zexpect_dtyper   r  r   r(   r(   r)   check_result_type  s    z&TestMathPythonPython.check_result_typec             C   sD   | j tjtj | j tjtj | j tjtj | j tjtj d S )N)r  r9   Zint32r   Zint64r   )r`   r(   r(   r)   test_result_types  s    z&TestMathPythonPython.test_result_typesc             C   s   | j tjtj d S )N)r  r9   Z
complex128)r`   r(   r(   r)   test_result_complex128!  s    z+TestMathPythonPython.test_result_complex128c             C   sJ   t dtjjdi}d}tjt|d |jd| j| j	d W d Q R X d S )Nr   rW   z#"mysin" is not a supported function)r   zmysin(a))r'   r-   )
r   r9   r   r	   r#   r   r6   r   r'   r-   )r`   r   r   r(   r(   r)   test_undefined_func*  s    z(TestMathPythonPython.test_undefined_funcc             C   sJ   t dtjjdi}d}tjt|d |jd| j| j	d W d Q R X d S )Nr   rW   z1Function "sin" does not support keyword arguments)r   zsin(x=a))r'   r-   )
r   r9   r   r	   r#   r   r   r   r'   r-   )r`   r   r   r(   r(   r)   test_keyword_arg1  s    z%TestMathPythonPython.test_keyword_argN)r   r   r   r   rT   rV   r   r  r  r  r  r  r  r  r   r   r  r  r  r(   r(   r(   r)   r    s   
	r  c                   s    e Zd Ze fddZ  ZS )TestMathPythonPandasc                s   t  j  d| _d| _d S )Nr   rQ   )r   rT   r'   r-   )rS   )r   r(   r)   rT   :  s    
z TestMathPythonPandas.setup_class)r   r   r   r   rT   r  r(   r(   )r   r)   r  9  s   r  c                   s    e Zd Ze fddZ  ZS )TestMathNumExprPandasc                s   t  j  d| _d| _d S )Nr    rQ   )r   rT   r'   r-   )rS   )r   r(   r)   rT   B  s    
z!TestMathNumExprPandas.setup_class)r   r   r   r   rT   r  r(   r(   )r   r)   r  A  s   r  c                   s    e Zd Ze fddZ  ZS )TestMathNumExprPythonc                s   t  j  d| _d| _d S )Nr    r   )r   rT   r'   r-   )rS   )r   r(   r)   rT   J  s    
z!TestMathNumExprPython.setup_class)r   r   r   r   rT   r  r(   r(   )r   r)   r  I  s   r  rW   c               @   s$   e Zd Zdd Zdd Zdd ZdS )	TestScopec             C   s$   d}t jtd tj|||d d S )Nz
_var_s * 2rY   )r'   r-   )r   r   _var_srH   r   )r`   r'   r-   r?   r(   r(   r)   test_global_scopeU  s    zTestScope.test_global_scopec             C   sD   d}t  j }tjd|||d t  j }|jd ||ks@td S )NrA   zx + 1)r   r'   r-   lcls)r@  rl  rH   r   rN  r   )r`   r'   r-   r2   r  Zlcls2r(   r(   r)   test_no_new_locals[  s    


zTestScope.test_no_new_localsc             C   s8   d}t  j }tjd||d t  j }||ks4td S )NrA   zx + 1)r'   r-   )globalsrl  rH   r   r   )r`   r'   r-   r2   ZgblsZgbls2r(   r(   r)   test_no_new_globalsc  s
    

zTestScope.test_no_new_globalsN)r   r   r   r  r  r  r(   r(   r(   r)   r  T  s   r  c              C   s8   d} t jt| d tjdddddd W d Q R X d S )	NzInvalid engine 'asdf' passed)r   zx + yrA   rY   )r2   rR  asdf)r   r'   )r#   r   KeyErrorrH   r   )r   r(   r(   r)   test_invalid_enginek  s    r  c              C   s8   d} t jt| d tjdddddd W d Q R X d S )	NzInvalid parser 'asdf' passed)r   zx + yrA   rY   )r2   rR  r  )r   r-   )r#   r   r  rH   r   )r   r(   r(   r)   test_invalid_parserr  s    r  )r   r   rQ   c             C   sV   t | }|j}|d| |}x6|D ].}d}tjt|d t||  W d Q R X q W d S )Nzx + 1znodes are not implemented)r   )_parsersZunsupported_nodesr#   r   r   r6  )r'   r-   ZVisitorClassZuns_opsinstrP  r   r(   r(   r)   test_disallowed_nodes  s    
r  c             C   s2   d}t jtdd tj|| |d W d Q R X d S )Nzs +zinvalid syntax)r   )r'   r-   )r#   r   r   rH   r   )r'   r-   r?   r(   r(   r)   test_syntax_error_exprs  s    r  c             C   s6   d}d}t jt|d tj|| |d W d Q R X d S )Nzs + tzname 's' is not defined)r   )r'   r-   )r#   r   rb  rH   r   )r'   r-   r?   r   r(   r(   r)   test_name_error_exprs  s    r  c             C   s|   d\}}d}xj|D ]b}|dkrJt jtdd tj|| |d	 W d Q R X qt jtd
d tj|| |d	 W d Q R X qW d S )NrA   rY   a + @b@a + b@a + @brQ   zThe '@' prefix is only)r   )r'   r-   zThe '@' prefix is not)rA   rY   )r  r  r  )r#   r   r   rH   r   )r'   r-   r   r   r   Z_exprr(   r(   r)   %test_invalid_local_variable_reference  s    
r  c             C   sd   d\}}| dkr@d}t jt|d tjd| |d W d Q R X n tjd| |d}||| ks`td S )	NrA   rY   r    zVariables in expression .+)r   zsin + dotted_line)r'   r-   )rA   rY   )r#   r   r   rH   r   r   )r'   r-   r  Zdotted_liner   r   r(   r(   r)   test_numexpr_builtin_raises  s    r  c             C   s4   d}t jtdd tjd|| |d W d Q R X d S )N*         @zResolver of type .+)r   z1 + 2)	resolversr'   r-   )r  r  )r#   r   r   rH   r   )r'   r-   Zcannot_resolver(   r(   r)   test_bad_resolver_raises  s    r  c             C   s.   t jtdd tjd| |d W d Q R X d S )Nzexpr cannot be an empty string)r    )r'   r-   )r#   r   r6   rH   r   )r'   r-   r(   r(   r)   test_empty_string_raises  s    r  c             C   s.   t jtdd tjd| |d W d Q R X d S )Nz#only a single expression is allowed)r   z1 + 1; 2 + 2)r'   r-   )r#   r   r   rH   r   )r'   r-   r(   r(   r)   $test_more_than_one_expression_raises  s    r  cmpr   r  r;   r=   c             C   s   t dd ttjji}||   }||   } ||  }d| d| d}d| d| d}d| d| d	}	x@|||	fD ]2}
d
}tjt|d tj	|
||d W d Q R X qtW d S )Nc               S   s   t jjdS )NrW   )r9   r   r   r(   r(   r(   r)   rq     s    z0test_bool_ops_fails_on_scalars.<locals>.<lambda>zlhs z mid z rhsz mid and mid z(lhs z mid) & (mid z rhs)z;cannot evaluate scalar only bool ops|'BoolOp' nodes are not)r   )r'   r-   )
intfloatr9   r   r	   r#   r   r   rH   r   )r;   r  r=   r'   r-   genr   r   r   r   r   r   r(   r(   r)   test_bool_ops_fails_on_scalars  s    


r  otherz'x'z...zGH-28116)r!   )r"   c             C   sN   t ddddgi}|jd|  }tdddgdd}tr>d |_tj|| d S )Nr   r   r   r>   zA == F)r   )r   r   r   r   r   r   r   )r  r   rM   rN   r(   r(   r)   test_equals_various  s    
r  c             C   s*   d}t j}tj|| |d}||ks&td S )Nzinf + 1)r'   r-   )r9   infrH   r   r   )r'   r-   r  rN   rM   r(   r(   r)   test_inf  s    r  c             C   s   d}t jt}tjd| |dd W d Q R X t|dks<t|t|d jksRtt jt}tjd| |dd W d Q R X t|dkst|t|d jkstd S )Nz0The `truediv` parameter in pd.eval is deprecatedz1+1T)r'   r-   r^  rA   r   F)	r   r*  r_  rH   r   rF  r   r7   rG  )r'   r-   r   mr(   r(   r)   test_truediv_deprecated  s    r  c             C   s   t jddgddggddgd}||jdk  }|jd| |d	}tj|| |d
krd}tjt|d |jd| |d	 W d Q R X n|jd| |d	}tj|| d S )Nr   rW   rA   r#  r  count)r   z
~(cat > 0))r'   r-   r   z'Not' nodes are not implemented)r   znot (cat > 0))	rH   r   r  r   r   r   r#   r   r   )r'   r-   r   rN   rM   r   r(   r(   r)   test_negate_lt_eq_le  s    r  c               @   s   e Zd Zdd ZdS )TestValidatec             C   sP   dddddgdg}x8|D ]0}d}t jt|d tjd|d	 W d Q R X qW d S )
NrA   rV  rY   r   g      @z8For argument "inplace" expected type bool, received type)r   z2+2)rk  )r#   r   r6   rH   r   )r`   Zinvalid_valuesvaluer   r(   r(   r)   test_validate_bool_args  s
    
z$TestValidate.test_validate_bool_argsN)r   r   r   r  r(   r(   r(   r)   r    s   r  )r   r  )xZdistutils.versionr   	functoolsr   	itertoolsr   r  typingr   r   r&  Znumpyr9   Znumpy.randomr   r   r	   r#   Zpandas.errorsr
   Zpandas.util._test_decoratorsutilZ_test_decoratorsr   Zpandas.core.dtypes.commonr   r   r   rQ   rH   r   r   r   r   Zpandas._testingZ_testingr   Zpandas.core.computationr   Zpandas.core.computation.checkr   Zpandas.core.computation.enginesr   r   Zpandas.core.computation.exprrI   Zcomputationrf   r   r   r   Z#pandas.core.computation.expressionsr   r   Zpandas.core.computation.opsr   r   r   r   r   Zfixturer'   r  r-   r/   r4   r5   r@   rE   rF   rJ   rO   set
differencerm   Zskip_if_no_nerP   r   r  r  r  r
  r  r  r  rL  r  r  r  r  r  r  r  r  r  r  r  ZPyTablesExprVisitorr7   r%   r   r  r  r  r  r  r  r  r  r  r  r  r$   Zxfailrp  r  r  r  r  r  r(   r(   r(   r)   <module>   s    
	     
     vZ		k&