o
    �¨ÊhzÖ  ã                   @   st  d dl Z d dlZd dlZd dlmZmZ d dlm  m	Z
 d dlZd dlmZmZmZmZmZ d dlmZ d dlmZ ejddgdd„ d	�d
d„ ƒZejdejde
 d¡d�gdd„ d	�dd„ ƒZdd„ ZG dd„ dƒZG dd„ dƒZG dd„ dƒZe
 d¡G dd„ dƒƒZ e
 d¡G dd„ de ƒƒZ!G dd„ de ƒZ"G dd „ d e!ƒZ#G d!d"„ d"ƒZ$G d#d$„ d$ƒZ%G d%d&„ d&ƒZ&dS )'é    N)ÚNumExprClobberingErrorÚUndefinedVariableError)Ú	DataFrameÚIndexÚ
MultiIndexÚSeriesÚ
date_range)ÚNUMEXPR_INSTALLEDÚpythonÚpandasc                 C   ó   | S ©N© ©Úxr   r   úT/var/www/html/env/lib/python3.10/site-packages/pandas/tests/frame/test_query_eval.pyÚ<lambda>   ó    r   )ÚparamsÚidsc                 C   ó   | j S r   ©Úparam©Úrequestr   r   r   Úparser   s   r   Únumexpr)Úmarksc                 C   r   r   r   r   r   r   r   r      r   c                 C   r   r   r   r   r   r   r   Úengine   s   r   c                 C   s    | dkrt  d| › �¡ d S d S )Nr   zcannot evaluate with parser=)ÚpytestÚskip)r   r   r   r   Úskip_if_no_pandas_parser%   s   ÿr!   c                   @   sV   e Zd Zejdd„ ƒZejdd„ ƒZejdd„ ƒZdd„ Zd	d
„ Z	dd„ Z
dd„ ZdS )Ú
TestCompatc                 C   s   t dg d¢iƒS )NÚA©é   é   é   ©r   ©Úselfr   r   r   Údf+   s   zTestCompat.dfc                 C   s   ||j dk S )Nr   ©r#   ©r*   r+   r   r   r   Ú	expected1/   s   zTestCompat.expected1c                 C   s
   |j d S ©Nr%   r,   r-   r   r   r   Ú	expected23   s   
zTestCompat.expected2c                 C   s4   |  d¡}t ||¡ | d¡}tj||dd� d S )NúA>0úA+1F©Úcheck_names©ÚqueryÚtmÚassert_frame_equalÚevalÚassert_series_equal©r*   r+   r.   r0   Úresultr   r   r   Útest_query_default7   s   

zTestCompat.test_query_defaultc                 C   s<   |j dd d�}t ||¡ |jdd d�}tj||dd� d S )Nr1   ©r   r2   Fr3   r5   r;   r   r   r   Útest_query_None?   ó   zTestCompat.test_query_Nonec                 C   s<   |j ddd�}t ||¡ |jddd�}tj||dd� d S )Nr1   r
   r>   r2   Fr3   r5   r;   r   r   r   Útest_query_pythonE   r@   zTestCompat.test_query_pythonc                 C   sÂ   t r |jddd�}t ||¡ |jddd�}tj||dd� d S d}tjt|d�� |jddd� W d   ƒ n1 s;w   Y  tjt|d�� |jddd� W d   ƒ d S 1 sZw   Y  d S )	Nr1   r   r>   r2   Fr3   z~'numexpr' is not installed or an unsupported version. Cannot use engine='numexpr' for query/eval if 'numexpr' is not installed©Úmatch)	r	   r6   r7   r8   r9   r:   r   ÚraisesÚImportError)r*   r+   r.   r0   r<   Úmsgr   r   r   Útest_query_numexprK   s   ÿÿ"ÿzTestCompat.test_query_numexprN)Ú__name__Ú
__module__Ú__qualname__r   Úfixturer+   r.   r0   r=   r?   rA   rG   r   r   r   r   r"   *   s    


r"   c                   @   sh   e Zd Zej dddg¡ej dg d¢¡dd„ ƒƒZdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚTestDataFrameEvalÚné   i   zop_str,op,rop))ú+Ú__add__Ú__radd__)ú-Ú__sub__Ú__rsub__)Ú*Ú__mul__Ú__rmul__)ú/Ú__truediv__Ú__rtruediv__c           
      C   sÆ   t dt|ƒtdƒd�}d|jd< | ¡ }t t |j|¡ |d¡tdƒd�}t	d|› d	�ƒ}t	d
|› d	�ƒ}	t
 |	|¡ |dv rNt||ƒ|ƒ}	t
 |	|¡ d S |dv rat||ƒ|ƒ}	t
 |	|¡ d S d S )Nr%   Úabcd©ÚindexÚcolumnsr&   r   éÿÿÿÿ©r^   zbase z dfzm )rO   rU   )rR   rX   )r   ÚrangeÚlistÚilocÚmeanÚnpÚtileÚvaluesÚreshaper9   r7   r8   Úgetattr)
r*   Úop_strÚopÚroprM   r+   ÚmÚbaseÚexpectedr<   r   r   r   Útest_ops_   s    
ÿþzTestDataFrameEval.test_opsc                 C   sj   t dtj d¡ d¡iƒ}tj|jdd…< dt |jdd… ¡ }dt |¡ jdd… }t 	||¡ d S )Nr#   r&   i¨a  r   é   r%   é   )
r   re   ÚrandomÚdefault_rngÚstandard_normalÚnanrc   Úisnanr7   r8   )r*   r+   ro   r<   r   r   r   Útest_dataframe_sub_numexpr_path…   s
   z1TestDataFrameEval.test_dataframe_sub_numexpr_pathc                 C   s”   t g d¢g d¢dœƒ}d}tjt|d�� | dd„ ¡ W d   ƒ n1 s&w   Y  tjt|d�� | d¡ W d   ƒ d S 1 sCw   Y  d S )	Nr$   )ÚaÚbrz   ©r#   ÚBz%expr must be a string to be evaluatedrB   c                 S   s
   | j dkS )Nrz   )r|   r   r   r   r   r   ”   s   
 z6TestDataFrameEval.test_query_non_str.<locals>.<lambda>éo   ©r   r   rD   Ú
ValueErrorr6   ©r*   r+   rF   r   r   r   Útest_query_non_strŽ   s   ÿ"ÿz$TestDataFrameEval.test_query_non_strc                 C   sR   t dg d¢iƒ}d}tjt|d�� | d¡ W d   ƒ d S 1 s"w   Y  d S )Nr#   r$   zexpr cannot be an empty stringrB   Ú r~   r€   r   r   r   Útest_query_empty_string™   s
   "ÿz)TestDataFrameEval.test_query_empty_stringc                 C   s~   t tj d¡ d¡tdƒd�}ddi}ddi}|jd||gd	�|d |d  ks*J ‚tjd||gd	�|d |d  ks=J ‚d S )
Nr&   ©é
   r&   Úabr`   ry   r%   rz   úa + b©Ú	resolvers)r   re   rs   rt   ru   rb   r9   Úpd)r*   r+   Údict1Údict2r   r   r   Útest_eval_resolvers_as_list¡   s   ÿ&*z-TestDataFrameEval.test_eval_resolvers_as_listc                 C   s^   t tj d¡ d¡tdƒd�}ddi}|jd|gd�}|d |d	 |d   }t ||¡ d S )
Nr&   r„   r†   r`   Úcz	a + b * crˆ   ry   rz   )	r   re   rs   rt   ru   rb   r9   r7   r:   )r*   r+   r‹   r<   ro   r   r   r   Útest_eval_resolvers_combined«   s   ÿz.TestDataFrameEval.test_eval_resolvers_combinedc                 C   s@   t dddgiƒ}| d¡}t ddgddgdœƒ}t ||¡ d S )NÚa1ÚYÚNzc = ((a1 == 'Y') & True)TF)r�   rŽ   )r   r9   r7   r8   )r*   r+   Úresro   r   r   r   Útest_eval_object_dtype_binop¸   s   
z.TestDataFrameEval.test_eval_object_dtype_binopN)rH   rI   rJ   r   ÚmarkÚparametrizerp   rx   r�   rƒ   r�   r�   r”   r   r   r   r   rL   ]   s    þ		
rL   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
Ú TestDataFrameQueryWithMultiIndexc                 C   s4  t |ƒ tj d¡jddgdd�}tj d¡jddgdd�}tj||gdd	gd
�}ttj d¡ d¡|d�}t	|j
 d¡j|dd�}|jd||d�}|jd||d�}	||dk }
t ||
¡ t |	|
¡ |jd||d�}|jd||d�}	||dk }
t ||
¡ t |	|
¡ |jd||d�}|jd||d�}	|| dg¡ }
t ||
¡ t |	|
¡ |jd||d�}|jd||d�}	|| dg¡  }
t ||
¡ t |	|
¡ |jd||d�}|jd||d�}	|| dg¡ }
t ||
¡ t |	|
¡ |jd||d�}|jd||d�}	|| dg¡  }
t ||
¡ t |	|
¡ d S )Nr&   ÚredÚgreenr…   ©ÚsizeÚeggsÚhamÚcolorÚfood©Únamesr„   ©r]   ©r]   Únamezcolor == "red"©r   r   z"red" == colorzcolor != "red"z"red" != colorzcolor == ["red"]z["red"] == colorzcolor != ["red"]z["red"] != colorz["red"] in colorz"red" in colorz["red"] not in colorz"red" not in color©r!   re   rs   rt   Úchoicer   Úfrom_arraysr   ru   r   r]   Úget_level_valuesrg   r6   r7   r8   Úisin©r*   r   r   ry   rz   r]   r+   ÚindÚres1Úres2Úexpr   r   r   Ú test_query_with_named_multiindexÁ   sL   ÿzATestDataFrameQueryWithMultiIndex.test_query_with_named_multiindexc                 C   sì  t |ƒ tj d¡jddgdd�}tj d¡jddgdd�}t ||g¡}ttj d¡ d¡|d	�}t	|j
 d
¡j|d	�}|jd||d�}|jd||d�}	||dk }
t ||
¡ t |	|
¡ |jd||d�}|jd||d�}	||dk }
t ||
¡ t |	|
¡ |jd||d�}|jd||d�}	|| dg¡ }
t ||
¡ t |	|
¡ |jd||d�}|jd||d�}	|| dg¡  }
t ||
¡ t |	|
¡ |jd||d�}|jd||d�}	|| dg¡ }
t ||
¡ t |	|
¡ |jd||d�}|jd||d�}	|| dg¡  }
t ||
¡ t |	|
¡ t	|j
 d¡j|d	�}|jd||d�}|jd||d�}	||dk }
t ||
¡ t |	|
¡ |jd||d�}|jd||d�}	||dk }
t ||
¡ t |	|
¡ |jd||d�}|jd||d�}	|| dg¡ }
t ||
¡ t |	|
¡ |jd||d�}|jd ||d�}	|| dg¡  }
t ||
¡ t |	|
¡ |jd!||d�}|jd"||d�}	|| dg¡ }
t ||
¡ t |	|
¡ |jd#||d�}|jd$||d�}	|| dg¡  }
t ||
¡ t |	|
¡ d S )%Nr&   r˜   r™   r…   rš   rœ   r�   r„   r¢   r   úilevel_0 == "red"r¥   z"red" == ilevel_0úilevel_0 != "red"z"red" != ilevel_0zilevel_0 == ["red"]z["red"] == ilevel_0zilevel_0 != ["red"]z["red"] != ilevel_0z["red"] in ilevel_0z"red" in ilevel_0z["red"] not in ilevel_0z"red" not in ilevel_0r%   zilevel_1 == "eggs"z"eggs" == ilevel_1zilevel_1 != "eggs"z"eggs" != ilevel_1zilevel_1 == ["eggs"]z["eggs"] == ilevel_1zilevel_1 != ["eggs"]z["eggs"] != ilevel_1z["eggs"] in ilevel_1z"eggs" in ilevel_1z["eggs"] not in ilevel_1z"eggs" not in ilevel_1r¦   r«   r   r   r   Ú"test_query_with_unnamed_multiindexó   s†   zCTestDataFrameQueryWithMultiIndex.test_query_with_unnamed_multiindexc           
      C   s^  t |ƒ tj d¡jddgdd�}t d¡}t ||g¡}d dg|_t	tj d¡ 
d¡|d�}|jd	||d
�}t|j d¡j|dd�}||dk }	t ||	¡ |jd||d
�}t|j d¡j|dd�}||dk }	t ||	¡ |jd||d
�}t|j d¡j|d�}||dk }	t ||	¡ |jd||d
�}t|j d¡j|d�}||dk }	t ||	¡ d S )Nr&   r˜   r™   r…   rš   Úratingr„   r¢   zrating == 1r¥   r£   r%   zrating != 1r±   r   r²   )r!   re   rs   rt   r§   Úaranger   r¨   r¡   r   ru   r6   r   r]   r©   rg   r7   r8   )
r*   r   r   ry   rz   r]   r+   r“   r¬   r¯   r   r   r   Ú*test_query_with_partially_named_multiindexK  s4   

ÿÿzKTestDataFrameQueryWithMultiIndex.test_query_with_partially_named_multiindexc                 C   sÀ   t t d¡tjdd„ tdƒD ƒddgd�d�}| ¡ }d	d
„ }|j ¡ }|j	|||j	dƒ||j	dƒ|dœ}| 
¡ D ]$\}}t|tƒrL| || ¡sKJ ‚q9t|tƒrZt ||| ¡ q9tdƒ‚d S )N©r…   r'   c                 S   s   g | ]}t d ƒ‘qS )r…   )ra   )Ú.0Ú_r   r   r   Ú
<listcomp>n  s    z^TestDataFrameQueryWithMultiIndex.test_query_multiindex_get_index_resolvers.<locals>.<listcomp>r&   Úspamrœ   r    r¢   c                 S   s   |   |¡}| ¡ }| |_|S r   )r©   Ú	to_seriesr]   )ÚmiÚlevelÚlevel_valuesÚsr   r   r   r¼   s  s   
z]TestDataFrameQueryWithMultiIndex.test_query_multiindex_get_index_resolvers.<locals>.to_series)r]   r^   r»   rœ   Úclevel_0z object must be a Series or Index)r   re   Úonesr   r¨   ra   Ú_get_index_resolversr^   r¼   r]   ÚitemsÚ
isinstancer   Úis_r   r7   r:   ÚAssertionError)r*   r+   r‰   r¼   Ú
col_seriesro   ÚkÚvr   r   r   Ú)test_query_multiindex_get_index_resolversj  s,   ÿþ


û

úzJTestDataFrameQueryWithMultiIndex.test_query_multiindex_get_index_resolversN)rH   rI   rJ   r°   r³   r¶   rË   r   r   r   r   r—   À   s
    2Xr—   c                   @   s  e Zd Zejdd„ ƒZ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d!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zej d1d2ej gd3ej!gg¡d4d5„ ƒZ"d6d7„ Z#d8d9„ Z$d:S );ÚTestDataFrameQueryNumExprPandasc                 C   ó   dS ©Nr   r   r)   r   r   r   r   Œ  ó   z&TestDataFrameQueryNumExprPandas.enginec                 C   rÍ   ©Nr   r   r)   r   r   r   r   �  rÏ   z&TestDataFrameQueryNumExprPandas.parserc                 C   s†   t |ƒ ttj d¡ d¡ƒ}tddd�|d< tddd�|d< td	dd�|d
< |jd||d�}||jdk d|j	k @  }t
 ||¡ d S )Nr&   ©rq   r'   ú1/1/2012rq   ©ÚperiodsÚdates1ú1/1/2013Údates2ú1/1/2014Údates3z"@df.dates1 < 20130101 < @df.dates3©r   r   Ú20130101)r!   r   re   rs   rt   ru   r   r6   rÕ   rÙ   r7   r8   ©r*   r   r   r+   r“   Úexpecr   r   r   Ú%test_date_query_with_attribute_access”  s   ÿzETestDataFrameQueryNumExprPandas.test_date_query_with_attribute_accessc                 C   ó~   t tj d¡ d¡ƒ}tddd�|d< tddd�|d< td	dd�|d
< |jd||d�}||jdk d|jk @  }t	 
||¡ d S )Nr&   rÑ   rÒ   rq   rÓ   rÕ   rÖ   r×   rØ   rÙ   údates1 < 20130101 < dates3rÚ   rÛ   ©r   re   rs   rt   ru   r   r6   rÕ   rÙ   r7   r8   rÜ   r   r   r   Ú#test_date_query_no_attribute_access   s   zCTestDataFrameQueryNumExprPandas.test_date_query_no_attribute_accessc                 C   óÊ   d}t tj d¡ |df¡ƒ}td|d�|d< td|d�|d< td	|d�|d
< tj|jtj d¡ |¡dkdf< tj|jtj d¡ |¡dkd
f< |j	d||d�}||j
dk d|jk @  }t ||¡ d S )Nr…   r&   r'   rÒ   rÓ   rÕ   rÖ   r×   rØ   rÙ   ç      à?rà   rÚ   rÛ   ©r   re   rs   rt   ru   r   rŠ   ÚNaTÚlocr6   rÕ   rÙ   r7   r8   ©r*   r   r   rM   r+   r“   rÝ   r   r   r   Útest_date_query_with_NaT©  s   ""z8TestDataFrameQueryNumExprPandas.test_date_query_with_NaTc                 C   ó’   d}t tj d¡ |df¡ƒ}td|d�|d< td|d�|d< |jdd	d	d
�}|d u s-J ‚|jd||d�}||jdk d|j	k @  }t
 ||¡ d S )Nr…   r&   r'   rÒ   rÓ   rÕ   rØ   rÙ   T©ÚinplaceÚdropúindex < 20130101 < dates3rÚ   rÛ   ©r   re   rs   rt   ru   r   Ú	set_indexr6   r]   rÙ   r7   r8   ©r*   r   r   rM   r+   Úreturn_valuer“   rÝ   r   r   r   Útest_date_index_queryµ  s   z5TestDataFrameQueryNumExprPandas.test_date_index_queryc                 C   ó¨   d}t tj d¡ |df¡ƒ dti¡}td|d�|d< td|d�|d	< tj	|j
d
< |jdddd�}|d u s8J ‚|jd||d�}||jdk d|jk @  }t ||¡ d S )Nr…   r&   r'   r   rÒ   rÓ   rÕ   rØ   rÙ   ©r   r   Trë   rî   rÚ   rÛ   ©r   re   rs   rt   ru   ÚastypeÚobjectr   rŠ   ræ   rc   rð   r6   r]   rÙ   r7   r8   rñ   r   r   r   Útest_date_index_query_with_NaTÀ  s   ÿz>TestDataFrameQueryNumExprPandas.test_date_index_query_with_NaTc           	      C   sª   d}i }t d|d�|d< t d|d�|d< t|ƒ}tj|jtj d¡ |¡dkdf< |jdd	d	d
�}|d u s7J ‚|j	d||d�}||j
 ¡ dk d|jk @  }t ||¡ d S )Nr…   rÒ   rÓ   rÕ   rØ   rÙ   r&   rä   Trë   rà   rÚ   rÛ   )r   r   rŠ   ræ   rç   re   rs   rt   rð   r6   r]   r¼   rÙ   r7   r8   )	r*   r   r   rM   Údr+   rò   r“   rÝ   r   r   r   Ú)test_date_index_query_with_NaT_duplicatesÏ  s   "zITestDataFrameQueryNumExprPandas.test_date_index_query_with_NaT_duplicatesc              	   C   s´   d}t td|d�t |¡dœƒ}|jd||d�}t|ƒdks J ‚|jd||d�}t ||¡ d	}d
D ]%}tj	t
|d�� |jd|› d�||d� W d   ƒ n1 sRw   Y  q2d S )Nr…   rÒ   rÓ   )ÚdatesÚnondatezdates == nondater¥   r   zdates != nondatez=Invalid comparison between dtype=datetime64\[ns\] and ndarray)ú<ú>ú<=ú>=rB   zdates z nondate)r   r   re   rµ   r6   Úlenr7   r8   r   rD   Ú	TypeError)r*   r   r   rM   r+   r<   rF   rk   r   r   r   Útest_date_query_with_non_dateÜ  s   ÿÿ€ÿz=TestDataFrameQueryNumExprPandas.test_date_query_with_non_datec                 C   sh   t tdƒtddƒtddƒdœƒ}d}tjt|d�� |jd	||d
� W d   ƒ d S 1 s-w   Y  d S )Nr…   r'   é   rN   é   )ÚirO   Úrzinvalid syntaxrB   zi - +rÚ   )r   ra   r   rD   ÚSyntaxErrorr6   )r*   r   r   r+   rF   r   r   r   Útest_query_syntax_errorí  s
    "ÿz7TestDataFrameQueryNumExprPandas.test_query_syntax_errorc                 C   s  t |ƒ ttj d¡ d¡tdƒd�}d\}}|jd||d�}||j|j	k }t
 ||¡ |jd||d�}|||j	k }t
 ||¡ tjtd	d
�� |jd||d� W d   ƒ n1 s\w   Y  tjtdd
�� |jd||d� W d   ƒ d S 1 s|w   Y  d S )Nr&   )é   r&   r†   r`   )r%   r&   za > brÚ   z@a > bú!local variable 'c' is not definedrB   z@a > b > @czname 'c' is not definedz
@a > b > c)r!   r   re   rs   rt   ru   rb   r6   ry   rz   r7   r8   r   rD   r   )r*   r   r   r+   ry   rz   r“   ro   r   r   r   Útest_query_scopeó  s&   ÿÿý"ÿz0TestDataFrameQueryNumExprPandas.test_query_scopec                 C   sr   d }}t tj d¡j||dfd�tdƒd�}tjtdd�� |j	d	||d
� W d   ƒ d S 1 s2w   Y  d S )Nr…   r&   r'   rš   Úabcr`   zname 'sin' is not definedrB   úsin > 5rÚ   )
r   re   rs   rt   Úintegersrb   r   rD   r   r6   )r*   r   r   rM   rm   r+   r   r   r   Útest_query_doesnt_pickup_local  s   ÿ"ÿz>TestDataFrameQueryNumExprPandas.test_query_doesnt_pickup_localc                 C   s~   d }}t tj d¡j||dfd�tdƒd�}d|j_d}tj	t
|d	�� |jd
||d� W d   ƒ d S 1 s8w   Y  d S )Nr…   r&   r'   rš   r  r`   ÚsinzVariables in expression.+rB   r  rÚ   )r   re   rs   rt   r  rb   r]   r¤   r   rD   r   r6   )r*   r   r   rM   rm   r+   rF   r   r   r   Útest_query_builtin  s   ÿ"ÿz2TestDataFrameQueryNumExprPandas.test_query_builtinc                 C   sv   t tj d¡ d¡g d¢d�}t |jd||d�||j|j	k  ¡ t |jd||d�||j|j	 |j	|j
 k ¡ d S )Nr&   r·   ©ry   rz   rŽ   r`   úa < brÚ   za + b > b * c)r   re   rs   rt   ru   r7   r8   r6   ry   rz   rŽ   ©r*   r   r   r+   r   r   r   Ú
test_query"  s   ÿÿþz*TestDataFrameQueryNumExprPandas.test_queryc                 C   s–   t tj d¡jddd�ttdƒdd�g d¢d�}|jd	||d
�}||jdk |j	|j
k @  }t ||¡ |jd||d
�}||j|j
k  }t ||¡ d S )Nr&   r…   r·   rš   Úblob©r¤   r  r\   z(blob < 5) & (a < b)rÚ   rq   zblob < b)r   re   rs   rt   r  r   ra   r6   r]   ry   rz   r7   r8   rÜ   r   r   r   Útest_query_index_with_name/  s   ýz:TestDataFrameQueryNumExprPandas.test_query_index_with_namec                 C   s‚   t tj d¡jddd�tdƒg d¢d�}|jd||d�}||j|jk  }t	 
||¡ |jd	||d�}||jd
k  }t	 
||¡ d S )Nr&   r…   r·   rš   r  r\   z	index < brÚ   z	index < 5rq   )r   re   rs   rt   r  ra   r6   r]   rz   r7   r8   rÜ   r   r   r   Útest_query_index_without_name>  s   ýz=TestDataFrameQueryNumExprPandas.test_query_index_without_namec                 C   sð   t |ƒ ttj d¡ d¡ƒ}ttj d¡ d¡ƒ}||dk|dk@  }|jd||d�}t ||¡ t	j
d||d�}t ||¡ t	j
d||d�}||dk|dk@ ||dk dk@  }t ||¡ t	j
d||d�}|jd	||d�}t ||¡ d S )
Nr&   rÑ   r   z(@df > 0) & (@df2 > 0)rÚ   zdf[df > 0 and df2 > 0]z)df[df > 0 and df2 > 0 and df[df > 0] > 0]zdf[(df>0) & (df2>0)]ú(@df>0) & (@df2>0))r!   r   re   rs   rt   ru   r6   r7   r8   rŠ   r9   )r*   r   r   r+   Údf2ro   r<   r   r   r   Útest_nested_scopeO  s    ÿ$z1TestDataFrameQueryNumExprPandas.test_nested_scopec                 C   sZ   t tj d¡ d¡ƒ}tjtdd�� |jd||d� W d   ƒ d S 1 s&w   Y  d S )Nr&   rÑ   úname 'df' is not definedrB   zdf > 0rÚ   )	r   re   rs   rt   ru   r   rD   r   r6   r  r   r   r   Ú*test_nested_raises_on_local_self_referencef  s   "ÿzJTestDataFrameQueryNumExprPandas.test_nested_raises_on_local_self_referencec                 C   s„   t |ƒ ttj d¡ d¡tdƒd�}d}||j|k  }|jd||d�}t	 
||¡ ||j|jk  }|jd||d�}t	 
||¡ d S )	Nr&   )éd   r…   Ú
abcdefghijr`   r%   za < @brÚ   r  )r!   r   re   rs   rt   ru   rb   ry   r6   r7   r8   rz   )r*   r   r   r+   rz   Úexpectr<   r   r   r   Útest_local_syntaxm  s   þz1TestDataFrameQueryNumExprPandas.test_local_syntaxc                 C   s’   t |ƒ tdƒ}ttj d¡ dt|ƒf¡|d�}|jd||d�}|j	|j
k |j
|jk @ |j
 |j	¡ @ |j |j
¡ @ }|| }t ||¡ d S )Nr  r&   r!  r`   z!a < b < c and a not in b not in crÚ   )r!   rb   r   re   rs   rt   ru   r  r6   ry   rz   rŽ   rª   r7   r8   )r*   r   r   Úcolsr+   r“   r¬   rÝ   r   r   r   Útest_chained_cmp_and_in}  s   ÿÿ8z7TestDataFrameQueryNumExprPandas.test_chained_cmp_and_inc                 C   sÖ   t |ƒ ttj d¡jddd�dd�}ttj d¡jddd�dd�}t||d	œƒ}|j|jd
  	|¡ }|j
d||d�}t ||¡ ttj d¡jddd�dd�}|j|d
  	|¡ }|j
d||d�}t ||¡ d S )Nr&   r'   é   rš   ry   r  r…   rz   ©ry   rz   r%   z
b - 1 in arÚ   z@b - 1 in a)r!   r   re   rs   rt   r  r   rç   rz   rª   r6   r7   r8   )r*   r   r   ry   rz   r+   ro   r<   r   r   r   Útest_local_variable_with_inŠ  s   z;TestDataFrameQueryNumExprPandas.test_local_variable_with_inc                 C   sJ   t |ƒ d}tdg d¢iƒ}|jd||d�}||jdk }t ||¡ d S )Nr%   ry   )ry   ry   rz   rz   ú@cr*  z	a == "@c"rÚ   r*  ©r!   r   r6   ry   r7   r8   )r*   r   r   rŽ   r+   r<   ro   r   r   r   Útest_at_inside_string™  s   z5TestDataFrameQueryNumExprPandas.test_at_inside_stringc                 C   sx   | j | j}}t|ƒ ttj d¡ d¡tdƒd�}tj	t
dd�� |jd||d� W d   ƒ d S 1 s5w   Y  d S )	Nr&   r„   r†   r`   r  rB   za == @crÚ   )r   r   r!   r   re   rs   rt   rb   r   rD   r   r6   r  r   r   r   Útest_query_undefined_local¡  s   ÿ"ýz:TestDataFrameQueryNumExprPandas.test_query_undefined_localc                 C   s<  d}t jddd… }t|t j d¡ |j¡dœƒ}d|j_|j	d||d�}||d d	k }t
 ||¡ t|t j d¡ |j¡dœƒ}|j	d
||d�}|j|j|jd	k  }t
 ||¡ t|t j d¡ |j¡dœƒ}d|j_|j	d||d�}||jd	k }t
 ||¡ |j	d||d�}|j|j|jd	k  }t
 ||¡ d S )Nr%   r  ée   r&   )r]   rz   r]   z	index > 5rÚ   rq   zilevel_0 > 5r(  ry   za > 5)re   Úr_r   rs   rt   ru   r›   r]   r¤   r6   r7   r8   rç   ry   )r*   r   r   rM   ry   r+   r<   ro   r   r   r   Ú:test_index_resolvers_come_after_columns_with_the_same_name«  s.   ÿÿzZTestDataFrameQueryNumExprPandas.test_index_resolvers_come_after_columns_with_the_same_namezop, fú==ú!=c           
      C   s‚   d}t tj d¡ |¡tj d¡ |¡dœƒ}tj|jd d d…df< d|› d�}|||jtjƒ }|j|||d�}	t 	|	|¡ d S )Nr…   r&   r(  r   úa z infrÚ   )
r   re   rs   rt   Úinfrç   ry   r6   r7   r8   )
r*   rk   Úfr   r   rM   r+   Úqro   r<   r   r   r   Útest_infÊ  s   þÿz(TestDataFrameQueryNumExprPandas.test_infc                 C   sf   |}t ddd|dd�}t|d�}t|d�}| d¡}t ||¡ t|ƒ}| ¡  d¡}t ||¡ d S )Nz
2019-01-01Ú1dr…   Útime)ÚstartÚfreqrÔ   Útzr¤   r¢   z"2018-01-03 00:00:00+00" < time)r   r   r6   r7   r8   Úreset_index)r*   Útz_aware_fixturer<  Údf_indexro   r+   r<   r   r   r   Útest_check_tz_aware_index_queryÙ  s   
ÿ


z?TestDataFrameQueryNumExprPandas.test_check_tz_aware_index_queryc                 C   sÜ   d}t dtj d¡ |¡ tj d¡ |¡dœƒ}||d  d¡dk }|jd||d�}t ||¡ t t tj d¡ |¡d	k tj	tj d¡ 
|¡¡tj d¡ 
|¡dœƒ}||d  ¡  }|jd
||d�}t ||¡ d S )Nr…   r&   r(  ry   Úintr   za.astype('int') == 0rÚ   rä   za.notnull())r   re   rs   rt   r÷   r6   r7   r8   Úwhererv   ru   Únotnull)r*   r   r   rM   r+   ro   r<   r   r   r   Útest_method_calls_in_queryè  s*   þÿýúÿ
z:TestDataFrameQueryNumExprPandas.test_method_calls_in_queryN)%rH   rI   rJ   r   rK   r   r   rÞ   râ   ré   ró   rù   rû   r  r
  r  r  r  r  r  r  r  r   r$  r&  r)  r,  r-  r0  r•   r–   ÚoperatorÚeqÚner7  r@  rD  r   r   r   r   rÌ   Š  s>    

	


rÌ   c                   @   s`   e Zd Zejdd„ ƒZ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S )ÚTestDataFrameQueryNumExprPythonc                 C   rÍ   rÎ   r   r)   r   r   r   r     rÏ   z&TestDataFrameQueryNumExprPython.enginec                 C   rÍ   ©Nr
   r   r)   r   r   r   r   
  rÏ   z&TestDataFrameQueryNumExprPython.parserc                 C   rß   )Nr&   rÑ   rÒ   rq   rÓ   rÕ   rÖ   r×   rØ   rÙ   ú)(dates1 < 20130101) & (20130101 < dates3)rÚ   rÛ   rá   rÜ   r   r   r   râ     s   ÿzCTestDataFrameQueryNumExprPython.test_date_query_no_attribute_accessc                 C   rã   )Nr…   r&   r'   rÒ   rÓ   rÕ   rÖ   r×   rØ   rÙ   rä   rJ  rÚ   rÛ   rå   rè   r   r   r   ré     s   ""ÿz8TestDataFrameQueryNumExprPython.test_date_query_with_NaTc                 C   rê   )Nr…   r&   r'   rÒ   rÓ   rÕ   rØ   rÙ   Trë   ú((index < 20130101) & (20130101 < dates3)rÚ   rÛ   rï   rñ   r   r   r   ró   '  s   ÿz5TestDataFrameQueryNumExprPython.test_date_index_queryc                 C   rô   )Nr…   r&   r'   r   rÒ   rÓ   rÕ   rØ   rÙ   rõ   Trë   rK  rÚ   rÛ   rö   rñ   r   r   r   rù   4  s   ÿÿz>TestDataFrameQueryNumExprPython.test_date_index_query_with_NaTc                 C   sÄ   d}t tj d¡ |df¡ƒ}td|d�|d< td|d�|d< tj|jtj d¡ |¡d	kdf< |j	dd
d
d�}|d u s>J ‚d}t
jt|d�� |jd||d� W d   ƒ d S 1 s[w   Y  d S )Nr…   r&   r'   rÒ   rÓ   rÕ   rØ   rÙ   rä   Trë   ú"'BoolOp' nodes are not implementedrB   rî   rÚ   )r   re   rs   rt   ru   r   rŠ   ræ   rç   rð   r   rD   ÚNotImplementedErrorr6   )r*   r   r   rM   r+   rò   rF   r   r   r   rû   E  s   ""ÿzITestDataFrameQueryNumExprPython.test_date_index_query_with_NaT_duplicatesc           	      C   s@  d}t jd||d�}|dksJ ‚ttj d¡ d¡ƒ}ttj d¡ d¡ƒ}d}tjt	|d�� |j
d||d� W d   ƒ n1 sBw   Y  tjtd	d�� |j
d
||d� W d   ƒ n1 saw   Y  ||dk|dk@  }t jd||d�}t ||¡ ||dk|dk@ ||dk dk@  }t jd||d�}t ||¡ d S )Nr%   zx + 1rÚ   r&   rÑ   z5The '@' prefix is only supported by the pandas parserrB   r  r  z(df>0) & (df2>0)r   zdf[(df > 0) & (df2 > 0)]z+df[(df > 0) & (df2 > 0) & (df[df > 0] > 0)])rŠ   r9   r   re   rs   rt   ru   r   rD   r	  r6   r   r7   r8   )	r*   r   r   r   r<   r+   r  rF   ro   r   r   r   r  Q  s(   ÿÿ$ÿz1TestDataFrameQueryNumExprPython.test_nested_scopec                 C   s”   t g d¢g d¢dœƒ}d}tjt|d�� | d¡ W d   ƒ n1 s$w   Y  d}tjt|d�� | d¡ W d   ƒ d S 1 sCw   Y  d S )	Nr$   ©rN   rq   é   )ÚminÚmaxzMVariables in expression \"\(min\) == \(1\)\" overlap with builtins: \('min'\)rB   zmin == 1zMVariables in expression \"\(max\) == \(1\)\" overlap with builtins: \('max'\)zmax == 1)r   r   rD   r   r6   )r*   r+   Úregex_to_matchr   r   r   Ú+test_query_numexpr_with_min_and_max_columnsl  s   ÿÿÿ"ÿzKTestDataFrameQueryNumExprPython.test_query_numexpr_with_min_and_max_columnsN)rH   rI   rJ   r   rK   r   r   râ   ré   ró   rù   rû   r  rS  r   r   r   r   rH    s    

rH  c                   @   ó0   e Zd Zejdd„ ƒZejdd„ ƒZdd„ ZdS )ÚTestDataFrameQueryPythonPandasc                 C   rÍ   rI  r   r)   r   r   r   r   ~  rÏ   z%TestDataFrameQueryPythonPandas.enginec                 C   rÍ   rÐ   r   r)   r   r   r   r   ‚  rÏ   z%TestDataFrameQueryPythonPandas.parserc                 C   ód   d }}t tj d¡j||dfd�tdƒd�}d|j_||jdk }|jd	||d
�}t	 
||¡ d S ©Nr…   r&   r'   rš   r  r`   r  rq   r  rÚ   ©r   re   rs   rt   r  rb   r]   r¤   r6   r7   r8   ©r*   r   r   rM   rm   r+   ro   r<   r   r   r   r  †  ó   ÿz1TestDataFrameQueryPythonPandas.test_query_builtinN©rH   rI   rJ   r   rK   r   r   r  r   r   r   r   rU  }  ó    

rU  c                   @   rT  )ÚTestDataFrameQueryPythonPythonc                 C   rÍ   rI  r   r)   r   r   r   r   “  rÏ   z%TestDataFrameQueryPythonPython.enginec                 C   rÍ   rI  r   r)   r   r   r   r   —  rÏ   z%TestDataFrameQueryPythonPython.parserc                 C   rV  rW  rX  rY  r   r   r   r  ›  rZ  z1TestDataFrameQueryPythonPython.test_query_builtinNr[  r   r   r   r   r]  ’  r\  r]  c                
   @   s¼   e 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ejgdejgdejgdejgg¡dd„ ƒZdd„ Zdd„ Ze	j
 dg d¢g d¢g d¢g d¢g d¢g d¢g¡dd „ ƒZd!S )"ÚTestDataFrameQueryStringsc              	   C   s¶  t tj d¡ d¡dgd�}ttdƒƒ|d< ||jdk }|dkrd}d	}|gd |gd  }|d d d
… }d\}	}
d|	g|
g  }d}t|||ƒD ]2\}}}|› d|› d|› �}t	j
t|d�� |j|||d|jid� W d   ƒ n1 sww   Y  qJd S |jd||d�}t ||¡ |jd||d�}t ||¡ t |||j dg¡ ¡ ||jdk }|jd||d�}t ||¡ |jd||d�}t ||¡ t |||j dg¡  ¡ d S )Nr&   ©r…   r%   rz   r`   Ú
aabbccddeeÚstringsry   r   z"a"r_   ©r1  r2  ú$'(Not)?In' nodes are not implementedú rB   )r   r   Ú
local_dictz"a" == stringsrÚ   zstrings == "a"zstrings != "a"z"a" != strings)r   re   rs   rt   ru   r   rb   ra  Úzipr   rD   rM  r6   r7   r8   rª   ©r*   r   r   r+   r#  ÚcolÚlstÚlhsÚrhsrF  rG  ÚopsrF   rk   Úexr“   r   r   r   Útest_str_query_method¨  sD   üÿ€þ
 z/TestDataFrameQueryStrings.test_str_query_methodc              	   C   s†  t tj d¡ d¡dgd�}ttdƒƒ|d< ||j ddg¡ }|dkr~d}d	}|gd |gd  }|d d d
… }d\}	}
d|	g|
g  }d}t	|||ƒD ].\}}}|› d|› d|› �}t
jt|d�� |j|||d� W d   ƒ n1 svw   Y  qMd S |jd||d�}t ||¡ |jd||d�}t ||¡ ||j ddg¡  }|jd||d�}t ||¡ |jd||d�}t ||¡ d S )Nr&   r_  rz   r`   r`  ra  ry   r   z
["a", "b"]r_   rb  rc  rd  rB   rÚ   zstrings == ["a", "b"]z["a", "b"] == stringszstrings != ["a", "b"]z["a", "b"] != strings)r   re   rs   rt   ru   r   rb   ra  rª   rf  r   rD   rM  r6   r7   r8   rg  r   r   r   Útest_str_list_query_methodÑ  s6   ÿ€þz4TestDataFrameQueryStrings.test_str_list_query_methodc                 C   s<  t tdƒtdƒtj d¡jddd�tj d¡jddd�dœƒ}|d	krY|jd
||d�}||j |j	¡ }t
 ||¡ |jd||d�}||j |j	¡|j|jk @  }t
 ||¡ d S d}tjt|d�� |jd
||d� W d   ƒ n1 suw   Y  d}tjt|d�� |jd||d� W d   ƒ d S 1 s—w   Y  d S )NÚaaaabbbbccccÚaabbccddeeffr&   rq   é   rš   é	   ©ry   rz   rŽ   rú   r   za in br¥   za in b and c < drc  rB   rL  )r   rb   re   rs   rt   r  r6   ry   rª   rz   r7   r8   rŽ   rú   r   rD   rM  )r*   r   r   r+   r“   rÝ   rF   r   r   r   Útest_query_with_string_columnsô  s,   üÿÿ"ÿz8TestDataFrameQueryStrings.test_query_with_string_columnsc                 C   s  t tdƒtdƒtj d¡jddd�tj d¡jddd�dœƒ}|r'|d	kr'tnd }t |¡� |j	d
||d�}W d   ƒ n1 sAw   Y  ||j
|jk }t ||¡ t |¡� |j	d||d�}W d   ƒ n1 slw   Y  ||j
|jk }t ||¡ d S )Nrp  rq  r&   rq   rr  rš   rs  rt  r   za == br¥   za != b)r   rb   re   rs   rt   r  ÚRuntimeWarningr7   Úassert_produces_warningr6   ry   rz   r8   )r*   r   r   Úusing_infer_stringr+   Úwarningr“   r¯   r   r   r   Útest_object_array_eq_ne  s$   üÿÿÿz1TestDataFrameQueryStrings.test_object_array_eq_nec           	      C   sŽ   t |ƒ dd„ tddƒD ƒd }tdddd	�}td
ddd	�}tt dd¡ d¡|| |¡dœƒ}||jdk }|j	d||d�}t
 ||¡ d S )Nc                 S   s&   g | ]}d D ]
}d|› d|› �‘qqS ))ÚloadÚexitzpage rd  r   )r¸   rM   Úactr   r   r   rº   $  s
    ÿÿzLTestDataFrameQueryStrings.test_query_with_nested_strings.<locals>.<listcomp>r%   rN   r&   z2014-01-01 0:00:01Ú30srO  )r;  rÔ   z2014-02-01 1:00:01é   )ÚidÚeventÚ	timestampz"page 1 load"z'"page 1 load"' in eventr¥   )r!   ra   r   r   re   rµ   ÚrepeatÚappendr�  r6   r7   r8   )	r*   r   r   ÚeventsÚstamps1Ústamps2r+   ro   r“   r   r   r   Útest_query_with_nested_strings"  s"   ÿþýÿz8TestDataFrameQueryStrings.test_query_with_nested_stringsc                 C   sL   t |ƒ tg d¢g d¢dœƒ}|jd||d�}||jdk }t ||¡ d S )N)ry   rz   útest & testr$   r(  za == "test & test"r¥   r‰  r+  )r*   r   r   r+   r“   rÝ   r   r   r   Ú(test_query_with_nested_special_character5  s
   zBTestDataFrameQueryStrings.test_query_with_nested_special_characterzop, funcrþ   rÿ   r   r  c                 C   s°   t tj d¡ tdƒd¡ƒ}t t |j¡ƒ}t||dœƒ}|r%|dkr%t	nd }	t
 |	¡� |jd|› d�||d�}
W d   ƒ n1 sCw   Y  |||jd	ƒ }t
 |
|¡ d S )
Nr&   Úabcder  )ÚXr‘   r   zX z "d"rÚ   rú   )r   re   rs   rt   r§   rb   rµ   r›   r   rv  r7   rw  r6   rŒ  r8   )r*   r   r   rk   Úfuncrx  ry   rz   r+   ry  r“   ro   r   r   r   Útest_query_lex_compare_strings<  s   ÿz8TestDataFrameQueryStrings.test_query_lex_compare_stringsc                 C   sd   d}t j d¡jddt|ƒfd� t¡}t||d�}|jd||d�}||j	|j
@  }t ||¡ d S )N)ÚbidÚbidsizeÚaskÚasksizer&   r%   rš   r`   z	bid & askrÚ   )re   rs   rt   r  r  r÷   Úboolr   r6   r�  r‘  r7   r8   )r*   r   r   r^   Údatar+   r“   ro   r   r   r   Ú"test_query_single_element_booleansR  s   $z<TestDataFrameQueryStrings.test_query_single_element_booleansc                 C   sP   t |ƒ tg d¢g d¢dœƒ}||jdk }d}|jd||d�}t ||¡ d S )N)úBUD USr–  úIBM USr—  )gÍÌÌÌÌl[@g®Gázn[@gš™™™™éf@g33333ëf@)ÚSymbolÚPricer–  zSymbol == @symbr¥   )r!   r   r˜  r6   r7   r8   )r*   r   r   r+   ÚeÚsymbr  r   r   r   Ú!test_query_string_scalar_variableZ  s   þÿz;TestDataFrameQueryStrings.test_query_string_scalar_variableÚin_list)NÚasdfÚghjk)rž  NrŸ  )rž  rŸ  N)NNrž  )rž  NN)NNNc           
      C   s¬   d}d}dd„ t |ƒD ƒ}td|idd�}|j d¡|_td|idd�}|jd	||d
�}||d dk }|jd||d
�}	t ||¡ t ||¡ t ||	¡ t ||	¡ d S )Nr   r
   c                 S   s   i | ]\}}|d kr||“qS )rž  r   )r¸   r  Úvaluer   r   r   Ú
<dictcomp>v  s    zMTestDataFrameQueryStrings.test_query_string_null_elements.<locals>.<dictcomp>ry   Ústring©ÚdtypeÚint64za == 'asdf'r¥   rž  za <= 'asdf')Ú	enumerater   r]   r÷   r6   r7   r8   )
r*   r�  r   r   ro   Údf_expectedr+   r­   r®   Úres3r   r   r   Útest_query_string_null_elementsg  s   z9TestDataFrameQueryStrings.test_query_string_null_elementsN)rH   rI   rJ   rn  ro  ru  rz  rˆ  rŠ  r   r•   r–   rE  ÚltÚgtÚleÚgerŽ  r•  rœ  r©  r   r   r   r   r^  §  s:    )#üþ
	úþr^  c                   @   sD   e Zd Zejdd„ ƒZdd„ Zdd„ Zej 	dg d¢¡d	d
„ ƒZ
dS )ÚTestDataFrameEvalWithFramec                 C   s   t tj d¡ d¡tdƒd�S )Nr&   r·   r  r`   )r   re   rs   rt   ru   rb   r)   r   r   r   Úframe…  s   ÿz TestDataFrameEvalWithFrame.framec                 C   s,   |j d||d�}|j|j }t ||¡ d S )Nr‡   rÚ   ©r9   ry   rz   r7   r:   ©r*   r¯  r   r   r“   r#  r   r   r   Útest_simple_expr‹  s   z+TestDataFrameEvalWithFrame.test_simple_exprc                 C   s6   |j d||d�}|j|jdk  |j }t ||¡ d S )Nza[a < 1] + brÚ   r%   r°  r±  r   r   r   Útest_bool_arith_expr�  s   z/TestDataFrameEvalWithFrame.test_bool_arith_exprrk   )rO   rR   rU   rX   c                 C   sf   t ddgddgdœƒ}d}tjt|d�� |jd|› d	�||d
� W d   ƒ d S 1 s,w   Y  d S )Nr%   r&   rŽ   rú   r(  z:unsupported operand type\(s\) for .+: '.+' and '.+'|CannotrB   r3  z brÚ   )r   r   rD   r  r9   )r*   r   r   rk   r+   rF   r   r   r   Ú%test_invalid_type_for_operator_raises•  s
   "ÿz@TestDataFrameEvalWithFrame.test_invalid_type_for_operator_raisesN)rH   rI   rJ   r   rK   r¯  r²  r³  r•   r–   r´  r   r   r   r   r®  „  s    
r®  c                   @   s0  e Zd Z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dd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zej  d5g d6¢¡d7d8„ ƒZ!ej  d9d:d;g¡ej  d5g d6¢¡d<d=„ ƒƒZ"d>d?„ Z#d@S )AÚ!TestDataFrameQueryBacktickQuotingc                 c   sÞ   � t i dg d¢“dg d¢“dg d¢“dg d¢“d	g d
¢“dg d¢“dg d¢“dg d¢“dg d¢“dg d¢“dg d¢“dg d¢“dg d¢“dg d¢“dg d¢“dg d ¢“d!g d"¢“g d#¢g d$¢g d%¢g d&¢g d'¢d(œ¥ƒV  d)S )*zÄ
        Yields a dataframe with strings that may or may not need escaping
        by backticks. The last two columns cannot be escaped by backticks
        and should raise a ValueError.
        r#   r$   úB B)r'   r&   r%   úC CrN  úC  C)r  rN   r'   ÚC_C)é   rs  r…   úD_D D)é   r%   r.  úE.E)rO  r'   rq   úF-F)rº  r%   r…   Ú1e1)r&   rN   rº  Údef)r…   r¼  r&   úA (x))rN   r%   r'   zB(x))r%   r%   rq   zB (x))r&   r  rN   õ     &^ :!â‚¬$?(} >    <++*''  )r&   rq   rO  r‚   )r…   r¼  r%   ú A)rN   r  rs  ú  ©r%   r&   r%   )rO  r'   r%   )rs  r%   rº  )rº  r  rO  )r&   rN   rq   )rq   r  rs  )zit'szthat'su   â˜ºzfoo#barr%   Nr(   r)   r   r   r   r+   Ÿ  sX   €ÿþýüûúùø	÷
öõôóòñðïê
ÿz$TestDataFrameQueryBacktickQuoting.dfc                 C   s*   |  d¡}|d|d k  }t ||¡ d S )Nz	1 < `B B`r%   r¶  ©r6   r7   r8   ©r*   r+   r“   r#  r   r   r   Ú#test_single_backtick_variable_queryÁ  ó   
zETestDataFrameQueryBacktickQuoting.test_single_backtick_variable_queryc                 C   s6   |  d¡}|d|d k d|d k @  }t ||¡ d S )Nz1 < `B B` and 4 < `C C`r%   r¶  rN   r·  rÆ  rÇ  r   r   r   Ú!test_two_backtick_variables_queryÆ  s   
zCTestDataFrameQueryBacktickQuoting.test_two_backtick_variables_queryc                 C   ó*   |  d¡}|d |d  }t ||¡ d S )Nz	A + `B B`r#   r¶  ©r9   r7   r:   rÇ  r   r   r   Ú"test_single_backtick_variable_exprË  rÉ  zDTestDataFrameQueryBacktickQuoting.test_single_backtick_variable_exprc                 C   rË  )Nz`B B` + `C C`r¶  r·  rÌ  rÇ  r   r   r   Ú test_two_backtick_variables_exprÐ  rÉ  zBTestDataFrameQueryBacktickQuoting.test_two_backtick_variables_exprc                 C   rË  )Nz	`C_C` + Ar¹  r#   rÌ  rÇ  r   r   r   Ú test_already_underscore_variableÕ  rÉ  zBTestDataFrameQueryBacktickQuoting.test_already_underscore_variablec                 C   rË  )NzC_C + `C C`r¹  r·  rÌ  rÇ  r   r   r   Útest_same_name_but_underscoresÚ  rÉ  z@TestDataFrameQueryBacktickQuoting.test_same_name_but_underscoresc                 C   rË  )NzA + `D_D D`r#   r»  rÌ  rÇ  r   r   r   Ú!test_mixed_underscores_and_spacesß  rÉ  zCTestDataFrameQueryBacktickQuoting.test_mixed_underscores_and_spacesc                 C   rË  )Nz	A + `C_C`r#   r¹  rÌ  rÇ  r   r   r   Ú'test_backtick_quote_name_with_no_spacesä  rÉ  zITestDataFrameQueryBacktickQuoting.test_backtick_quote_name_with_no_spacesc                 C   s2   |  d¡}|d |d  |d  }t ||¡ d S )Nz`E.E` + `F-F` - Ar½  r¾  r#   rÌ  rÇ  r   r   r   Útest_special_charactersé  s   
z9TestDataFrameQueryBacktickQuoting.test_special_charactersc                 C   rË  )Nz	A + `1e1`r#   r¿  rÌ  rÇ  r   r   r   Útest_start_with_digitî  rÉ  z7TestDataFrameQueryBacktickQuoting.test_start_with_digitc                 C   rË  )Nz	A + `def`r#   rÀ  rÌ  rÇ  r   r   r   Útest_keywordó  rÉ  z.TestDataFrameQueryBacktickQuoting.test_keywordc                 C   ó*   |  d¡}||d dk }t ||¡ d S )Nz`A` > 2r#   r&   rÆ  rÇ  r   r   r   Útest_unneeded_quotingø  rÉ  z7TestDataFrameQueryBacktickQuoting.test_unneeded_quotingc                 C   rÖ  )Nz`A (x)` > 2rÁ  r&   rÆ  rÇ  r   r   r   Útest_parenthesisý  rÉ  z2TestDataFrameQueryBacktickQuoting.test_parenthesisc                 C   rÖ  )Nz`` > 5r‚   rq   rÆ  rÇ  r   r   r   Útest_empty_string  rÉ  z3TestDataFrameQueryBacktickQuoting.test_empty_stringc                 C   rÖ  )Nz
`C  C` > 5r¸  rq   rÆ  rÇ  r   r   r   Útest_multiple_spaces  rÉ  z6TestDataFrameQueryBacktickQuoting.test_multiple_spacesc                 C   rË  )Nz` A` + `  `rÃ  rÄ  rÌ  rÇ  r   r   r   Útest_start_with_spaces  rÉ  z8TestDataFrameQueryBacktickQuoting.test_start_with_spacesc                 C   rÖ  )Nu"   `  &^ :!â‚¬$?(} >    <++*''  ` > 4rÂ  rN   rÆ  rÇ  r   r   r   Útest_lots_of_operators_string  rÉ  z?TestDataFrameQueryBacktickQuoting.test_lots_of_operators_stringc                 C   óB   d}t jt|d�� | d¡ W d   ƒ d S 1 sw   Y  d S )Nz(module 'pandas' has no attribute 'thing'rB   z	@pd.thing)r   rD   ÚAttributeErrorr9   )r*   r+   Úmessager   r   r   Útest_missing_attribute  ó   "ÿz8TestDataFrameQueryBacktickQuoting.test_missing_attributec                 C   rÝ  )Nú6(Could not convert ).*( to a valid Python identifier.)rB   z`it's` > `that's`©r   rD   r	  r6   r€   r   r   r   Útest_failing_quote  rá  z4TestDataFrameQueryBacktickQuoting.test_failing_quotec                 C   rÝ  )Nrâ  rB   u	   `â˜º` > 4rã  r€   r   r   r   Ú$test_failing_character_outside_range   rá  zFTestDataFrameQueryBacktickQuoting.test_failing_character_outside_rangec                 C   rÝ  )NzFailed to parse backticksrB   z`foo#bar` > 4rã  r€   r   r   r   Útest_failing_hashtag%  rá  z6TestDataFrameQueryBacktickQuoting.test_failing_hashtagc                 C   sŽ   dd„ }|g}|  d¡ tjtdd�� |  d¡ W d  ƒ n1 s#w   Y  tjtdd�� |  d¡ W d  ƒ dS 1 s@w   Y  dS )	zí
        Only attributes and variables ('named functions') can be called.
        .__call__() is not an allowed attribute because that would allow
        calling anything.
        https://github.com/pandas-dev/pandas/pull/32460
        c                  W   rÍ   r/   r   )r¹   r   r   r   r�  2  s   zNTestDataFrameQueryBacktickQuoting.test_call_non_named_expression.<locals>.funcz@func()z"Only named functions are supportedrB   z@funcs[0]()Nz@funcs[0].__call__())r9   r   rD   r  )r*   r+   r�  Úfuncsr   r   r   Útest_call_non_named_expression*  s   
ÿ"ÿz@TestDataFrameQueryBacktickQuoting.test_call_non_named_expressionc                 C   sŒ   t ddgddggddg|d�}trtnd }t |¡� | d¡}W d   ƒ n1 s*w   Y  t g d	¢g d
¢gg d¢|d�}t ||¡ d S )Nr%   r&   r'   rN   ry   rz   ©r^   r¤  z	c = b - arÅ  )r'   rN   r%   r  ©r   r	   rv  r7   rw  r9   r8   )r*   Úany_numeric_ea_and_arrow_dtyper+   ry  r<   ro   r   r   r   Útest_ea_dtypes?  s   ÿÿýz0TestDataFrameQueryBacktickQuoting.test_ea_dtypesc                 C   sŒ   t ddgddggddgdd�}trtnd }t |¡� | d	¡}W d   ƒ n1 s*w   Y  t g d
¢g d¢gg d¢dd�}t ||¡ d S )Nr%   r&   r'   rN   ry   rz   ÚFloat64ré  z	c = b - 1rÅ  )r'   rN   r'   r  rê  )r*   r+   ry  r<   ro   r   r   r   Útest_ea_dtypes_and_scalarN  s   ÿÿz;TestDataFrameQueryBacktickQuoting.test_ea_dtypes_and_scalarc                 C   sr   t ddgddggddg|d�}| d¡}t tddg|d	�tddg|d	�tddg|d
 jd	�dœƒ}t ||¡ d S )Nr%   r&   r'   rN   ry   rz   ré  z	c = 2 - 1r£  rŽ   r  )r   r9   r   r¤  r7   r8   )r*   rë  r+   r<   ro   r   r   r   Ú#test_ea_dtypes_and_scalar_operationY  s   ÿ
ýÿzETestDataFrameQueryBacktickQuoting.test_ea_dtypes_and_scalar_operationr¤  )r¥  ÚInt64úint64[pyarrow]c                 C   s¢   |dkr	t  d¡ tdtddg|d�iƒ}dh}|dkr tr tnd }t |¡� | d¡}W d   ƒ n1 s7w   Y  tdtdg|dgd	�iƒ}t 	||¡ d S )
Nrñ  Úpyarrowry   r%   r&   r£  rð  z	a in @ref©r¤  r]   )
r   Úimportorskipr   r   r	   rv  r7   rw  r6   r8   )r*   r¤  r+   Úrefry  r<   ro   r   r   r   Útest_query_ea_dtypesh  s   
ÿz6TestDataFrameQueryBacktickQuoting.test_query_ea_dtypesr   r
   r   c                 C   sØ   |dkrt nd }|dkrtst d¡ |dkrt d¡ ttg d¢dd�tg d¢|d�d	œƒ}t |¡� |j	d
|d�}W d   ƒ n1 sFw   Y  ttddgdddgd�tddg|ddgd�d	œƒ}t 
||¡ d S )Nr   znumexpr not installedrñ  rò  )r%   r%   r&   rð  r£  )r%   r&   r&   r{   zA == Br>   r%   r&   r   ró  )rv  r	   r   r    rô  r   r   r7   rw  r6   r8   )r*   r¤  r   ry  r+   r<   ro   r   r   r   Ú!test_query_ea_equality_comparisonu  s"   

 ÿÿþÿzCTestDataFrameQueryBacktickQuoting.test_query_ea_equality_comparisonc                 C   sT   t j d¡}tdt jd d gdd�itd�}| d¡}tdg itd�}t ||¡ d S )NÚUTCry   T)Úutcr£  za > @now)	rŠ   Ú	TimestampÚnowr   Úto_datetimerø   r6   r7   r8   )r*   rû  r+   r<   ro   r   r   r   Útest_all_nat_in_object‹  s
   
z8TestDataFrameQueryBacktickQuoting.test_all_nat_in_objectN)$rH   rI   rJ   r   rK   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÷  rý  r   r   r   r   rµ  ž  sD    
!
rµ  )'rE  Únumpyre   r   Úpandas.errorsr   r   Úpandas.util._test_decoratorsÚutilÚ_test_decoratorsÚtdr   rŠ   r   r   r   r   r   Úpandas._testingÚ_testingr7   Úpandas.core.computation.checkr	   rK   r   r   Ú
skip_if_nor   r!   r"   rL   r—   rÌ   rH  rU  r]  r^  r®  rµ  r   r   r   r   Ú<module>   sB    
þ
3c K  {x ^