o
    d5                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlm	Z
 d dlmZmZmZ d dlmZ ejdd Zejdd Zejd	d
 Zejdd Zejdd Zejdd Zejdd Zejdd Zejdd Zejdd Zejdd Zejjej  ddG dd dZ!dS )    N)option_context)	DataFrameIndexSeries)expressionsc                   C      t tjddtdddS )N'     ABCDfloat64columnsdtyper   nprandomrandnlist r   r   Q/app/.heroku/python/lib/python3.10/site-packages/pandas/tests/test_expressions.py_frame      r   c                   C   r   )Nd   r	   r
   r   r   r   r   r   r   r   _frame2   r   r   c                 C   8   t | d  | d d| d d| d ddS 	NABZfloat32Cint64DZint32)r   r   r   r    r   copyZastyper   r   r   r   _mixed      
r$   c                 C   r   r   r!   r   r   r   r   _mixed2(   r%   r'   c                   C       t tjjddddtdddS )N   r   )r   r	   sizer
   r   r   r   r   r   randintr   r   r   r   r   _integer4      r.   c                 C   s   | t jjddt | d S )Nr      r*   )r   r   r-   shape)r.   r   r   r   _integer_randint;   s   r2   c                   C   r(   )Nr)   r   )e   r	   r*   r
   r   r   r,   r   r   r   r   	_integer2A   r/   r4   c                 C      | d j  S Nr   valuesr"   r#   r   r   r   _arrayH      r9   c                 C   r5   r6   r7   r&   r   r   r   _array2M   r:   r;   c                 C   r5   Nr    r7   )r$   r   r   r   _array_mixedR   r:   r=   c                 C   r5   r<   r7   )r'   r   r   r   _array_mixed2W   r:   r>   znot using numexpr)reasonc                
   @   sL  e Zd Zejdddd ZededefddZ	ej
d	g d
ej
dddgej
dg ddd Zej
d	g d
ej
dddgdd Zdd Zej
dej
dg dej
dddgdd Zej
dddgdd Zej
dddgej
d	g dd d! Zej
d"g d#d$d% Zej
d"g d&d'd( Zej
d)eg d*g d*gg d+d,eddgddggd-d.gd,feg d/g d0g d1gg d+d,eddgddgddggd-d.gd,fgd2d3 Zej
ddej
d4d5d6d7 Zej
d8g d9ej
d:eeegej
d;d<d=gd>d? Zd@S )ATestExpressionsT)Zautousec                 c   s    t j}d V  |t _d S N)expr_MIN_ELEMENTS)selfmin_elementsr   r   r   save_min_elements^   s   
z!TestExpressions.save_min_elementsflexopnamec                    sp   |r fdd} |_ ntt }tdd || |}W d    n1 s&w   Y  t  || |}||fS )Nc                    s   t |  |S rA   )getattr)xyrH   r   r   <lambda>g   s    z)TestExpressions.call_op.<locals>.<lambda>compute.use_numexprF)__name__rI   operatorr   rB   get_test_result)dfotherrG   rH   opexpectedresultr   rL   r   call_opd   s   

zTestExpressions.call_opfixture)r.   r4   r2   r   r   r$   r'   Farith)addsubmulmodtruedivfloordivc           	      C   s   | |}dt_| ||||\}}|dkr#tdd |jjD s#J t|| t	t
|jD ],}| |jd d |f |jd d |f ||\}}|dkrV|jjdksVJ t|| q0d S )Nr   r^   c                 s   s    | ]}|j d kV  qdS )fN)kind).0rJ   r   r   r   	<genexpr>   s    z6TestExpressions.test_run_arithmetic.<locals>.<genexpr>r`   )getfixturevaluerB   rC   rW   allZdtypesr8   tmassert_equalrangelenr   ilocr   ra   )	rD   requestrX   rG   rY   rR   rV   rU   ir   r   r   test_run_arithmetict   s   
0z#TestExpressions.test_run_arithmeticc                 C   s   | |}|j}tdd | d }W d   n1 sw   Y  dt_td | ||||\}}	t }
|
s?J dt	
|	| dS )z
        tests solely that the result is the same whether or not numexpr is
        enabled.  Need to test whether the function does the correct thing
        elsewhere.
        rN   Fr)   Nr   Tz Did not use numexpr as expected.)rd   rO   r   r"   rB   rC   Zset_test_moderW   rQ   rf   rg   )rD   rk   rX   rG   comparison_oprR   rY   rS   rV   rU   Zused_numexprr   r   r   test_run_binary   s   

zTestExpressions.test_run_binaryc                 C   sp   t jd}t jd}ttjd ||d}|rJ ttjd||d}|r(J ttjd||d}|s6J d S )NiAB r   evaluate+)r   r   r   rB   _can_use_numexprrP   rZ   )rD   arrayZarray2rV   r   r   r   test_invalid   s   zTestExpressions.test_invalidz>ignore:invalid value encountered in true_divide:RuntimeWarningzopname,op_str))rZ   rq   )r[   -)r\   *)r^   /)pow**zleft_fix,right_fix)r9   r;   )r=   r>   c                    sx   | | | | fdd}tdd |  W d    n1 s&w   Y  td |  t  |  d S )Nc                     s   dkrd S t t} t # d}td|t tj|   dd}tj|   dd}W d    n1 s5w   Y  t	|| t
| d}|rMJ d S )Nrx   z/invalid value encountered in divide|true_divideignoreTuse_numexprFrp   )rI   rP   warningscatch_warningsfilterwarningsRuntimeWarningrB   rp   rf   assert_numpy_array_equalrr   )rT   msgrV   rU   leftop_strrH   rightr   r   testit   s   

z/TestExpressions.test_binary_ops.<locals>.testitrN   Fr)   rd   r   rB   Zset_numexpr_threads)rD   rk   rH   r   left_fix	right_fixr   r   r   r   test_binary_ops   s   



zTestExpressions.test_binary_opsc                    sv   | || | fdd}tdd |  W d    n1 s%w   Y  td |  t  |  d S )Nc                     sb   d } d } }t j|| dd}t j|| dd}t|| t |||d}|r/J d S )Nr)   Tr{   Frp   )rB   rp   rf   r   rr   )Zf12Zf22rT   rV   rU   rn   r   r   r   r   r      s   z3TestExpressions.test_comparison_ops.<locals>.testitrN   Fr)   r   )rD   rk   rn   r   r   r   r   r   r   test_comparison_ops   s   



z#TestExpressions.test_comparison_opscond)r   r   r$   r'   c                    sj   | | fdd}tdd |  W d    n1 sw   Y  td |  t  |  d S )Nc                     sX   t jjt jd} |   t| jjd }t | jjd }t	|| d S )N)r   r)   )
r   emptyr1   Zbool_fillrB   wherer8   rf   r   )crV   rU   r   rR   r   r   r     s
   
z*TestExpressions.test_where.<locals>.testitrN   Fr)   r   )rD   rk   r   rX   r   r   r   r   
test_where  s   


zTestExpressions.test_wherezop_str,opname))rw   r^   )z//r_   )ry   rx   c                 C   s  t tjddktjddkd}d| d}tt|}t|}tj	t
|d ||| W d    n1 s:w   Y  tj	t
|d ||j|j W d    n1 sXw   Y  tj	t
|d ||jd W d    n1 suw   Y  tj	t
|d |d|j W d    n1 sw   Y  tj	t
|d |d| W d    n1 sw   Y  tj	t
|d ||d W d    d S 1 sw   Y  d S )	N
         ?abz
operator 'z!' not implemented for bool dtypes)matchTF)r   r   r   randrI   rP   reescapepytestZraisesNotImplementedErrorr   r   )rD   r   rH   rR   r   r`   err_msgr   r   r   !test_bool_ops_raise_on_arithmetic"  s,   &

"z1TestExpressions.test_bool_ops_raise_on_arithmetic))rq   rZ   )rv   r\   )ru   r[   c              	   C   sr  d}t tj|dktj|dkd}dddd}dd	d
d}tt|}tt|||  }|dkr5d S tjddd t  |||}	|||}
t	|	|
 W d    n1 s\w   Y  t  ||j
|j}	||j
|j}
t|	|
 W d    n1 sw   Y  t  ||j
d}	||j
d}
t|	|
 W d    n1 sw   Y  t  |d|j
}	|d|j
}
t|	|
 W d    n1 sw   Y  t  |d|}	|d|}
t	|	|
 W d    n1 sw   Y  t  ||d}	||d}
t	|	|
 W d    n1 sw   Y  W d    d S W d    d S 1 s2w   Y  d S )Nr   r   r   |&^)rq   rv   ru   or_and_xor)r   r   r   ru   T   )rE   F)r   r   r   r   rI   rP   rf   r|   Zassert_produces_warningassert_frame_equalr   r   Zassert_series_equal)rD   r   rH   nrR   subsZ	sub_funcsr`   Zferer   r   r    test_bool_ops_warn_on_arithmetic>  sT   &












 $z0TestExpressions.test_bool_ops_warn_on_arithmeticztest_input,expected)r   r)   r0   aa)r   r   r   r   )r   r   r   )r      r0   r   )r   r	   r0   r   )r   r)   r)   Zbbc                 C   s>   |j d d ddgf |j d d ddgf }t|| d S )Nr   r   )locnerf   r   )rD   Z
test_inputrU   rV   r   r   r   test_bool_ops_column_name_dtypen  s   .z/TestExpressions.test_bool_ops_column_name_dtypeaxis)r   r)   c           	      C   s   |}|dkr|j dd d f }n	|j d d df }dt_t||}tdd |||d}W d    n1 s7w   Y  |||d}t|| d S )Nr)   r   rN   F)r   )rj   rB   rC   rI   r   rf   r   )	rD   r   rY   r   rR   rS   Zop_funcrU   rV   r   r   r   test_frame_series_axis  s   
z&TestExpressions.test_frame_series_axisrT   )__mod____rmod____floordiv____rfloordiv__boxscalarr   c              	   C   s   dt _tdd}||}t||}||}tdd ||}W d    n1 s*w   Y  t|| t|D ]/\}	}
|t	krI|j
|	df }n||	 }ztt|
||}W n	 tya   Y q9w ||kshJ q9d S )Nr   i2   rN   F)rB   rC   r   ZarangerI   r   rf   rg   	enumerater   rj   intZeroDivisionError)rD   rT   r   r   dataobjmethodrV   rU   rl   elemZscalar_resultr   r   r   ,test_python_semantics_with_numexpr_installed  s(   

z<TestExpressions.test_python_semantics_with_numexpr_installedN)rO   
__module____qualname__r   rX   rF   staticmethodboolstrrW   markZparametrizerm   ro   rt   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r@   \   s    




-
	r@   )"rP   r   r}   numpyr   r   Zpandasr   Zpandas._testingZ_testingrf   Zpandas.core.apir   r   r   Zpandas.core.computationr   rB   rX   r   r   r$   r'   r.   r2   r4   r9   r;   r=   r>   r   ZskipifZUSE_NUMEXPRr@   r   r   r   r   <module>   sB    










