U
    f/e                 
   @  s0  U d dl mZ d dlmZ d dlm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  m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mZ d dlmZ d d	l m!Z!m"Z" d dl#m$  m%  m&Z& d d
l#m'Z'm(Z(m)Z) d dl*m+Z+m,Z, d dl-m.Z.m/Z/m0Z0m1Z1m2Z2 e
j3dd e!D ddd Z4e
j3e&j5ddd Z6dd Z7e
j3e7 ddd Z8dd Z9dd Z:dd Z;dd Z<d d! Z=d"d# Z>e?e@e.Ae/ZBe
j3eCeDd$dd%d& ZEeEZFeEZGejHG d'd( d(ZIejHG d)d* d*eIZJG d+d, d,eJZKG d-d. d.eKZLd/d0 ZMG d1d2 d2ZNd3d4 ZOd5d6 ZPG d7d8 d8ZQejHG d9d: d:ZRejHG d;d< d<eRZSG d=d> d>eSZTG d?d@ d@eRZUejHG dAdB dBZVG dCdD dDeVZWG dEdF dFeVZXG dGdH dHeVZYe	jZ[dIZ\G dJdK dKZ]ejHdLdM Z^ejHdNdO Z_e)ej`e(dPZadQebdR< e
jcdde!e
jcddeadSdT ZedUdV ZfdWdX Zge
jcddYdZd[d\gd]d^ Zhd_d` Zidadb Zjdcdd Zkdedf Zle
jcddgdhe
jcdd&emenfe
jcddiemenfdjdk Zoe
jcddldme
jpdne
jcjqejr dodpdqgdrds Zsdtdu Ztdvdw Zudxdy ZvG dzd{ d{ZwdS )|    )annotations)reduce)productN)PerformanceWarning)is_boolis_list_like	is_scalar)	DataFrameSeriescompat
date_range)pytables)ENGINESNumExprClobberingError)BaseExprVisitorPandasExprVisitorPythonExprVisitor)NUMEXPR_INSTALLEDUSE_NUMEXPR)ARITH_OPS_SYMSSPECIAL_CASE_ARITH_OPS_SYMS_binary_math_ops_binary_ops_dict_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ZmarksN)pytestparammarkZskipifr   r   .0engine r$   F/tmp/pip-unpacked-wheel-tiezk1ph/pandas/tests/computation/test_eval.py	<genexpr>5   s   	r&   )paramsc                 C  s   | j S Nr   requestr$   r$   r%   r#   4   s    r#   c                 C  s   | j S r(   r)   r*   r$   r$   r%   parserE   s    r,   c                   C  s   t rttS g S r(   )r   listr   r$   r$   r$   r%   _get_unary_fns_for_neJ   s    r.   c                 C  s   | j S r(   r)   r*   r$   r$   r%   unary_fns_for_neN   s    r/   c                 C  s
   t |  jS r(   )r   Zhas_neg_fracr#   r$   r$   r%   engine_has_neg_fracS   s    r1   c              
   C  sh   t | }t|r^z|| |W S  tk
r\ } z"t|drJtj W Y S  W 5 d }~X Y nX || |S )N6negative number cannot be raised to a fractional power)r   r1   
ValueErrorstr
startswithnpnan)lhscmp1rhsr#   cer$   r$   r%   _eval_single_binW   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
   r6   ndarrayndimr8   r:   r$   r$   r%   _series_and_2d_ndarraye   s    rC   c                 C  s(   t | trt |tp&t |to&t | tS r(   )r?   r
   r	   rB   r$   r$   r%   _series_and_framek   s    rD   c                 C  s   t | tot |tjjjS r(   )r?   boolpdcoreZgenericZNDFramerB   r$   r$   r%   _bool_and_frameq   s    rH   c                 C  s   t |ttjfot| S r(   )r?   complexr6   Zcomplexfloatingisnan)resultexpectedr$   r$   r%   _is_py3_complex_incompatu   s    rM      c                 C  sj   t tjdd}tj||dk< t tjddttjdtddtjtjdg|tj f}|| j S )N
   rN         ?r>      )r	   r6   randomrandr7   randnr
   r   )r+   Znan_df1optsr$   r$   r%   r8   }   s    r8   c                
   @  s  e Zd ZU g Zded< g Zded< dZdZedd Z	e
dd	 Z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ejdejdd Zejdejdd Zejded d! Zd"d# Zd$d% Zejd&d' Zejdejd(d) Zejdejd*d+ Zejd
ddgejdddg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(djdEdFZ)dGdH Z*dIdJ Z+dKdL Z,dMdN Z-ejdDe.e/j01dOdPe.e/j0j2dOdQdRe.e/j03dOdPdSkgdTdU Z4ejdDe5e/j01dOe5e/j0j2dOdOdRe5e/j03dOdSkgdVdW Z6dXdY Z7dZd[ Z8ejd\e/j9e/j:gd]d^ Z;d_d` Z<dadb Z=dcdd Z>dedf Z?dgdh Z@diS )kTestEvalNumexprPandas	list[str]exclude_cmpexclude_boolr   pandasc                 C  s   dd l }|| _d S Nr   )r   neclsr\   r$   r$   r%   setup_class   s    z!TestEvalNumexprPandas.setup_classc                   s    fddt D S )Nc                 3  s   | ]}| j kr|V  qd S r(   r0   r!   selfr$   r%   r&      s     
 z8TestEvalNumexprPandas.current_engines.<locals>.<genexpr>)r   r`   r$   r`   r%   current_engines   s    z%TestEvalNumexprPandas.current_enginesr9   z!=z==z<=z>=<>r\   eqlegeltgt)idscmp2binopc                 C  s~   || j krt  t|||| j}t|||| j}t|||| j}d| d| d| d}	tj|	| j| jd}
| |
| d S )N(lhs  rhs) z (lhs  rhs)r#   r,   )	rY   r   skipr=   r#   rF   evalr,   check_equal)ra   r9   rk   rl   r8   r:   lhs_newrhs_newrL   exrK   r$   r$   r%   test_complex_cmp_ops   s    
z*TestEvalNumexprPandas.test_complex_cmp_opscmp_opc                 C  s   || j krt  ttjddttdt f}ttjddttdt f}t||D ]\}}| ||| qdd S )N)rO   rN   size)rN   )	rX   r   rq   r	   tmZrandboolr
   r   check_simple_cmp_op)ra   rx   Z
bool_lhsesZ
bool_rhsesr8   r:   r$   r$   r%   test_simple_cmp_ops   s    
z)TestEvalNumexprPandas.test_simple_cmp_opsopc                 C  s   |  ||| d S r(   )check_binary_arith_op)ra   r~   r8   r:   r+   r$   r$   r%   test_binary_arith_ops   s    z+TestEvalNumexprPandas.test_binary_arith_opsc                 C  s   |  |d| d S )N%)check_modulusra   r8   r:   r$   r$   r%   test_modulus   s    z"TestEvalNumexprPandas.test_modulusc                 C  s   |  |d| d S )N//)check_floor_divisionr   r$   r$   r%   test_floor_division   s    z)TestEvalNumexprPandas.test_floor_divisionc                 C  s   |  |d| d S )N**)	check_powr   r$   r$   r%   test_pow   s    zTestEvalNumexprPandas.test_powc                 C  s"   || j krt  | || d S r(   )rX   r   rq   check_single_invert_op)ra   r~   r8   r$   r$   r%   test_single_invert_op   s    
z+TestEvalNumexprPandas.test_single_invert_opc                 C  s$   || j krt  | ||| d S r(   )rX   r   rq   check_compound_invert_op)ra   r~   r8   r:   r$   r$   r%   test_compound_invert_op   s    
z-TestEvalNumexprPandas.test_compound_invert_opc                 C  s   |  ||||| d S r(   )check_chained_cmp_op)ra   r9   rk   r8   midhsr:   r$   r$   r%   test_chained_cmp_op   s    z)TestEvalNumexprPandas.test_chained_cmp_opc                 C  sZ   t |trt|| n>t |tr0t|| n&t |tjrJt|| n||ksVt	d S r(   )
r?   r	   r{   assert_frame_equalr
   assert_series_equalr6   r@   assert_numpy_array_equalAssertionError)ra   rK   rL   r$   r$   r%   rs      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}|	|
|fD ]$}tj| j jd}t|| qd S )Nc                   s   t | || jS r(   )r=   r#   )leftrightrx   r`   r$   r%   check_operands   s    zBTestEvalNumexprPandas.check_chained_cmp_op.<locals>.check_operandslhs  mid  rhs mid and mid rm    mid) & (mid ro   &rp   )r=   r#   rF   rr   r,   r{   assert_almost_equal)ra   r8   r9   midrk   r:   r   rt   ru   ex1ex2ex3rL   rv   rK   r$   r`   r%   r      s    z*TestEvalNumexprPandas.check_chained_cmp_opc              	   C  s   d| d}d}|dkrXt |sXtjt|d" tj|| j| j||dd W 5 Q R X n0t|||| j}tj|| j| jd}| 	|| d S )	Nr   r   zonly 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matchrB   r#   r,   
local_dictrp   )
r   r   raises	TypeErrorrF   rr   r#   r,   r=   rs   )ra   r8   r9   r:   rv   msgrL   rK   r$   r$   r%   r|     s    z)TestEvalNumexprPandas.check_simple_cmp_opc                 C  s   d| d}t j|| j| jd}t|||| j}t|| d| d| d}t j|| j| jd}t|||| j}| |||| d S )Nr   r   rp   z rhs )rF   rr   r#   r,   r=   r{   r   check_alignment)ra   r8   arith1r:   rv   rK   rL   nlhsr$   r$   r%   r     s    z+TestEvalNumexprPandas.check_binary_arith_opc              
   C  sT   z| |\}}W n tttfk
r,   Y n$X | jd| d}t|j| d S Nznlhs z ghs)	alignr3   r   AttributeErrorr\   evaluater{   r   valuesra   rK   r   Zghsr~   rL   r$   r$   r%   r   &  s    z%TestEvalNumexprPandas.check_alignmentc                 C  sz   d| d}t j|| j| jd}|| }t|| | jd| d}t|t	t
frft|j| nt||  d S )Nr   r   rp   z	expected )rF   rr   r#   r,   r{   r   r\   r   r?   r	   r
   r   itemra   r8   r   r:   rv   rK   rL   r$   r$   r%   r   8  s    z#TestEvalNumexprPandas.check_modulusc              	   C  s~   d| d}| j dkr@tj|| j | jd}|| }| || n:d}tjt|d" tj|||d| j | jd W 5 Q R X d S )	Nr   r   pythonrp   zGunsupported operand type\(s\) for //: 'VariableNode' and 'VariableNode'r   rB   r   r#   r,   )r#   rF   rr   r,   rs   r   r   r   )ra   r8   r   r:   rv   resrL   r   r$   r$   r%   r   D  s    
z*TestEvalNumexprPandas.check_floor_divisionc              
   C  sn   zt |d|| j}W nT tk
rh } z6t|drV| jdkrNtt| qXtj}n W 5 d }~X Y nX |S )Nr   r2   r   )	r=   r#   r3   r4   r5   r   rq   r6   r7   )ra   r8   r:   rL   r<   r$   r$   r%   get_expected_pow_resultX  s    
z-TestEvalNumexprPandas.get_expected_pow_resultc              	   C  s   d| d}|  ||}tj|| j| jd}t|rrt|rrt||rrd}tjt	|d t
|| W 5 Q R X nRt
|| d| d| d}tj|| j| jd}|  |  |||}t
|| d S )Nr   r   rp   z-(DataFrame.columns|numpy array) are differentr   rm   rn   )r   rF   rr   r#   r,   r   rM   r   r   r   r{   r   r   )ra   r8   r   r:   rv   rL   rK   r   r$   r$   r%   r   g  s(    
 zTestEvalNumexprPandas.check_powc              	   C  s   z| t}W n$ tk
r2   tt|g}Y nX | }tjd| j| jd}t	
|| | jD ]}t	
|tjd|| jd q`d S )Nz~elbrp   )astyperE   r   r6   arrayrF   rr   r#   r,   r{   r   rb   )ra   elemr9   ZelbrL   rK   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 5 Q R X nt |rt |rtd	d
 ||f\}}t	|||| j}t |r| }n| }tj|| j| jd}t
|| | jD ]$}	tj|| j| jd}
t
|
| qd S )Nr   r   z~(lhs ro   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 iterabler   rB   r   c                 S  s   t | gS r(   )r6   r   xr$   r$   r%   <lambda>      z@TestEvalNumexprPandas.check_compound_invert_op.<locals>.<lambda>rp   )r   r   r   r   rF   rr   r#   r,   mapr=   r{   r   rb   )ra   r8   r9   r:   Z
skip_theserv   r   rL   rK   r#   Zevr$   r$   r%   r     s.    
z.TestEvalNumexprPandas.check_compound_invert_opr8   c                 C  s   | | S r(   r$   )ra   r~   var_namer$   r$   r%   rv     s    zTestEvalNumexprPandas.exc              	   C  s  |  d}ttjdd}| jdkrZd}tjt|d t	j
|| j| jd}W 5 Q R X n2d}tjt|d t	j
|| j| jd}W 5 Q R X ttjjdd	d
}| jdkrd}tjt|d t	j
|| j| jd}W 5 Q R X n&| }t	j
|| j| jd}t|| ttjdddk}| }t	j
|| j| jd}t|| tdddgtjddkd}| jdkrtjtdd t	j
|| j| jd}W 5 Q R X n2d}tjt|d t	j
|| j| jd}W 5 Q R X d S )N~rN   rQ   r   -couldn't find matching opcode for 'invert_dd'r   rp   0ufunc 'invert' not supported for the input typesrN   rQ   ry   )couldn't find matching opcode for 'invertrP   ar>          @   )br;   unknown type object#bad operand type for unary ~: 'str')rv   r	   r6   rR   rT   r#   r   r   NotImplementedErrorrF   rr   r,   r   randintr{   r   rS   r3   ra   exprr8   r   rK   expectr$   r$   r%   test_frame_invert  s8    

 
   z'TestEvalNumexprPandas.test_frame_invertc              	   C  s  |  d}ttjd}| jdkrXd}tjt|d t	j
|| j| jd}W 5 Q R X n2d}tjt|d t	j
|| j| jd}W 5 Q R X ttjjddd}| jdkrd	}tjt|d t	j
|| j| jd}W 5 Q R X n&| }t	j
|| j| jd}t|| ttjdd
k}| }t	j
|| j| jd}t|| tdddg}| jdkrtjtdd t	j
|| j| jd}W 5 Q R X n2d}tjt|d t	j
|| j| jd}W 5 Q R X d S )Nr   rN   r   r   r   rp   r   ry   r   rP   r   r>   r   r   r   )rv   r
   r6   rR   rT   r#   r   r   r   rF   rr   r,   r   r   r{   r   rS   r3   r   r$   r$   r%   test_series_invert  s8    

 
  z(TestEvalNumexprPandas.test_series_invertc              	   C  s   |  d}ttjdd}| }tj|| j| jd}t	
|| ttjjddd}| }tj|| j| jd}t	
|| ttjdddk}| jdkrd	}tjt|d
 tj|| j| jd}W 5 Q R X n&| }tj|| j| jd}t	
|| d S )N-rN   rQ   rp   r   ry   rP   r   *couldn't find matching opcode for 'neg_bb'r   )rv   r	   r6   rR   rT   rF   rr   r#   r,   r{   r   r   rS   r   r   r   ra   r   r8   r   rK   r   r$   r$   r%   test_frame_negate  s"    

 z'TestEvalNumexprPandas.test_frame_negatec              	   C  s   |  d}ttjd}| }tj|| j| jd}t	
|| ttjjddd}| }tj|| j| jd}t	
|| ttjddk}| jdkrd}tjt|d tj|| j| jd}W 5 Q R X n&| }tj|| j| jd}t	
|| d S )	Nr   rN   rp   ry   rP   r   r   r   )rv   r
   r6   rR   rT   rF   rr   r#   r,   r{   r   r   rS   r   r   r   r   r$   r$   r%   test_series_negate'  s"    

 z(TestEvalNumexprPandas.test_series_negaterN   rQ   r   ry   rP   c                 C  s2   |  d}|}tj|| j| jd}t|| d S N+rp   )rv   rF   rr   r#   r,   r{   r   ra   r8   r   r   rK   r$   r$   r%   test_frame_posA  s    
z$TestEvalNumexprPandas.test_frame_posc                 C  s2   |  d}|}tj|| j| jd}t|| d S r   )rv   rF   rr   r#   r,   r{   r   r   r$   r$   r%   test_series_posS  s    
z%TestEvalNumexprPandas.test_series_posc              	   C  sr  d}t jt|d tjd| j| jd W 5 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s2ttjd| j| jddksPttjd| j| jddksntd S )Nz%bad operand type for unary ~: 'float'r   z~1.0rp   z-1.0r,   r#   g      z+1.0      ?z~1z-1z+1r>   z~Truez~Falsez-Truez-Falser   z+Truez+False)r   r   r   rF   rr   r#   r,   r   )ra   r   r$   r$   r%   test_scalar_unarye  s    z'TestEvalNumexprPandas.test_scalar_unaryc                 C  s:   t t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]r   Tr   r>   r   Fi%   idtype)r{   r   rF   rr   r6   r   Zobject_r`   r$   r$   r%   test_unary_in_arrayv  s*    z)TestEvalNumexprPandas.test_unary_in_arrayr   c                 C  s\   t dtjdg|di}|d}|jtdgks8t|d}|jtdgksXtd S )Nr   r   r   zx < -0.1Fz-5 > x)r	   r6   r   rr   r   r   )ra   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dddtt jddf\}}}}|D ]6}d	}tjt|d
 tj|| j	| j
d W 5 Q R X qRd S )N)z1 or 2z1 and 2)za and bza or b)z1 or 2 and (3 + 2) > 3)z2 * x > 2 or 1 and 2)z2 * df > 3 and 1 or ar   r>   rQ   ;cannot evaluate scalar only bool ops|'BoolOp' nodes are notr   rp   )r6   rR   rT   r	   r   r   r   rF   rr   r#   r,   )ra   exprsr   r   r   r   rv   r   r$   r$   r%   test_disallow_scalar_bool_ops  s    *z3TestEvalNumexprPandas.test_disallow_scalar_bool_opsc                 C  sf  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}|rtt|stt|sttdg}t jd| j| jd}t	
|tdg |jdksttdg}t jd| j| jd}t	
|tdg |jdksttdg}t jd| j| jd}t	
|tdg |jdksbtd S )Nr>   r   rp   g      ?F)r>   )rF   rr   r#   r,   r   r   r   r6   r   r{   r   shape)ra   r   rK   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 rp      )rF   rr   r#   r,   r   )ra   exprK   r$   r$   r%   test_line_continuation  s    z,TestEvalNumexprPandas.test_line_continuationc                 C  s   d}t j|| j| jd}t|}||ks.ttddddgi}d}|d|d	}|j	s`td
}|d|d	}|j
ddgd d f }t|| d}|d|d	}|j
dgd d f }t|| d S )Nz1000000000.006rp   Ag~  eAg$  eAg'1  eAg  eAzA < z.4fg   eAzA > r>   rQ   A == )rF   rr   r#   r,   r6   float64r   r	   queryemptylocr{   r   )ra   r   rK   rL   r   cutoffexactr$   r$   r%   test_float_truncation  s     

z+TestEvalNumexprPandas.test_float_truncationc              	   C  sx   t dddggdddgd}d}tjt|d |d W 5 Q R X t  }d	|j_tjt|d |d
 W 5 Q R X d S )Nr   Zfoobarclasscolumnsz4Python keyword not valid identifier in numexpr queryr   z
class == 0lambdazlambda == 0)r	   r   r   SyntaxErrorr   indexnamera   r   r   r$   r$   r%   test_disallow_python_keywords  s    z3TestEvalNumexprPandas.test_disallow_python_keywordsN)r8   )A__name__
__module____qualname__rX   __annotations__rY   r#   r,   classmethodr_   propertyrb   r   r    parametrizer   BOOL_OPS_SYMSrw   CMP_OPS_SYMSr}   _good_arith_opsr   r   r   tdskip_if_windowsr   r   r   r   rs   r   r|   r   r   r   r   r   r   r   r   rv   r   r   r   r   r	   r6   rR   rT   r   rS   r   r
   r   r   r   float32r   r   r   r   r   r   r  r$   r$   r$   r%   rV      s   








#
+/


	!rV   c                      s@   e Zd ZddgZddgZdZdZe fddZd	d
 Z	  Z
S )TestEvalNumexprPythonr   r   andorr   r   c                   s   t    dd l}|| _d S r[   )superr_   r   r\   r]   	__class__r$   r%   r_     s    
z!TestEvalNumexprPython.setup_classc              	   C  sH   d| d| d}d}t jt|d tj|| j| jd W 5 Q R X d S )Nr   r   r   "'BoolOp' nodes are not implementedr   rp   )r   r   r   rF   rr   r#   r,   )ra   r8   r9   r   rk   r:   r   r   r$   r$   r%   r     s    z*TestEvalNumexprPython.check_chained_cmp_op)r  r	  r
  rX   rY   r#   r,   r  r_   r   __classcell__r$   r$   r  r%   r    s   r  c                   @  s$   e Zd ZdZdZdd Zdd ZdS )TestEvalPythonPythonr   c                 C  sT   d| d}t j|| j| jd}|| }t|| t|||| j}t|| d S )Nr   r   rp   )rF   rr   r#   r,   r{   r   r=   r   r$   r$   r%   r     s    z"TestEvalPythonPython.check_modulusc              
   C  sN   z| |\}}W n tttfk
r,   Y nX td| d}t|| d S r   )r   r3   r   r   rr   r{   r   r   r$   r$   r%   r     s    z$TestEvalPythonPython.check_alignmentN)r  r	  r
  r#   r,   r   r   r$   r$   r$   r%   r  	  s   
r  c                   @  s   e Zd ZdZdZdd ZdS )TestEvalPythonPandasr   rZ   c                 C  s   t | ||||| d S r(   )rV   r   )ra   r8   r9   r   rk   r:   r$   r$   r%   r   '  s    z)TestEvalPythonPandas.check_chained_cmp_opN)r  r	  r
  r#   r,   r   r$   r$   r$   r%   r  #  s   r  c                  O  s
   t j S r(   )r6   rR   rT   )argskwargsr$   r$   r%   r   +  r   r   c                   @  sB   e Zd Zejddddddgejdejejgdd	 Z	d
S )TestTypeCastingr~   r   r   *r   /dtc                 C  s   t jddt|d}d| d}tj|||d}|jj|ks>t|jj|ksNtt |t| d| d}tj|||d}|jj|kst|jj|kstt |t| d S )	NrN   r   )
data_gen_fr   df z 3rp   z3  df)	r{   makeCustomDataframefrF   rr   r   r   r   r   )ra   r#   r,   r~   r$  r   sr   r$   r$   r%   test_binop_typecasting3  s    z&TestTypeCasting.test_binop_typecastingN)
r  r	  r
  r   r    r  r6   r  r   r+  r$   r$   r$   r%   r!  2  s   r!  c                 C  s   t | jjtjS r(   )
issubclassr   typer6   Z
datetime64r   r$   r$   r%   _is_datetimeJ  s    r.  c                  G  s0   t tt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_warnN  s    r3  c                   @  s  e Zd ZdddgZedg Zdd Zejdeejdeejd	ed
d Z	ejdeejd	edd Z
ejdeejdeejdeejdedd Zejdddgejd	eejdedd Zejdddgdd Zejd	eejdeejdddgejdddgdd  Zejdeejdeejdeejde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 ||d  d S )Nzdf * ~2rN   r   )r%  rp   )r{   r(  r)  rF   rr   r   )ra   r#   r,   r*  r   r   r$   r$   r%   test_align_nested_unary_opY  s    z(TestAlignment.test_align_nested_unary_oplr_idx_typerr_idx_type
c_idx_typec           	   
   C  s   t jdd t dt tjddt||d}tjddt||d}t|j|jrxt	t t
jd||d}W 5 Q R X nt
jd||d}t|||  W 5 Q R X d S )	NTrecordalwaysrO   r%  
r_idx_typer;     zdf + df2rp   warningscatch_warningssimplefilterRuntimeWarningr{   r(  r)  r3  r  assert_produces_warningrF   rr   r   )	ra   r#   r,   r9  r:  r;  r   df2r   r$   r$   r%   test_basic_frame_alignment_  s*            z(TestAlignment.test_basic_frame_alignmentr@  c                 C  st   t jddt||d}tjd||d}t ||dk  ttjj	|j
 |j|jd}tjd||d}t |||k  d S )NrO   r?  df < 2rp   rQ   )r  r  zdf < df3)r{   r(  r)  rF   rr   r   r	   r6   rR   rT   r   r  r  )ra   r#   r,   r@  r;  r   r   df3r$   r$   r%   test_frame_comparisonv  s        z#TestAlignment.test_frame_comparisonr1c1r2c2c              
   C  s   t jdd t dt tjddt||d}tjddt||d}tjddt||d}	t|j|j|	jrt	t t
jd	||d
}
W 5 Q R X nt
jd	||d
}
t|
|| |	  W 5 Q R X d S )NTr<  r>  r   rQ   r?     rN   zdf + df2 + df3rp   rB  )ra   r#   r,   rM  rN  rO  rP  r   rH  rK  r   r$   r$   r%   #test_medium_complex_frame_alignment  s8                z1TestAlignment.test_medium_complex_frame_alignment
index_namer  r  c              	     sB    fdd}t jdd t dt |||| W 5 Q R X d S )Nc              	     s   t jddt| |d}t||}ttjd|d d }t|j	|j	rnt 
t tjd d}W 5 Q R X ntjd d}| dks|dkr dkr||n|| }n|| }t || d S )NrO   r?  rN   df + srp   r$  r   r{   r(  r)  getattrr
   r6   rR   rT   r3  r  rG  rF  rF   rr   addr   r@  r;  rS  r   r  r*  r   rL   rp   r$   r%   testit  s"        
z?TestAlignment.test_basic_frame_series_alignment.<locals>.testitTr<  r>  )rC  rD  rE  rF  )ra   r#   r,   rS  r@  r;  rY  r$   rp   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}tjdd, tdt |D ]\}}|||| qBW 5 Q R X t d	gd	g}tjdd, tdt |D ]\}}|||| qW 5 Q R X d S )
Nc              	     s   t jddt| |d}t||}ttjd|d d }t|j	|j	rnt 
t tjd d}W 5 Q R X ntjd d}| dks|dkr dkr||n|| }n|| }t || d S )	NrO      r?  rN   zs + dfrp   r$  r   rU  rX  rp   r$   r%   rY    s"        
z?TestAlignment.test_basic_series_frame_alignment.<locals>.testitr5  r6  r*  Tr<  ignorer$  )r   rC  rD  rE  rF  )ra   r#   r,   rS  rY  r  r@  r;  r$   rp   r%   !test_basic_series_frame_alignment  s    z/TestAlignment.test_basic_series_frame_alignmentr~   r   r"  c              
   C  s   t jdd t dt tjddt||d}t||}tt	j
d|d d }	d| d}
d	| d
}t|j|	jrtt tj|
||d}W 5 Q R X tt tj|||d}W 5 Q R X n tj|
||d}tj|||d}|dkr|dkr|dkrt|| W 5 Q R X d S )NTr<  r>  rO   r?  rN   zs r'  r&  z srp   r$  r   )rC  rD  rE  rF  r{   r(  r)  rV  r
   r6   rR   rT   r3  r  rG  rF   rr   r   )ra   r#   r,   rS  r~   r@  r;  r   r  r*  r8   r:   r   r   r$   r$   r%   test_series_frame_commutativity  s.        

z-TestAlignment.test_series_frame_commutativityc              
   C  s  dd l }d}d}	d|	 }
tjdd\ tdt |dd	g}|d
dg}tj|	|t||d}tj|
|t||d}t	t
 ||}ttj ||d | }|dks|dkr|dkr||}q|| }n|| }|dks|dkr|dkr||}n|| }n|| }t|j|j|jrPtt tjd||d}W 5 Q R X ntjd||d}|j|jksrtt|| W 5 Q R X d S )Nr   r   rN   rQ   Tr<  r>  r  r  r   rH  r?  r$  r   zdf2 + ser + dfrp   )rR   rC  rD  rE  rF  choicer{   r(  r)  rV  localsgetr
   r6   rT   rW  r3  r  rG  rF   rr   r   r   r   )ra   r#   r,   rM  rN  rO  rP  rR   nm1m2rS  Zobj_namer   rH  r  ZserZ	expected2rL   r   r$   r$   r%   #test_complex_series_frame_alignment   sP            


z1TestAlignment.test_complex_series_frame_alignmentc              	   C  s  t tjdd}ttjd}|dkr0t}nd}t| tj	d||d W 5 Q R X ttjd}td tj	d||d W 5 Q R X t tjdd}ttjd}td tj	d||d W 5 Q R X t tjdd}ttjd}|dk}|st}nd}t|n}tj	d||d |st
|d	ksFtt|d
 j}	t|j|jd	  }
d|
dd}|	|kstW 5 Q R X d S )Ni  rO   i'  r   FrT  rp   r   r>   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	   r6   rR   rT   r
   r   r{   rG  rF   rr   lenr   r4   messagelog10rz   r   )ra   r#   r,   r   r*  seenZis_python_engineZwrnwr   ZloggedrL   r$   r$   r%   +test_performance_warning_for_poor_alignment2  s:    z9TestAlignment.test_performance_warning_for_poor_alignmentN)r  r	  r
  Zindex_typesZlhs_index_typesr8  r   r    r  rI  rL  rR  rZ  r]  r^  re  rk  r$   r$   r$   r%   r4  T  s@   


%.r4  c                
   @  s  e Zd ZU g Zded< dZdZedd Zdd Z	d	d
 Z
ejdddgejdddgejdejdd Zejdddgejdddgejdej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d0d1 Z d2d3 Z!d4d5 Z"d6d7 Z#ejd8d9d:d9d;ge$%g d<gej&d=d>d? Z'ejd8d9d:d<gd@dA Z(ejdBd9d:d9d;ge$%g d<d9d;igdCdD Z)dEdF Z*dGdH Z+dIdJ Z,dKdL Z-dMdN Z.dOS )PTestOperationsNumExprPandasrW   exclude_arithr   rZ   c                   s     fddt jt j D  _d S )Nc                   s   g | ]}| j kr|qS r$   )rm  r"   r~   r^   r$   r%   
<listcomp>l  s   
z;TestOperationsNumExprPandas.setup_class.<locals>.<listcomp>)r   r   r  	arith_opsro  r$   ro  r%   r_   j  s    

z'TestOperationsNumExprPandas.setup_classc                 O  s4   | j |d< | j|d< |ddd |d< tj||S Nr#   r,   levelr   r>   r#   r,   poprF   rr   ra   r  r   r$   r$   r%   rr   r  s    

z TestOperationsNumExprPandas.evalc           
   
   C  s   dd | j D }|D ]}d| d}d| d}d| d}|dkrzd}tjt|d	 tj|| j| jd
 W 5 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d S )Nc                 s  s   | ]}|d kr|V  qdS )r   Nr$   rn  r$   r$   r%   r&   y  s      zDTestOperationsNumExprPandas.test_simple_arith_ops.<locals>.<genexpr>z1 z 1zx z (x + 1)r   z&argument of type 'int' is not iterabler   rp   r>   r   r   )
rq  r   r   r   rF   rr   r#   r,   r=   r   )
ra   opsr~   rv   r   r   r   expecr   yr$   r$   r%   test_simple_arith_opsx  s8    
       z1TestOperationsNumExprPandas.test_simple_arith_opsr:   TFr8   r~   c                 C  s6   | d| d| }|  |}t |}||ks2td S N rr   r   ra   r:   r8   r~   rv   r   r   r$   r$   r%   test_simple_bool_ops  s    
z0TestOperationsNumExprPandas.test_simple_bool_opsc                 C  s6   | d| d| }|  |}t |}||ks2td S r{  r}  r~  r$   r$   r%   test_bool_ops_with_constants  s    
z8TestOperationsNumExprPandas.test_bool_ops_with_constantsc              	   C  sX   t jdddd}tt jd}d}tjt|d | jd||d	d
 W 5 Q R X d S )Nr   rQ  rN      rO   z?N-dimensional objects, where N > 2, are not supported with evalr   x + yr   ry  r   )r6   rR   rT   r
   r   r   r   rr   )ra   r   ry  r   r$   r$   r%   test_4d_ndarray_fails  s
    z1TestOperationsNumExprPandas.test_4d_ndarray_failsc                 C  s   |  d}|dkstd S )N1r>   r}  )ra   r   r$   r$   r%   test_constant  s    
z)TestOperationsNumExprPandas.test_constantc                 C  s4   t tjdd}| jdd|id}t|| d S )NrO   rQ   r   r  r	   r6   rR   rT   rr   r{   r   )ra   r   rH  r$   r$   r%   test_single_variable  s    z0TestOperationsNumExprPandas.test_single_variablec              	   C  s`  t dg}d}d|i}tt | j|dd}W 5 Q R X t|t dg tt | j|dd}W 5 Q R X t|t dg tt | jddd}W 5 Q R X d	}||ksttt | jddd}W 5 Q R X d	}||ksttt | jd
dd}W 5 Q R X d	}||ks&ttt | jd
dd}W 5 Q R X d	}||ks\td S )Nr>   zs / 1r*  F)truedivr   Tz1 / 2rP   zs / 2)r6   r   r{   rG  FutureWarningrr   r   r   )ra   r*  rv   dr   rx  r$   r$   r%   test_truediv  s2    z(TestOperationsNumExprPandas.test_truedivc              	   C  s:   t tjdd}tjtdd | d W 5 Q R X d S )NrN   r   zname 'x' is not definedr   zdf[x > 2] > 2)r	   r6   rR   rT   r   r   	NameErrorrr   )ra   r   r$   r$   r%   &test_failing_subscript_with_name_error  s    zBTestOperationsNumExprPandas.test_failing_subscript_with_name_errorc                 C  sD   t tjdd}| jdd|id}|d |dk }t|| d S )NrN   r   z(df + 1)[df > 2]r   r  r>   rQ   r  ra   r   rK   rL   r$   r$   r%   test_lhs_expression_subscript  s    z9TestOperationsNumExprPandas.test_lhs_expression_subscriptc                 C  s   t tjddtdd}d}|j|jk }d}|j|j |j }d}|j|j |j|jdk   }|||f}|||f}	t||	D ]"\}
}t	
|| j|
d	|id
 q~d S )NrN   r   abcr   zdf.a < df.bzdf.a + df.b + df.czdf.a + df.b + df.c[df.b < 0]r   r   r  )r	   r6   rR   rT   r-   r   r   r;   zipr{   r   rr   )ra   r   expr1Zexpec1Zexpr2Zexpec2Zexpr3Zexpec3r   Zexpecsr<   rx  r$   r$   r%   test_attr_expression  s    

z0TestOperationsNumExprPandas.test_attr_expressionc              	   C  sf   t tjddtdd}t tjdd}d}d}tjt|d | j|||dd	 W 5 Q R X d S )
NrN   r   r  r   zdf = df2%cannot assign without a target objectr   )r   rH  r  )	r	   r6   rR   rT   r-   r   r   r3   rr   )ra   r   rH  r  r   r$   r$   r%   test_assignment_fails  s    z1TestOperationsNumExprPandas.test_assignment_failsc              	     s  t tjddtdd   tjtdd  	d W 5 Q R X d}tjt|d  	d	 W 5 Q R X t
jrzd
}nd}tjt|d  	d W 5 Q R X  }|d |d  |d<    j	ddd t |  }|d |d  |d<    j	ddd t | fdd}|   }d|d  |d< t |    fdd}|     j	ddd d}tjt|d  	d W 5 Q R X   | j	dd i dd  }|d |d  |d< t | d S )NrN   rQ   abr   invalid syntaxr   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   	a = a + bTinplacer;   	c = a + bc                    s      } d}| jddd | S )Nr>   z	a = 1 + bTr  )copyrr   )r   r   )orig_dfr$   r%   r)    s    z=TestOperationsNumExprPandas.test_assignment_column.<locals>.fr>   c                    sJ   d}  j  } jddd | j }tj| j dd |jd ksFtd S )Nr>   r  Tr  FZcheck_names)r   r  rr   r   r{   r   r  r   )r   Zold_arK   )r   r$   r%   r)  )  s    

z#can only assign a single expressionz	c = a = bzc = df.a + df.br   )r   targetr  )r	   r6   rR   rT   r-   r  r   r   r  rr   r   PY38r{   r   )ra   r   rL   r)  r$   )r   r  r%   test_assignment_column  sP    z2TestOperationsNumExprPandas.test_assignment_columnc                 C  s6   t dgdgd}|d}tdg}t|| d S )N   ir   r   za in [11, -32]T)r	   rr   r
   r{   r   r  r$   r$   r%   test_column_inA  s    

z*TestOperationsNumExprPandas.test_column_inc                 C  s`   t tjddtdd}|jddd}|d k	s4t| }|d |d	  |d
< t	|| d S )NrN   rQ   r  r   r  Fr  r   r   r;   )
r	   r6   rR   rT   r-   rr   r   r  r{   r   )ra   r   actualrL   r$   r$   r%   assignment_not_inplaceH  s    z2TestOperationsNumExprPandas.assignment_not_inplacec              	   C  s   t dddgdddgd}| }|d |d	  |d
< |d
 |d	  |d< |jddd}t|| |d kspt|d d |d< |d d |d< |jddd}t|| |d kstd}tjt|d |jddd W 5 Q R X d S )Nr>   rQ   r   rQ  rN   r  r  r   r   r;   r  $
        c = a + b
        d = c + bTr  r<   $
        a = a - 1
        e = a + 2z@Multi-line expressions are only valid if all expressions containr   z(
            a = b + 2
            b - 2F)	r	   r  rr   r{   r   r   r   r   r3   )ra   r   rL   answerr   r$   r$   r%   test_multi_line_expressionS  s0    z6TestOperationsNumExprPandas.test_multi_line_expressionc                 C  s   t dddgdddgd}| }|d |d	  |d
< |d
 |d	  |d< |jddd}t|| |d d |d< |d d |d< |jddd}t|| d S )Nr>   rQ   r   rQ  rN   r  r  r   r   r;   r  r  Fr  r<   r  )r	   r  rr   r{   r   ra   r   rL   r$   r$   r%   &test_multi_line_expression_not_inplacex  s     zBTestOperationsNumExprPandas.test_multi_line_expression_not_inplacec                 C  sp   t dddgdddgd}| }d}|d	 | |d
< |d
 | |d< |jddd}t|| |d ksltd S )Nr>   rQ   r   rQ  rN   r  r  r[  r   r;   r  z?
        c = a * @local_var
        d = c + @local_var
        Tr  r	   r  rr   r{   r   r   )ra   r   rL   Z	local_varr  r$   r$   r%   )test_multi_line_expression_local_variable  s    zETestOperationsNumExprPandas.test_multi_line_expression_local_variablec                 C  s   t dddgdddgd}dd	 }| }|d
 |dd |d< |d |dd |d< |jddd}t|| |d ks|td S )Nr>   rQ   r   rQ  rN   r  r  c                 S  s   |S r(   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)
        Tr  r  ra   r   r  rL   r  r$   r$   r%   2test_multi_line_expression_callable_local_variable  s    zNTestOperationsNumExprPandas.test_multi_line_expression_callable_local_variablec                 C  s   t dddgdddgd}dd	 }| }|d
 |ddd |d< |d |ddd |d< |jddd}t|| |d kstd S )Nr>   rQ   r   rQ  rN   r  r  c                 S  s   |S r(   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)
        Tr  r  r  r$   r$   r%   >test_multi_line_expression_callable_local_variable_with_kwargs  s    zZTestOperationsNumExprPandas.test_multi_line_expression_callable_local_variable_with_kwargsc              	   C  sZ   t dddgdddgd}| }d}tjt|d	 |d
 W 5 Q R X t|| d S )Nr>   rQ   r   rQ  rN   r  r  r  r   za = 1)r	   r  r   r   r3   r   r{   r   )ra   r   Zdf_origr   r$   r$   r%   test_assignment_in_query  s    z4TestOperationsNumExprPandas.test_assignment_in_queryc                 C  sx   t dddgdddgd}| }||d dk }|jd	d
d t|| i }ddi}| jd|d
d t|| d S )Nr>   rQ   r   rQ  rN   r  r  r   za == 2Tr  	a = 1 + 2r  r  )r	   r  r   r{   r   rr   Zassert_dict_equalr  r$   r$   r%   test_query_inplace  s    z.TestOperationsNumExprPandas.test_query_inplaceinvalid_targetr>   catrQ   )r>   r   zignore::FutureWarningc              	   C  sj   d}d}t jt|d | j||dd W 5 Q R X t|drft jt|d | j||dd W 5 Q R X d S )Nz)Cannot assign expression output to targetr  r   Tr  r  F)r   r   r3   rr   hasattrra   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 5 Q R X d S )Nz"Cannot return a copy of the targetr  r   Fr  )r   r   r3   rr   r  r$   r$   r%   test_cannot_copy_item  s    z1TestOperationsNumExprPandas.test_cannot_copy_itemr  c              	   C  sN   d}| j ||dddkstd}tjt|d | j ||dd W 5 Q R X d S )N1 + 2Fr  r   z0Cannot operate inplace if there is no assignmentr   T)rr   r   r   r   r3   )ra   r  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 || t || d S )NrQ   pr5  r%  r;  r@  rJ  r   r  r{   r(  r)  rr   r   )ra   r   r<   rr   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 || d S )	NrQ   r  r5  r  zdf[df < 2 + 3]r   r  rN   r  ra   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 || d S )NrQ   r  r5  r  zdf[df[df < 2] < 2] + df * 2r   r  r  r  r$   r$   r%   -test_nested_period_index_subscript_expression  s    zITestOperationsNumExprPandas.test_nested_period_index_subscript_expressionc                 C  sZ   t tjdd}tddd|d< | jdd|i| j| jd}|jd	k }t	j
||d
d d S )NrN   r   z1/1/2012)Zperiodsdates1zdf.dates1 < 20130101r   r   Z20130101Fr  )r	   r6   rR   rT   r   rr   r#   r,   r  r{   r   )ra   r   r   rx  r$   r$   r%   test_date_boolean  s    
z-TestOperationsNumExprPandas.test_date_booleanc              	   C  sL  | j dkr,tjd| j| j d}|s(ttjd| j| j d}|sDttjd| j| j d}|r`t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}|r
ttjd| j| j d}|sHtnd}tjt|d tjd| j| j d W 5 Q R X tjt|d tjd| j| j d W 5 Q R X tjt|d tjd| j| j d W 5 Q R X tjt|d tjd| j| j d W 5 Q R X d}tjt|d tjd| j| j d W 5 Q R X tjt|d tjd| j| j d W 5 Q R X d S )Nr   z1 in [1, 2]rp   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 implementedr   z[(3,)] in (1, 2, [(3,)])z!'NotIn' nodes are not implementedz[3] not in (1, 2, [[3]]))r,   rF   rr   r#   r   r   r   r   )ra   r   r   r$   r$   r%   test_simple_in_ops#  sf      
      z.TestOperationsNumExprPandas.test_simple_in_opsN)/r  r	  r
  rm  r  r#   r,   r  r_   rr   rz  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  r6   r   filterwarningsr  r  r  r  r  r  r  r  r$   r$   r$   r%   rl  c  sZ   

#G%	 

&
	
rl  c                   @  s   e Zd ZU ddgZded< dZdZdd Zd	d
 Zdd Z	dd Z
dd Zdd Zejdddgejdddgejdejdd Zejdddgejdddgejdejdd ZdS )TestOperationsNumExprPythonr   r   rW   rm  r   r   c                 C  s6   d}d d}d}tj|| j| jd}||ks2td S )Nr>   z * Z!aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarp   )joinrF   rr   r#   r,   r   )ra   r   r   rL   r   r$   r$   r%   test_check_many_exprsb  s
    
z1TestOperationsNumExprPython.test_check_many_exprsc              	   C  sN   t tjdd}d}tjt|d  tjdd|i| j	| j
d W 5 Q R X d S )NrN   r   r  r   zdf > 2 and df > 3r   r   r,   r#   r	   r6   rR   rT   r   r   r   rF   rr   r,   r#   r  r$   r$   r%   test_fails_andi  s    z*TestOperationsNumExprPython.test_fails_andc              	   C  sN   t tjdd}d}tjt|d  tjdd|i| j	| j
d W 5 Q R X d S )NrN   r   r  r   zdf > 2 or df > 3r   r  r  r  r$   r$   r%   test_fails_ort  s    z)TestOperationsNumExprPython.test_fails_orc              	   C  sN   t tjdd}d}tjt|d  tjdd|i| j	| j
d W 5 Q R X d S )NrN   r   'Not' nodes are not implementedr   z
not df > 2r   r  r  r  r$   r$   r%   test_fails_not  s    z*TestOperationsNumExprPython.test_fails_notc              	   C  sL   t tjdd}d}d}tjt|d tj|| j	| j
d W 5 Q R X d S )NrN   r   z(df + 2)[df > 1] > 0 & (df > 0)$cannot evaluate scalar only bool opsr   r   r  ra   r   rv   r   r$   r$   r%   test_fails_ampersand  s
    z0TestOperationsNumExprPython.test_fails_ampersandc              	   C  sL   t tjdd}d}d}tjt|d tj|| j	| j
d W 5 Q R X d S )NrN   r   z(df + 2)[df > 1] > 0 | (df > 0)r  r   r   r  r  r$   r$   r%   test_fails_pipe  s
    z+TestOperationsNumExprPython.test_fails_piper:   TFr8   r~   c              	   C  sh   | d| d| }|dkrFd}t jt|d | | W 5 Q R X n| |}t|}||ksdtd S )Nr|  r  r  r  r   )r   r   r   rr   r   ra   r8   r:   r~   rv   r   r   r   r$   r$   r%   r    s    
z8TestOperationsNumExprPython.test_bool_ops_with_constantsc              	   C  st   d| d}|dkrHd}t jt|d tj|| j| jd W 5 Q R X n(tj|| j| jd}t|}||ksptd S )Nr   r   r  r  r   rp   )r   r   r   rF   rr   r#   r,   r   r  r$   r$   r%   r    s     z0TestOperationsNumExprPython.test_simple_bool_opsN)r  r	  r
  rm  r  r#   r,   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dZdZdS )TestOperationsPythonPythonr   Nr  r	  r
  r#   r,   r$   r$   r$   r%   r    s   r  c                   @  s"   e Zd ZU g Zded< dZdZdS )TestOperationsPythonPandasrW   rm  r   rZ   N)r  r	  r
  rm  r  r#   r,   r$   r$   r$   r%   r    s   
r  c                   @  sx   e Zd ZdZdZdd Zdd Zej	de
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 )TestMathPythonPythonr   rZ   c                 O  s4   | j |d< | j|d< |ddd |d< tj||S rr  rt  rv  r$   r$   r%   rr     s    

zTestMathPythonPython.evalc              	   C  sl   t dtjdi}|j}|}| d}| |}tjdd tt||}W 5 Q R X tj	||dd d S )Nr   rO   z(a)r\  allFr  )
r	   r6   rR   rT   r   rr   errstaterV  r{   r   )ra   r/   r   r   fnr   gotr   r$   r$   r%   test_unary_functions  s    

z)TestMathPythonPython.test_unary_functionsr  c              	   C  sz   t tjdtjdd}|j}|j}| d}| |}tjdd tt|||}W 5 Q R X t	j
||dd d S )NrO   r  z(a, b)r\  r  Fr  )r	   r6   rR   rT   r   r   rr   r  rV  r{   r   )ra   r  r   r   r   r   r  r   r$   r$   r%   test_binary_functions  s    

z*TestMathPythonPython.test_binary_functionsc                 C  sd   t tjdtjdd}|jd| j| jdd |j}tt	|j
|j}tj||dd d S )NrO   r  ze = arctan2(sin(a), b)Tr#   r,   r  Fr  )r	   r6   rR   rT   rr   r#   r,   r<   Zarctan2sinr   r   r{   r   ra   r   r  r   r$   r$   r%   test_df_use_case  s    z%TestMathPythonPython.test_df_use_casec                 C  s`   t tjdtjdd}|jd| j| jdd |j}t|j	|j
 }tj||dd d S )NrO   r  ze = sin(a + b)Tr  Fr  )r	   r6   rR   rT   rr   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d|i}|jj|ks*t|jd| j	| j
dd |j}t|j}|j|jksbt||jkspttj||dd d S )Nr   rO   z
b = sin(a)Tr  Fr  )r	   r6   rR   rT   r   r   r   r   rr   r#   r,   r   r  r{   r   )ra   r   Zexpect_dtyper   r  r   r$   r$   r%   check_result_type  s    z&TestMathPythonPython.check_result_typec                 C  sD   |  tjtj |  tjtj |  tjtj |  tjtj d S r(   )r  r6   Zint32r   Zint64r  r`   r$   r$   r%   test_result_types  s    z&TestMathPythonPython.test_result_typesc                 C  s   |  tjtj d S r(   )r  r6   Z
complex128r`   r$   r$   r%   test_result_complex128  s    z+TestMathPythonPython.test_result_complex128c              	   C  sJ   t dtjdi}d}tjt|d |jd| j| j	d W 5 Q R X d S )Nr   rO   z#"mysin" is not a supported functionr   zmysin(a)rp   )
r	   r6   rR   rT   r   r   r3   rr   r#   r,   r  r$   r$   r%   test_undefined_func  s    z(TestMathPythonPython.test_undefined_funcc              	   C  sJ   t dtjdi}d}tjt|d |jd| j| j	d W 5 Q R X d S )Nr   rO   z1Function "sin" does not support keyword argumentsr   zsin(x=a)rp   )
r	   r6   rR   rT   r   r   r   rr   r#   r,   r  r$   r$   r%   test_keyword_arg  s    z%TestMathPythonPython.test_keyword_argN)r  r	  r
  r#   r,   rr   r  r   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dZdZdS )TestMathPythonPandasr   rZ   Nr  r$   r$   r$   r%   r    s   r  c                   @  s   e Zd ZdZdZdS )TestMathNumExprPandasr   rZ   Nr  r$   r$   r$   r%   r  $  s   r  c                   @  s   e Zd ZdZdZdS )TestMathNumExprPythonr   r   Nr  r$   r$   r$   r%   r  )  s   r  rO   c                   @  s$   e Zd Zdd Zdd Zdd ZdS )	TestScopec                 C  s$   d}t td tj|||d d S )Nz
_var_s * 2rQ   rp   )r{   r   _var_srF   rr   )ra   r#   r,   r<   r$   r$   r%   test_global_scope2  s
     zTestScope.test_global_scopec                 C  sD   d}t   }tjd|||d t   }|d ||ks@td S )Nr>   x + 1r   lcls)r`  r  rF   rr   ru  r   )ra   r#   r,   r   r  Zlcls2r$   r$   r%   test_no_new_locals8  s    


zTestScope.test_no_new_localsc                 C  s8   d}t   }tjd||d t   }||ks4td S )Nr>   r  rp   )globalsr  rF   rr   r   )ra   r#   r,   r   ZgblsZgbls2r$   r$   r%   test_no_new_globals@  s
    

zTestScope.test_no_new_globalsN)r  r	  r
  r  r  r  r$   r$   r$   r%   r  1  s   r  c               	   C  s8   d} t jt| d tjdddddd W 5 Q R X d S )	NzInvalid engine 'asdf' passedr   r  r>   rQ   r  asdf)r   r#   r   r   KeyErrorrF   rr   r   r$   r$   r%   test_invalid_engineH  s    r  c               	   C  s8   d} t jt| d tjdddddd W 5 Q R X d S )	NzInvalid parser 'asdf' passedr   r  r>   rQ   r  r  )r   r,   r  r   r$   r$   r%   test_invalid_parserO  s    r  )r   r   rZ   z dict[str, type[BaseExprVisitor]]_parsersc              
   C  sN   t | }|d| |}|jD ].}d}tjt|d t||  W 5 Q R X qd S )Nr  znodes are not implementedr   )r  Zunsupported_nodesr   r   r   rV  )r#   r,   ZVisitorClassinstrw  r   r$   r$   r%   test_disallowed_nodes]  s    
r  c              	   C  s2   d}t jtdd tj|| |d W 5 Q R X d S )Nzs +r  r   rp   r   r   r  rF   rr   )r#   r,   r<   r$   r$   r%   test_syntax_error_exprsj  s    r  c              	   C  s6   d}d}t jt|d tj|| |d W 5 Q R X d S )Nzs + tzname 's' is not definedr   rp   )r   r   r  rF   rr   )r#   r,   r<   r   r$   r$   r%   test_name_error_exprsp  s    r  expressza + @bz@a + bz@a + @bc              	   C  sj   d\}}|dkr<t jtdd tj|| |d W 5 Q R X n*t jtdd tj|| |d W 5 Q R X d S )Nr>   rQ   rZ   zThe '@' prefix is onlyr   rp   zThe '@' prefix is notr  )r#   r,   r	  r   r   r$   r$   r%   %test_invalid_local_variable_referencew  s    r  c              	   C  sd   d\}}| dkr@d}t jt|d tjd| |d W 5 Q R X n tjd| |d}||| ks`td S )Nr
  r   zVariables in expression .+r   zsin + dotted_linerp   )r   r   r   rF   rr   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 5 Q R X d S )N)*   g      @zResolver of type .+r   r  )Z	resolversr#   r,   )r   r   r   rF   rr   )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 5 Q R X d S )Nzexpr cannot be an empty stringr    rp   r   r   r3   rF   rr   rp   r$   r$   r%   test_empty_string_raises  s    r  c              	   C  s.   t jtdd tjd| |d W 5 Q R X d S )Nz#only a single expression is allowedr   z1 + 1; 2 + 2rp   r  rp   r$   r$   r%   $test_more_than_one_expression_raises  s    r  cmpr  r:   c              
   C  s   t dd ttjji}||   }||   } ||  }d| d| d}d| d| d}d| d| d	}	|||	fD ]2}
d
}tjt|d tj	|
||d W 5 Q R X qrd S )Nc                   S  s   t jdS )NrO   )r6   rR   r   r$   r$   r$   r%   r     r   z0test_bool_ops_fails_on_scalars.<locals>.<lambda>r   r   r   r   rm   r   ro   r   r   rp   )
intfloatr6   rR   rT   r   r   r   rF   rr   )r8   r  r:   r#   r,   genr   r   r   r   rv   r   r$   r$   r%   test_bool_ops_fails_on_scalars  s    


r  otherz'x'z...zGH-28116r   r   c                 C  sN   t ddddgi}|d|  }tdddgdd}tr>d |_t|| d S )Nr   r   r   r;   r   F)r  )r	   rr   r
   r   r  r{   r   )r  r   rK   rL   r$   r$   r%   test_equals_various  s    
r  c                 C  s*   d}t j}tj|| |d}||ks&td S )Nzinf + 1rp   )r6   infrF   rr   r   )r#   r,   r*  rL   rK   r$   r$   r%   test_inf  s    r  c              	   C  s   d}t t}tjd| |dd W 5 Q R X t|dks<t|t|d jksRtt t}tjd| |dd W 5 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  r>   r   F)	r{   rG  r  rF   rr   rf  r   r4   rg  )r#   r,   r   mr$   r$   r%   test_truediv_deprecated  s    r  c              	   C  s   t ddgddggddgd}||jdk  }|jd| |d	}t|| |d
krd}tjt|d |jd| |d	 W 5 Q R X n|jd| |d	}t|| d S )Nr   rO   r>   rA  r  countr   z
~(cat > 0)rp   r   r  r   znot (cat > 0))r	   r  r   r{   r   r   r   r   )r#   r,   r   rL   rK   r   r$   r$   r%   test_negate_lt_eq_le  s    r  c                   @  s0   e Zd Zejddddddgdgdd Zd	S )
TestValidatevaluer>   TruerQ   r   g      @c              	   C  s0   d}t jt|d tjd|d W 5 Q R X d S )Nz8For argument "inplace" expected type bool, received typer   z2+2r  r  )ra   r!  r   r$   r$   r%   test_validate_bool_args  s    z$TestValidate.test_validate_bool_argsN)r  r	  r
  r   r    r  r#  r$   r$   r$   r%   r     s   r   )x
__future__r   	functoolsr   	itertoolsr   r0  rC  Znumpyr6   r   Zpandas.errorsr   Zpandas.util._test_decoratorsutilZ_test_decoratorsr  Zpandas.core.dtypes.commonr   r   r   rZ   rF   r	   r
   r   r   Zpandas._testingZ_testingr{   Zpandas.core.computationr   Zpandas.core.computation.enginesr   r   Zpandas.core.computation.exprrG   Zcomputationr   r   r   r   Z#pandas.core.computation.expressionsr   r   Zpandas.core.computation.opsr   r   r   r   r   Zfixturer#   ZPARSERSr,   r.   r/   r1   r=   rC   rD   rH   rM   sortedset
differencer  r-   ranger8   r:   r   Zskip_if_no_nerV   r  r  r  r)  r!  r.  r3  r4  rl  r  r  r  r  r  r  r  rR   rT   r  r  r  r  ZPyTablesExprVisitorr  r  r    r  r  r  r  r  r  r  r  r  r  r  r  r   Zxfailr  r  r  r  r  r   r$   r$   r$   r%   <module>   s    		



    e     zY]


 	
