o
    g                 
   @  s.  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
jcddYg dZd[d\ Zhd]d^ Zid_d` Zjdadb Zkdcdd Zle
jcddedfe
jcdd&emenfe
jcddgemenfdhdi Zoe
jcddjdke
jpdle
jcjqejr dmdndogdpdq Zsdrds Ztdtdu Zudvdw ZvG dxdy dyZwdS )z    )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@    | ]}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markskipifr   r   .0engine r&   `/home/ubuntu/cloudmapper/venv/lib/python3.10/site-packages/pandas/tests/computation/test_eval.py	<genexpr>5   s    	
r(   )paramsc                 C     | j S Nr    requestr&   r&   r'   r%   4   s   r%   c                 C  r*   r+   r,   r-   r&   r&   r'   parserE      r/   c                   C  s   t rttS g S r+   )r   listr   r&   r&   r&   r'   _get_unary_fns_for_neJ      r2   c                 C  r*   r+   r,   r-   r&   r&   r'   unary_fns_for_neN   r0   r4   c                 C  s
   t |  jS r+   )r   has_neg_fracr%   r&   r&   r'   engine_has_neg_fracS   s   
r7   c              
   C  sb   t | }t|r,z|| |W S  ty+ } zt|dr&tjW  Y d }~S  d }~ww || |S )N6negative number cannot be raised to a fractional power)r   r7   
ValueErrorstr
startswithnpnan)lhscmp1rhsr%   cer&   r&   r'   _eval_single_binW   s   
rC   c                 C  s@   t | tot |tjo|jdkpt |tot | tjo| jdkS )N   )
isinstancer
   r<   ndarrayndimr>   r@   r&   r&   r'   _series_and_2d_ndarraye   s   rI   c                 C  s(   t | tr
t |tpt |tot | tS r+   )rE   r
   r	   rH   r&   r&   r'   _series_and_framek   s   rJ   c                 C  s   t | tot |tjjjS r+   )rE   boolpdcoregenericNDFramerH   r&   r&   r'   _bool_and_frameq      rP   c                 C  s   t |ttjfot| S r+   )rE   complexr<   complexfloatingisnan)resultexpectedr&   r&   r'   _is_py3_complex_incompatu   rQ   rW      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
   rX         ?rD      )r	   r<   randomrandr=   randnr
   r    )r.   nan_df1optsr&   r&   r'   r>   }   s   
r>   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
g dg d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d*d+ Zd,d- Z d.d/ Z!d0d1 Z"d2d3 Z#d4d5 Z$d6d7 Z%d8d9 Z&d:d; Z'd<d= Z(ddd?d@Z)dAdB Z*dCdD Z+dEdF Z,dGdH Z-ejd>e.e/j01dIdJe.e/j0j2dIdKdLe.e/j03dIdJdMkgdNdO Z4ejd>e5e/j01dIe5e/j0j2dIdIdLe5e/j03dIdMkgdPdQ Z6dRdS Z7dTdU Z8ejdVe/j9e/j:gdWdX Z;dYdZ Z<d[d\ Z=d]d^ Z>d_d` Z?dadb Z@dcS )eTestEvalNumexprPandas	list[str]exclude_cmpexclude_boolr   pandasc                 C  s   dd l }|| _d S Nr   )r   neclsrg   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+   r6   r#   selfr&   r'   r(      s    z8TestEvalNumexprPandas.current_engines.<locals>.<genexpr>)r   rk   r&   rk   r'   current_engines      z%TestEvalNumexprPandas.current_enginesr?   )z!=z==z<=z>=<>)rg   eqlegeltgt)idscmp2rp   ro   ru   rt   binopc                 C  s~   || j v 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/   )	rd   r   skiprC   r%   rL   evalr/   check_equal)rl   r?   rw   rx   r>   r@   lhs_newrhs_newrV   exrU   r&   r&   r'   test_complex_cmp_ops   s   
z*TestEvalNumexprPandas.test_complex_cmp_opscmp_opc                 C  s   || j v r	t  ttjddttdt f}ttjddttdt f}t||D ]\}}| ||| q2d S )N)rY   rX   size)rX   )	rc   r   r}   r	   tmrandboolr
   r   check_simple_cmp_op)rl   r   
bool_lhses
bool_rhsesr>   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)rl   r   r>   r@   r.   r&   r&   r'   test_binary_arith_ops   rn   z+TestEvalNumexprPandas.test_binary_arith_opsc                 C     |  |d| d S )N%)check_modulusrl   r>   r@   r&   r&   r'   test_modulus      z"TestEvalNumexprPandas.test_modulusc                 C  r   )N//)check_floor_divisionr   r&   r&   r'   test_floor_division   r   z)TestEvalNumexprPandas.test_floor_divisionc                 C  r   )N**)	check_powr   r&   r&   r'   test_pow   s   zTestEvalNumexprPandas.test_powc                 C  s"   || j v r	t  | || d S r+   )rc   r   r}   check_single_invert_op)rl   r   r>   r&   r&   r'   test_single_invert_op   s   
z+TestEvalNumexprPandas.test_single_invert_opc                 C  s$   || j v r	t  | ||| d S r+   )rc   r   r}   check_compound_invert_op)rl   r   r>   r@   r&   r&   r'   test_compound_invert_op   s   
z-TestEvalNumexprPandas.test_compound_invert_opc                 C  s   |  ||||| d S r+   )check_chained_cmp_op)rl   r?   rw   r>   midhsr@   r&   r&   r'   test_chained_cmp_op   s   z)TestEvalNumexprPandas.test_chained_cmp_opc                 C  s`   t |trt|| d S t |trt|| d S t |tjr(t|| d S ||ks.J d S r+   )	rE   r	   r   assert_frame_equalr
   assert_series_equalr<   rF   assert_numpy_array_equal)rl   rU   rV   r&   r&   r'   r      s   

z!TestEvalNumexprPandas.check_equalc                   s    fdd}||||}||||}|d urU|d urWd| d| d}	d| d| d}
d| d| d	}t |d
| j}|	|
|fD ]}tj| j jd}t|| qBd S d S d S )Nc                   s   t | || jS r+   )rC   r%   )leftrightr   rk   r&   r'   check_operands   r3   zBTestEvalNumexprPandas.check_chained_cmp_op.<locals>.check_operandslhs  mid  rhs mid and mid ry    mid) & (mid r{   &r|   )rC   r%   rL   r~   r/   r   assert_almost_equal)rl   r>   r?   midrw   r@   r   r   r   ex1ex2ex3rV   r   rU   r&   rk   r'   r      s   z*TestEvalNumexprPandas.check_chained_cmp_opc                 C  s   d| d}d}|dv r8t |s8tjt|d tj|| j| j||dd W d    d S 1 s1w   Y  d S t|||| 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matchrH   r%   r/   
local_dictr|   )
r   r   raises	TypeErrorrL   r~   r%   r/   rC   r   )rl   r>   r?   r@   r   msgrV   rU   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   r|   z rhs )rL   r~   r%   r/   rC   r   r   check_alignment)rl   r>   arith1r@   r   rU   rV   nlhsr&   r&   r'   r     s   z+TestEvalNumexprPandas.check_binary_arith_opc              
   C  sT   z	| |\}}W n tttfy   Y d S w | jd| d}t|j| d S Nznlhs z ghs)	alignr9   r   AttributeErrorrg   evaluater   r   valuesrl   rU   r   ghsr   rV   r&   r&   r'   r   &  s   z%TestEvalNumexprPandas.check_alignmentc                 C  s|   d| d}t j|| j| jd}|| }t|| | jd| d}t|t	t
fr4t|j| d S t||  d S )Nr   r   r|   z	expected )rL   r~   r%   r/   r   r   rg   r   rE   r	   r
   r   itemrl   r>   r   r@   r   rU   rV   r&   r&   r'   r   8  s   z#TestEvalNumexprPandas.check_modulusc                 C  s   d| d}| j dkr!tj|| j | jd}|| }| || d S d}tjt|d tj|||d| j | jd W d    d S 1 sDw   Y  d S )	Nr   r   pythonr|   zGunsupported operand type\(s\) for //: 'VariableNode' and 'VariableNode'r   rH   r   r%   r/   )r%   rL   r~   r/   r   r   r   r   )rl   r>   r   r@   r   resrV   r   r&   r&   r'   r   D  s   
"z*TestEvalNumexprPandas.check_floor_divisionc              
   C  s~   zt |d|| j}W |S  ty> } z't|dr+| jdkr'tt| ntj}n W Y d }~|S W Y d }~|S d }~ww )Nr   r8   r   )	rC   r%   r9   r:   r;   r   r}   r<   r=   )rl   r>   r@   rV   rB   r&   r&   r'   get_expected_pow_resultX  s"   


z-TestEvalNumexprPandas.get_expected_pow_resultc                 C  s   d| d}|  ||}tj|| j| jd}t|rEt|rEt||rEd}tjt	|d t
|| W d    d S 1 s>w   Y  d S t
|| d| d| d}tj|| j| jd}|  |  |||}t
|| d S )Nr   r   r|   z-(DataFrame.columns|numpy array) are differentr   ry   rz   )r   rL   r~   r%   r/   r   rW   r   r   AssertionErrorr   r   r   )rl   r>   r   r@   r   rV   rU   r   r&   r&   r'   r   g  s(   "zTestEvalNumexprPandas.check_powc              	   C  s   z| t}W n ty   tt|g}Y nw | }tjd| j| jd}t	
|| | jD ]}t	
|tjd|| jd q/d S )Nz~elbr|   )astyperK   r   r<   arrayrL   r~   r%   r/   r   r   rm   )rl   elemr?   elbrV   rU   r%   r&   r&   r'   r   ~  s   
z,TestEvalNumexprPandas.check_single_invert_opc                 C  s  ddg}d| d}d}t |r<||v r<tjt|d tj|| j| j||dd W d    d S 1 s5w   Y  d S t |rOt |rOtd	d
 ||f\}}t	|||| j}t |r_| }n| }tj|| j| jd}t
|| | jD ]}	tj|| j| jd}
t
|
| qud S )Nr   r   z~(lhs r{   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   rH   r   c                 S  s   t | gS r+   )r<   r   xr&   r&   r'   <lambda>      z@TestEvalNumexprPandas.check_compound_invert_op.<locals>.<lambda>r|   )r   r   r   r   rL   r~   r%   r/   maprC   r   r   rm   )rl   r>   r?   r@   
skip_theser   r   rV   rU   r%   evr&   r&   r'   r     s2   "	
z.TestEvalNumexprPandas.check_compound_invert_opr>   c                 C  s   | | S r+   r&   )rl   r   var_namer&   r&   r'   r     s   zTestEvalNumexprPandas.exc                 C  s:  |  d}ttjdd}| jdkr7d}tjt|d t	j
|| j| jd}W d    n1 s1w   Y  n#d}tjt|d t	j
|| j| jd}W d    n1 sUw   Y  ttjjdd	d
}| jdkrd}tjt|d t	j
|| j| jd}W d    n1 sw   Y  n| }t	j
|| j| jd}t|| ttjdddk}| }t	j
|| j| jd}t|| tg dtjddkd}| jdkrtjtdd t	j
|| j| jd}W d    d S 1 sw   Y  d S d}tjt|d t	j
|| j| jd}W d    d S 1 sw   Y  d S )N~rX   r[   r   -couldn't find matching opcode for 'invert_dd'r   r|   0ufunc 'invert' not supported for the input typesrX   r[   r   )couldn't find matching opcode for 'invertrZ   arD   g       @   )brA   unknown type object#bad operand type for unary ~: 'str')r   r	   r<   r\   r^   r%   r   r   NotImplementedErrorrL   r~   r/   r   randintr   r   r]   r9   rl   exprr>   r   rU   expectr&   r&   r'   test_frame_invert  sF   



"$z'TestEvalNumexprPandas.test_frame_invertc                 C  s$  |  d}ttjd}| jdkr6d}tjt|d t	j
|| j| jd}W d    n1 s0w   Y  n#d}tjt|d t	j
|| j| jd}W d    n1 sTw   Y  ttjjddd}| jdkrd	}tjt|d t	j
|| j| jd}W d    n1 sw   Y  n| }t	j
|| j| jd}t|| ttjdd
k}| }t	j
|| j| jd}t|| tg d}| jdkrtjtdd t	j
|| j| jd}W d    d S 1 sw   Y  d S d}tjt|d t	j
|| j| jd}W d    d S 1 sw   Y  d S )Nr   rX   r   r   r   r|   r   r   r   rZ   r   r   r   )r   r
   r<   r\   r^   r%   r   r   r   rL   r~   r/   r   r   r   r   r]   r9   r   r&   r&   r'   test_series_invert  sF   



"$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rtd	}tjt|d
 tj|| j| jd}W d    d S 1 smw   Y  d S | }tj|| j| jd}t	
|| d S )N-rX   r[   r|   r   r   rZ   r   *couldn't find matching opcode for 'neg_bb'r   )r   r	   r<   r\   r^   rL   r~   r%   r/   r   r   r   r]   r   r   r   rl   r   r>   r   rU   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rrd}tjt|d tj|| j| jd}W d    d S 1 skw   Y  d S | }tj|| j| jd}t	
|| d S )	Nr   rX   r|   r   rZ   r   r   r   )r   r
   r<   r\   r^   rL   r~   r%   r/   r   r   r   r]   r   r   r   r   r&   r&   r'   test_series_negate'  s$   

"z(TestEvalNumexprPandas.test_series_negaterX   r[   r   r   rZ   c                 C  2   |  d}|}tj|| j| jd}t|| d S N+r|   )r   rL   r~   r%   r/   r   r   rl   r>   r   r   rU   r&   r&   r'   test_frame_posA     
z$TestEvalNumexprPandas.test_frame_posc                 C  r   r   )r   rL   r~   r%   r/   r   r   r   r&   r&   r'   test_series_posS  r   z%TestEvalNumexprPandas.test_series_posc                 C  s~  d}t jt|d tjd| j| jd W d    n1 sw   Y  tjd| j| jddks1J tjd| j| jdd	ks?J tjd
| j| jddksMJ tjd| j| jddks[J tjd| j| jddksiJ tjd| j| jddkswJ tjd| j| jddksJ tjd| j| jddksJ tjd| j| jddksJ tjd| j| jddksJ tjd| j| jddksJ d S )Nz%bad operand type for unary ~: 'float'r   z~1.0r|   z-1.0r/   r%   g      z+1.0      ?z~1z-1z+1rD   z~Truez~Falsez-Truez-Falser   z+Truez+False)r   r   r   rL   r~   r%   r/   )rl   r   r&   r&   r'   test_scalar_unarye  s    z'TestEvalNumexprPandas.test_scalar_unaryc                 C  s&   t tdtjg dtjd d S )NzK[-True, True, ~True, +True,-False, False, ~False, +False,-37, 37, ~37, +37])r   Tr   rD   r   Fr   r   i%   ir   dtype)r   r   rL   r~   r<   r   object_rk   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sJ |d}|jtdgks,J d S )Nr   r   r   zx < -0.1Fz-5 > x)r	   r<   r   r~   r   )rl   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 ]%}d	}tjt|d
 tj|| j	| j
d W d    n1 sIw   Y  q)d 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   rD   r[   ;cannot evaluate scalar only bool ops|'BoolOp' nodes are notr   r|   )r<   r\   r^   r	   r   r   r   rL   r~   r%   r/   )rl   exprsr   r   r   r  r   r   r&   r&   r'   test_disallow_scalar_bool_ops  s   *z3TestEvalNumexprPandas.test_disallow_scalar_bool_opsc                 C  sb  d}t jd| j| jd}|dksJ t|sJ d}t jd| j| jd}|dks*J t|s0J d}t jd| j| jd}|r@J t|sFJ t|sLJ tdg}t jd| j| jd}t	|tdg |j
dksmJ tdg}t jd| j| jd}t	|tdg |j
dksJ tdg}t jd| j| jd}t	|tdg |j
dksJ d S )NrD   r   r|   g      ?F)rD   )rL   r~   r%   r/   r   r   r<   r   r   r   shape)rl   r   rU   r&   r&   r'   test_identical  s2   z$TestEvalNumexprPandas.test_identicalc                 C  s(   d}t j|| j| jd}|dksJ d S )Nz1 + 2 *         5 - 1 + 2 r|      )rL   r~   r%   r/   )rl   exprU   r&   r&   r'   test_line_continuation  s   z,TestEvalNumexprPandas.test_line_continuationc                 C  s   d}t j|| j| jd}t|}||ksJ tdg di}d}|d|d}|js/J 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.006r|   A)g~  eA$  eAg'1  eAg  eAzA < z.4fg   eAzA > rD   r[   r  A == )rL   r~   r%   r/   r<   float64r	   queryemptylocr   r   )rl   r  rU   rV   r  cutoffexactr&   r&   r'   test_float_truncation  s    

z+TestEvalNumexprPandas.test_float_truncationc                 C  s   t g dgg dd}d}tjt|d |d W d    n1 s$w   Y  t  }d|j_tjt|d |d W d    d S 1 sHw   Y  d S )	N)r   r   r   )foobarclasscolumnsz4Python keyword not valid identifier in numexpr queryr   z
class == 0lambdazlambda == 0)r	   r   r   SyntaxErrorr  indexnamerl   r  r   r&   r&   r'   test_disallow_python_keywords  s   "z3TestEvalNumexprPandas.test_disallow_python_keywordsN)r>   )A__name__
__module____qualname__rc   __annotations__rd   r%   r/   classmethodrj   propertyrm   r   r!   parametrizer   BOOL_OPS_SYMSr   CMP_OPS_SYMSr   _good_arith_opsr   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   r   r  float32r  r  r  r	  r  r  r!  r&   r&   r&   r'   ra      s   
 








#+/


	!ra   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 rf   )superrj   r   rg   rh   	__class__r&   r'   rj     s   

z!TestEvalNumexprPython.setup_classc                 C  s^   d| d| d}d}t jt|d tj|| j| jd W d    d S 1 s(w   Y  d S )Nr   r   r   "'BoolOp' nodes are not implementedr   r|   r   r   r   rL   r~   r%   r/   )rl   r>   r?   r   rw   r@   r   r   r&   r&   r'   r     s
   "z*TestEvalNumexprPython.check_chained_cmp_op)r"  r#  r$  rc   rd   r%   r/   r&  rj   r   __classcell__r&   r&   r3  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   r|   )rL   r~   r%   r/   r   r   rC   r   r&   r&   r'   r     s   z"TestEvalPythonPython.check_modulusc              
   C  sN   z	| |\}}W n tttfy   Y d S w td| d}t|| d S r   )r   r9   r   r   r~   r   r   r   r&   r&   r'   r     s   z$TestEvalPythonPython.check_alignmentN)r"  r#  r$  r%   r/   r   r   r&   r&   r&   r'   r8  	  s
    
r8  c                   @  s   e Zd ZdZdZdd ZdS )TestEvalPythonPandasr   re   c                 C  s   t | ||||| d S r+   )ra   r   )rl   r>   r?   r   rw   r@   r&   r&   r'   r   '  s   z)TestEvalPythonPandas.check_chained_cmp_opN)r"  r#  r$  r%   r/   r   r&   r&   r&   r'   r9  #  s    r9  c                  O  s
   t j S r+   )r<   r\   r^   )argskwargsr&   r&   r'   r   +  s   
 r   c                   @  s<   e Zd Zejdg d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J |jj|ks'J t |t| d| d}tj|||d}|jj|ksEJ |jj|ksMJ t |t| d S )	NrX   r   )
data_gen_fr   df z 3r|   z3  df)r   makeCustomDataframefrL   r~   r   r   r   )rl   r%   r/   r   r?  r  sr   r&   r&   r'   test_binop_typecasting3  s   z&TestTypeCasting.test_binop_typecastingN)
r"  r#  r$  r   r!   r(  r<   r.  r  rF  r&   r&   r&   r'   r<  2  s    r<  c                 C  s   t | jjtjS r+   )
issubclassr   typer<   
datetime64r   r&   r&   r'   _is_datetimeJ  r3   rJ  c                  G  s0   t ttd|  }ttjtt| }|o|S )Nis_monotonic)anyr   operator
attrgetterr   xorrJ  )r:  not_monoonly_one_dtr&   r&   r'   should_warnN  s   rR  c                   @  s  e Zd Zg d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?  rE  c                 C  s8   d}t jddtd}tj|||d}t ||d  d S )Nzdf * ~2rX   r   )r@  r|   )r   rC  rD  rL   r~   r   )rl   r%   r/   rE  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X t dt tjddt||d}tjddt||d}t|j|jrFt	t t
jd||d}W d    n1 s@w   Y  nt
jd||d}t|||  W d    d S 1 saw   Y  d S )	NTrecordalwaysrY   r@  
r_idx_typerZ     zdf + df2r|   warningscatch_warningssimplefilterRuntimeWarningr   rC  rD  rR  r  assert_produces_warningrL   r~   r   )	rl   r%   r/   rX  rY  rZ  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 )NrY   r^  df < 2r|   r[   )r  r  zdf < df3)r   rC  rD  rL   r~   r   r	   r<   r\   r^   r  r  r  )rl   r%   r/   r_  rZ  r  r   df3r&   r&   r'   test_frame_comparisonv  s   
z#TestAlignment.test_frame_comparisonr1c1r2c2c              	   C  s   t jddf 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rRt	t t
jd	||d
}
W d    n1 sLw   Y  nt
jd	||d
}
t|
|| |	  W d    d S 1 sow   Y  d S )NTr[  r]  r   r[   r^     rX   zdf + df2 + df3r|   ra  )rl   r%   r/   rl  rm  rn  ro  r  rg  rj  r   r&   r&   r'   #test_medium_complex_frame_alignment  s&   


"z1TestAlignment.test_medium_complex_frame_alignment
index_namer  r  c                   sX    fdd}t jdd t dt |||| W d    d S 1 s%w   Y  d S )Nc                   s   t jddt| |d}t||}ttjd|d d }t|j	|j	rAt 
t tjd d}W d    n1 s;w   Y  ntjd d}| dksQ|dkr_ dkrZ||n|| }n|| }t || d S )NrY   r^  rX   df + sr|   r?  r   r   rC  rD  getattrr
   r<   r\   r^   rR  r  rf  re  rL   r~   addr   r_  rZ  rr  r  r  rE  r   rV   r|   r&   r'   testit  s   

z?TestAlignment.test_basic_frame_series_alignment.<locals>.testitTr[  r]  )rb  rc  rd  re  )rl   r%   r/   rr  r_  rZ  rx  r&   r|   r'   !test_basic_frame_series_alignment  s
   "z/TestAlignment.test_basic_frame_series_alignmentc                   s    fdd}t g dg d}tjdd tdt |D ]
\}}|||| qW d    n1 s4w   Y  t dgdg}tjdd tdt |D ]
\}}|||| qOW d    d S 1 sew   Y  d S )Nc                   s   t jddt| |d}t||}ttjd|d d }t|j	|j	rAt 
t tjd d}W d    n1 s;w   Y  ntjd d}| dksQ|dkr_ dkrZ||n|| }n|| }t || d S )	NrY      r^  rX   zs + dfr|   r?  r   rt  rw  r|   r&   r'   rx    s   

z?TestAlignment.test_basic_series_frame_alignment.<locals>.testit)rT  rU  rE  Tr[  ignorer?  )r   rb  rc  rd  re  )rl   r%   r/   rr  rx  r:  r_  rZ  r&   r|   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rwtt tj|
||d}W d    n1 sTw   Y  tt tj|||d}W d    n1 sqw   Y  ntj|
||d}tj|||d}|dkr|dkr|dkrt|| W d    d S W d    d S W d    d S W d    d S 1 sw   Y  d S )NTr[  r]  rY   r^  rX   zs rB  rA  z sr|   r?  r   )rb  rc  rd  re  r   rC  rD  ru  r
   r<   r\   r^   rR  r  rf  rL   r~   r   )rl   r%   r/   rr  r   r_  rZ  r  r  rE  r>   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sY|dkrh|dkrc||}n	|| }n|| }|dkst|dkr|dkr~||}n	|| }n|| }t|j|j|jrtt tjd||d}W d    n1 sw   Y  ntjd||d}|j|jksJ t|| W d    d S 1 sw   Y  d S )Nr   r   rX   r[   Tr[  r]  r  r  r  rg  r^  r?  r   zdf2 + ser + dfr|   )r\   rb  rc  rd  re  choicer   rC  rD  ru  localsgetr
   r<   r^   rv  rR  r  rf  rL   r~   r  r   )rl   r%   r/   rl  rm  rn  ro  r\   nm1m2rr  obj_namer  rg  r  ser	expected2rV   r   r&   r&   r'   #test_complex_series_frame_alignment   sF   



"z1TestAlignment.test_complex_series_frame_alignmentc                 C  s  t tjdd}ttjd}|dkrt}nd}t| tj	d||d W d    n1 s2w   Y  ttjd}td tj	d||d W d    n1 sWw   Y  t tjdd}ttjd}td tj	d||d W d    n1 sw   Y  t tjdd}ttjd}|dk}|st}nd}t|B}tj	d||d |st
|d	ksJ t|d
 j}	t|j|jd	  }
d|
dd}|	|ksJ W d    d S W d    d S 1 sw   Y  d S )Ni  rY   i'  r   Frs  r|   r   rD   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   r   rf  rL   r~   lenr:   messagelog10r   r  )rl   r%   r/   r  rE  seenis_python_enginewrnwr   loggedrV   r&   r&   r'   +test_performance_warning_for_poor_alignment2  sL   "z9TestAlignment.test_performance_warning_for_poor_alignmentN)r"  r#  r$  index_typeslhs_index_typesrW  r   r!   r(  rh  rk  rq  ry  r|  r}  r  r  r&   r&   r&   r'   rS  T  sB    

%.rS  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d8g d@dAdB Z(ejdCd9d:d9d;ge$%g d<d9d;igdDdE Z)dFdG Z*dHdI Z+dJdK Z,dLdM Z-dNdO Z.dPS )QTestOperationsNumExprPandasrb   exclude_arithr   re   c                   s     fddt jt j D  _d S )Nc                   s   g | ]	}| j vr|qS r&   )r  r$   r   ri   r&   r'   
<listcomp>l  s
    
z;TestOperationsNumExprPandas.setup_class.<locals>.<listcomp>)r   r   r*  	arith_opsr  r&   r  r'   rj   j  s   

z'TestOperationsNumExprPandas.setup_classc                 O  8   | j |d< | j|d< |ddd |d< tj|i |S Nr%   r/   levelr   rD   r%   r/   poprL   r~   rl   r:  r;  r&   r&   r'   r~   r     

z TestOperationsNumExprPandas.evalc           
   	   C  s2  dd | j D }|D ]}d| d}d| d}d| d}|dv rFd}tjt|d	 tj|| j| jd
 W d    n1 s@w   Y  q
td|d| j}| j|| j| jd
}||ks^J t||d| j}| j|d|i| j| jd}	|	|ksyJ td||d | j}| j|d|i| j| jd}	|	|ksJ q
d S )Nc                 s  s    | ]	}|d kr|V  qdS )r   Nr&   r  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   r|   rD   r   r   )	r  r   r   r   rL   r~   r%   r/   rC   )
rl   opsr   r   r   r   r   expecr   yr&   r&   r'   test_simple_arith_opsx  s2   z1TestOperationsNumExprPandas.test_simple_arith_opsr@   TFr>   r   c                 C  6   | d| d| }|  |}t |}||ksJ d S N r~   rl   r@   r>   r   r   r   r  r&   r&   r'   test_simple_bool_ops     
z0TestOperationsNumExprPandas.test_simple_bool_opsc                 C  r  r  r  r  r&   r&   r'   test_bool_ops_with_constants  r  z8TestOperationsNumExprPandas.test_bool_ops_with_constantsc                 C  sn   t jdddd}tt jd}d}tjt|d | jd||d	d
 W d    d S 1 s0w   Y  d S )Nr   rp  rX      rY   z?N-dimensional objects, where N > 2, are not supported with evalr   x + yr   r  r   )r<   r\   r^   r
   r   r   r   r~   )rl   r   r  r   r&   r&   r'   test_4d_ndarray_fails  s   "z1TestOperationsNumExprPandas.test_4d_ndarray_failsc                 C  s   |  d}|dksJ d S )N1rD   r  )rl   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 )NrY   r[   r  r  r	   r<   r\   r^   r~   r   r   )rl   r  rg  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 d    n1 s#w   Y  t|t dg tt | j|dd}W d    n1 sIw   Y  t|t dg tt | jddd}W d    n1 sow   Y  d	}||ks|J tt | jddd}W d    n1 sw   Y  d	}||ksJ tt | jd
dd}W d    n1 sw   Y  d	}||ksJ tt | jd
dd}W d    n1 sw   Y  d	}||ksJ d S )NrD   zs / 1rE  F)truedivr   Tz1 / 2rZ   zs / 2)r<   r   r   rf  FutureWarningr~   r   )rl   rE  r   dr   r  r&   r&   r'   test_truediv  s>   z(TestOperationsNumExprPandas.test_truedivc                 C  sP   t tjdd}tjtdd | d W d    d S 1 s!w   Y  d S )NrX   r   zname 'x' is not definedr   zdf[x > 2] > 2)r	   r<   r\   r^   r   r   	NameErrorr~   )rl   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 )NrX   r   z(df + 1)[df > 2]r  r  rD   r[   r  rl   r  rU   rV   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 )NrX   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	   r<   r\   r^   r1   r   r   rA   zipr   r   r~   )rl   r  expr1expec1expr2expec2expr3expec3r  expecsrB   r  r&   r&   r'   test_attr_expression  s   

z0TestOperationsNumExprPandas.test_attr_expressionc                 C  s|   t tjddtdd}t tjdd}d}d}tjt|d | j|||dd	 W d    d S 1 s7w   Y  d S )
NrX   r   r  r  zdf = df2%cannot assign without a target objectr   )r  rg  r  )	r	   r<   r\   r^   r1   r   r   r9   r~   )rl   r  rg  r  r   r&   r&   r'   test_assignment_fails  s   "z1TestOperationsNumExprPandas.test_assignment_failsc                   sF  t tjddtdd   tjtdd  	d W d    n1 s(w   Y  d}tjt|d  	d	 W d    n1 sFw   Y  t
jrQd
}nd}tjt|d  	d W d    n1 sjw   Y   }|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 d    n1 sw   Y    | j	dd i dd  }|d |d  |d< t | d S )NrX   r[   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inplacerA   	c = a + bc                    s      } d}| jddd | S )NrD   z	a = 1 + bTr  )copyr~   )r  r   )orig_dfr&   r'   rD    s   z=TestOperationsNumExprPandas.test_assignment_column.<locals>.frD   c                    sJ   d}  j  } jddd | j }tj| j dd |jd u s#J d S )NrD   r  Tr  Fcheck_names)r   r  r~   r   r   r   r  )r   old_arU   )r  r&   r'   rD  )  s   

z#can only assign a single expressionz	c = a = bzc = df.a + df.br  )r   targetr  )r	   r<   r\   r^   r1   r  r   r   r  r~   r   PY38r   r   )rl   r   rV   rD  r&   )r  r  r'   test_assignment_column  sX   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	   r~   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 usJ | }|d |d	  |d
< t|| d S )NrX   r[   r  r  r  Fr  r   r   rA   )	r	   r<   r\   r^   r1   r~   r  r   r   )rl   r  actualrV   r&   r&   r'   assignment_not_inplaceH  s   z2TestOperationsNumExprPandas.assignment_not_inplacec                 C  s   t g dg dd}| }|d |d  |d< |d |d  |d< |jdd	d
}t|| |d u s6J |d d |d< |d d |d< |jdd	d
}t|| |d u sYJ d}tjt|d |jddd
 W d    d S 1 suw   Y  d S )NrD   r[   r   rp  rX   r  r  r   r   rA   r  $
        c = a + b
        d = c + bTr  rD   r[   rB   $
        a = a - 1
        e = a + 2z@Multi-line expressions are only valid if all expressions containr   z(
            a = b + 2
            b - 2F)r	   r  r~   r   r   r   r   r9   )rl   r  rV   answerr   r&   r&   r'   test_multi_line_expressionS  s2   "z6TestOperationsNumExprPandas.test_multi_line_expressionc                 C  s   t g dg d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  r  r  r   r   rA   r  r  Fr  rD   r[   rB   r  r	   r  r~   r   r   rl   r  rV   r&   r&   r'   &test_multi_line_expression_not_inplacex  s    zBTestOperationsNumExprPandas.test_multi_line_expression_not_inplacec                 C  sl   t g dg dd}| }d}|d | |d< |d | |d< |jdd	d
}t|| |d u s4J d S )Nr  r  r  rz  r   rA   r  z?
        c = a * @local_var
        d = c + @local_var
        Tr  r  )rl   r  rV   	local_varr  r&   r&   r'   )test_multi_line_expression_local_variable  s   zETestOperationsNumExprPandas.test_multi_line_expression_local_variablec                 C  s|   t g dg dd}dd }| }|d |dd |d	< |d	 |dd |d
< |jddd}t|| |d u s<J d S )Nr  r  r  c                 S     |S r+   r&   r  r&   r&   r'   
local_func     zbTestOperationsNumExprPandas.test_multi_line_expression_callable_local_variable.<locals>.local_funcr   rD   rz  rA   r  zM
        c = a * @local_func(1, 7)
        d = c + @local_func(1, 7)
        Tr  r  rl   r  r  rV   r  r&   r&   r'   2test_multi_line_expression_callable_local_variable  s   zNTestOperationsNumExprPandas.test_multi_line_expression_callable_local_variablec                 C  s   t g dg dd}dd }| }|d |ddd	 |d
< |d
 |ddd	 |d< |jddd}t|| |d u s>J d S )Nr  r  r  c                 S  r  r+   r&   r  r&   r&   r'   r    r  znTestOperationsNumExprPandas.test_multi_line_expression_callable_local_variable_with_kwargs.<locals>.local_funcr   rz  rD   )r   r   rA   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  sj   t g dg dd}| }d}tjt|d |d W d    n1 s(w   Y  t|| d S )Nr  r  r  r  r   za = 1)r	   r  r   r   r9   r  r   r   )rl   r  df_origr   r&   r&   r'   test_assignment_in_query  s   z4TestOperationsNumExprPandas.test_assignment_in_queryc                 C  st   t g dg dd}| }||d dk }|jddd t|| i }dd	i}| jd
|dd t|| d S )Nr  r  r  r   r[   za == 2Tr  r   	a = 1 + 2r  r  )r	   r  r  r   r   r~   assert_dict_equalr  r&   r&   r'   test_query_inplace  s   z.TestOperationsNumExprPandas.test_query_inplaceinvalid_targetrD   catr[   rD   r   zignore::FutureWarningc                 C  s   d}d}t jt|d | j||dd W d    n1 sw   Y  t|drJt jt|d | j||dd W d    d S 1 sCw   Y  d S d S )Nz)Cannot assign expression output to targetr  r   Tr  r  F)r   r   r9   r~   hasattrrl   r  r   
expressionr&   r&   r'   test_cannot_item_assign  s   
"z3TestOperationsNumExprPandas.test_cannot_item_assign)rD   r  r  c                 C  sL   d}d}t jt|d | j||dd W d    d S 1 sw   Y  d S )Nz"Cannot return a copy of the targetr  r   Fr  )r   r   r9   r~   r  r&   r&   r'   test_cannot_copy_item  s
   "z1TestOperationsNumExprPandas.test_cannot_copy_itemr  c                 C  sd   d}| j ||dddksJ d}tjt|d | j ||dd W d    d S 1 s+w   Y  d S )N1 + 2Fr  r   z0Cannot operate inplace if there is no assignmentr   T)r~   r   r   r9   )rl   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 )Nr[   prT  r@  rZ  r_  ri  r  r  r   rC  rD  r~   r   )rl   r  rB   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 )	Nr[   r  rT  r  zdf[df < 2 + 3]r  r  rX   r  rl   r  r   rB   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 )Nr[   r  rT  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 )NrX   r   z1/1/2012)periodsdates1zdf.dates1 < 20130101r  r   20130101Fr  )r	   r<   r\   r^   r   r~   r%   r/   r  r   r   )rl   r  r   r  r&   r&   r'   test_date_boolean  s   
z-TestOperationsNumExprPandas.test_date_booleanc                 C  s  | j dkrtjd| j| j d}|sJ tjd| j| j d}|s!J tjd| j| j d}|r/J tjd| j| j d}|s=J tjd| j| j d}|sKJ tjd| j| j d}|sYJ tjd	| j| j d}|sgJ tjd
| j| j d}|suJ tjd| j| j d}|rJ tjd| j| j d}|sJ d S d}tjt|d tjd| j| j d W d    n1 sw   Y  tjt|d tjd| j| j d W d    n1 sw   Y  tjt|d tjd| j| j d W d    n1 sw   Y  tjt|d tjd| j| j d W d    n	1 sw   Y  d}tjt|d tjd| j| j d W d    n	1 s9w   Y  tjt|d tjd| j| j d W d    d S 1 s\w   Y  d S )Nr   z1 in [1, 2]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 implementedr   z[(3,)] in (1, 2, [(3,)])z!'NotIn' nodes are not implementedz[3] not in (1, 2, [[3]]))r/   rL   r~   r%   r   r   r   )rl   r   r   r&   r&   r'   test_simple_in_ops#  sb   




$z.TestOperationsNumExprPandas.test_simple_in_opsN)/r"  r#  r$  r  r%  r%   r/   r&  rj   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<   r   filterwarningsr  r  r  r  r  r  r  r	  r&   r&   r&   r'   r  c  s\   
 
#G%	 

&
	
r  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   rb   r  r   r   c                 C  s6   d}d d}d}tj|| j| jd}||ksJ d S )NrD   z * !aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar|   )joinrL   r~   r%   r/   )rl   r   r   rV   r   r&   r&   r'   test_check_many_exprsb  s
   
z1TestOperationsNumExprPython.test_check_many_exprsc                 C  d   t tjdd}d}tjt|d tjdd|i| j	| j
d W d    d S 1 s+w   Y  d S )NrX   r   r5  r   zdf > 2 and df > 3r  r   r/   r%   r	   r<   r\   r^   r   r   r   rL   r~   r/   r%   r   r&   r&   r'   test_fails_andi     "z*TestOperationsNumExprPython.test_fails_andc                 C  r  )NrX   r   r5  r   zdf > 2 or df > 3r  r  r  r   r&   r&   r'   test_fails_ort  r  z)TestOperationsNumExprPython.test_fails_orc                 C  r  )NrX   r   'Not' nodes are not implementedr   z
not df > 2r  r  r  r   r&   r&   r'   test_fails_not  r  z*TestOperationsNumExprPython.test_fails_notc                 C  b   t tjdd}d}d}tjt|d tj|| j	| j
d W d    d S 1 s*w   Y  d S )NrX   r   z(df + 2)[df > 1] > 0 & (df > 0)$cannot evaluate scalar only bool opsr   r   r  rl   r  r   r   r&   r&   r'   test_fails_ampersand     "z0TestOperationsNumExprPython.test_fails_ampersandc                 C  r  )NrX   r   z(df + 2)[df > 1] > 0 | (df > 0)r  r   r   r  r  r&   r&   r'   test_fails_pipe  r  z+TestOperationsNumExprPython.test_fails_piper@   TFr>   r   c                 C  s   | d| d| }|dv r/d}t jt|d | | W d    d S 1 s(w   Y  d S | |}t|}||ks>J d S )Nr  r0  r1  r5  r   )r   r   r   r~   rl   r>   r@   r   r   r   r   r  r&   r&   r'   r    s   "
z8TestOperationsNumExprPython.test_bool_ops_with_constantsc                 C  s   d| d}|dv r0d}t jt|d tj|| j| jd W d    d S 1 s)w   Y  d S tj|| j| jd}t|}||ksDJ d S )Nr   r   r  r5  r   r|   r6  r  r&   r&   r'   r    s   "z0TestOperationsNumExprPython.test_simple_bool_opsN)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  [  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        r  c                   @  s"   e Zd ZU g Zded< dZdZdS )TestOperationsPythonPandasrb   r  r   re   N)r"  r#  r$  r  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   re   c                 O  r  r  r  r  r&   r&   r'   r~     r  zTestMathPythonPython.evalc                 C  s   t dtjdi}|j}|}| d}| |}tjdd tt||}W d    n1 s1w   Y  tj	||dd d S )Nr   rY   z(a)r{  allFr  )
r	   r<   r\   r^   r   r~   errstateru  r   r   )rl   r4   r  r   fnr   gotr   r&   r&   r'   test_unary_functions  s   

z)TestMathPythonPython.test_unary_functionsr'  c                 C  s   t tjdtjdd}|j}|j}| d}| |}tjdd tt|||}W d    n1 s8w   Y  t	j
||dd d S )NrY   r  z(a, b)r{  r$  Fr  )r	   r<   r\   r^   r   r   r~   r&  ru  r   r   )rl   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 )NrY   r  ze = arctan2(sin(a), b)Tr%   r/   r  Fr  )r	   r<   r\   r^   r~   r%   r/   rB   arctan2sinr   r   r   r   rl   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 )NrY   r  ze = sin(a + b)Tr+  Fr  )r	   r<   r\   r^   r~   r%   r/   rB   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J |jd| j| j	dd |j
}t|j}|j|jks1J ||jks8J tj||dd d S )Nr   rY   z
b = sin(a)Tr+  Fr  )r	   r<   r\   r^   r   r   r   r~   r%   r/   r   r-  r   r   )rl   r   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+   )r2  r<   int32r  int64r.  rk   r&   r&   r'   test_result_types  s   z&TestMathPythonPython.test_result_typesc                 C  s   |  tjtj d S r+   )r2  r<   
complex128rk   r&   r&   r'   test_result_complex128  s   z+TestMathPythonPython.test_result_complex128c                 C  `   t dtjdi}d}tjt|d |jd| j| j	d W d    d S 1 s)w   Y  d S )Nr   rY   z#"mysin" is not a supported functionr   zmysin(a)r|   )
r	   r<   r\   r^   r   r   r9   r~   r%   r/   r   r&   r&   r'   test_undefined_func  
   "z(TestMathPythonPython.test_undefined_funcc                 C  r8  )Nr   rY   z1Function "sin" does not support keyword argumentsr   zsin(x=a)r|   )
r	   r<   r\   r^   r   r   r   r~   r%   r/   r   r&   r&   r'   test_keyword_arg  r:  z%TestMathPythonPython.test_keyword_argN)r"  r#  r$  r%   r/   r~   r)  r   r!   r(  r   r*  r/  r0  r2  r5  r,  r-  r7  r9  r;  r&   r&   r&   r'   r#    s    


r#  c                   @     e Zd ZdZdZdS )TestMathPythonPandasr   re   Nr   r&   r&   r&   r'   r=    r!  r=  c                   @  r<  )TestMathNumExprPandasr   re   Nr   r&   r&   r&   r'   r>  $  r!  r>  c                   @  r<  )TestMathNumExprPythonr   r   Nr   r&   r&   r&   r'   r?  )  r!  r?  rY   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 * 2r[   r|   )r   r   _var_srL   r~   )rl   r%   r/   rB   r&   r&   r'   test_global_scope2  s   zTestScope.test_global_scopec                 C  sD   d}t   }tjd|||d t   }|d ||ks J d S )NrD   x + 1r   lcls)r  r  rL   r~   r  )rl   r%   r/   r   rD  lcls2r&   r&   r'   test_no_new_locals8  s   


zTestScope.test_no_new_localsc                 C  s8   d}t   }tjd||d t   }||ksJ d S )NrD   rC  r|   )globalsr  rL   r~   )rl   r%   r/   r   gblsgbls2r&   r&   r'   test_no_new_globals@  s
   

zTestScope.test_no_new_globalsN)r"  r#  r$  rB  rF  rJ  r&   r&   r&   r'   r@  1  s    r@  c                  C  N   d} t jt| d tjdddddd W d    d S 1 s w   Y  d S )	NzInvalid engine 'asdf' passedr   r  rD   r[   r  asdf)r   r%   r   r   KeyErrorrL   r~   r   r&   r&   r'   test_invalid_engineH     "rP  c                  C  rK  )	NzInvalid parser 'asdf' passedr   r  rD   r[   r  rL  )r   r/   rM  rO  r&   r&   r'   test_invalid_parserO  rQ  rR  )r   r   re   z dict[str, type[BaseExprVisitor]]_parsersc              	   C  sb   t | }|d| |}|jD ]!}d}tjt|d t||  W d    n1 s)w   Y  qd S )NrC  znodes are not implementedr   )rS  unsupported_nodesr   r   r   ru  )r%   r/   VisitorClassinstr  r   r&   r&   r'   test_disallowed_nodes]  s   
rW  c                 C  sH   d}t jtdd tj|| |d W d    d S 1 sw   Y  d S )Nzs +r  r   r|   r   r   r  rL   r~   )r%   r/   rB   r&   r&   r'   test_syntax_error_exprsj  s   "rY  c                 C  sL   d}d}t jt|d tj|| |d W d    d S 1 sw   Y  d S )Nzs + tzname 's' is not definedr   r|   )r   r   r  rL   r~   )r%   r/   rB   r   r&   r&   r'   test_name_error_exprsp  s
   "rZ  express)za + @bz@a + bz@a + @bc                 C  s   d\}}|dkr*t jtdd tj|| |d W d    d S 1 s#w   Y  d S t jtdd tj|| |d W d    d S 1 sEw   Y  d S )NrD   r[   re   zThe '@' prefix is onlyr   r|   zThe '@' prefix is notrX  )r%   r/   r[  r   r   r&   r&   r'   %test_invalid_local_variable_referencew  s   ""r]  c                 C  s|   d\}}| dkr,d}t jt|d tjd| |d W d    d S 1 s%w   Y  d S tjd| |d}||| ks<J d S )Nr\  r   zVariables in expression .+r   zsin + dotted_liner|   )r   r   r   rL   r~   )r%   r/   r-  dotted_liner   r   r&   r&   r'   test_numexpr_builtin_raises  s   "r_  c                 C  sJ   d}t jtdd tjd|| |d W d    d S 1 sw   Y  d S )N)*   g      @zResolver of type .+r   r  )	resolversr%   r/   )r   r   r   rL   r~   )r%   r/   cannot_resolver&   r&   r'   test_bad_resolver_raises  s   "rc  c                 C  D   t jtdd tjd| |d W d    d S 1 sw   Y  d S )Nzexpr cannot be an empty stringr    r|   r   r   r9   rL   r~   r|   r&   r&   r'   test_empty_string_raises  s   "rg  c                 C  rd  )Nz#only a single expression is allowedr   z1 + 1; 2 + 2r|   rX  r|   r&   r&   r'   $test_more_than_one_expression_raises  s   "rh  cmpr  r@   c              	   C  s   t dd ttjji}||   }||   } ||  }d| d| d}d| d| d}d| d| d	}	|||	fD ]#}
d
}tjt|d tj	|
||d W d    n1 sWw   Y  q9d S )Nc                   S  s   t jdS )NrY   )r<   r\   r   r&   r&   r&   r'   r     r   z0test_bool_ops_fails_on_scalars.<locals>.<lambda>r   r   r   r   ry   r   r{   r  r   r|   )
intfloatr<   r\   r^   r   r   r   rL   r~   )r>   ri  r@   r%   r/   genr   r   r   r   r   r   r&   r&   r'   test_bool_ops_fails_on_scalars  s   


rm  otherz'x'z...zGH-28116r   r   c                 C  sJ   t dg di}|d|  }tg ddd}trd |_t|| d S )Nr  )r   r   rA   r  )FFF)r  )r	   r~   r
   r   r  r   r   )rn  r  rU   rV   r&   r&   r'   test_equals_various  s   
ro  c                 C  s*   d}t j}tj|| |d}||ksJ d S )Nzinf + 1r|   )r<   infrL   r~   )r%   r/   rE  rV   rU   r&   r&   r'   test_inf  s   rq  c                 C  s   d}t t}tjd| |dd W d    n1 sw   Y  t|dks(J |t|d jv s3J t t}tjd| |dd W d    n1 sLw   Y  t|dksYJ |t|d jv sdJ d S )Nz0The `truediv` parameter in pd.eval is deprecatedz1+1T)r%   r/   r  rD   r   F)r   rf  r  rL   r~   r  r:   r  )r%   r/   r   mr&   r&   r'   test_truediv_deprecated  s   rs  c                 C  s   t ddgddggddgd}||jdk  }|jd| |d	}t|| |d
krLd}tjt|d |jd| |d	 W d    d S 1 sEw   Y  d S |jd| |d	}t|| d S )Nr   rY   rD   r`  r  countr  z
~(cat > 0)r|   r   r  r   znot (cat > 0))r	   r  r  r   r   r   r   r   )r%   r/   r  rV   rU   r   r&   r&   r'   test_negate_lt_eq_le  s   "ru  c                   @  s.   e Zd Zejdddg ddgdd ZdS )	TestValidatevaluerD   Truer  g      @c                 C  sF   d}t jt|d tjd|d W d    d S 1 sw   Y  d S )Nz8For argument "inplace" expected type bool, received typer   z2+2r  rf  )rl   rw  r   r&   r&   r'   test_validate_bool_args  s   "z$TestValidate.test_validate_bool_argsN)r"  r#  r$  r   r!   r(  ry  r&   r&   r&   r'   rv    s    rv  )x
__future__r   	functoolsr   	itertoolsr   rM  rb  numpyr<   r   pandas.errorsr   pandas.util._test_decoratorsutil_test_decoratorsr,  pandas.core.dtypes.commonr   r   r   re   rL   r	   r
   r   r   pandas._testing_testingr   pandas.core.computationr   pandas.core.computation.enginesr   r   pandas.core.computation.exprrM   computationr   r   r   r   #pandas.core.computation.expressionsr   r   pandas.core.computation.opsr   r   r   r   r   fixturer%   PARSERSr/   r2   r4   r7   rC   rI   rJ   rP   rW   sortedset
differencer+  r1   ranger>   r@   r   skip_if_no_nera   r/  r8  r9  rD  r<  rJ  rR  rS  r  r  r  r"  r#  r=  r>  r?  r\   r^   rA  r@  rP  rR  PyTablesExprVisitorrS  r%  r!   r(  rW  rY  rZ  r]  r_  rc  rg  rh  rj  rk  rm  r    xfailr  ro  rq  rs  ru  rv  r&   r&   r&   r'   <module>   s    		



    e     zY]



	