Ë
    *�£j°   ã                  ót  — U d Z ddlmZ ddlZddlmZ ddlZddlZddl	m
Z
 ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ erddlZ eej.                  «       ed«      k\  ZerddlmZ daded<   g aded<   eadaded<   da ded<   h d£h d£dœZ!dZ"d6d7d„Z#d8d9d„Z$d„ Z%d:d„Z&d„ Z'i ejP                  d“ejR                  d“ejT                  d“ejV                  d“ejX                  d“ejZ                  d“ej\                  d “ej^                  d “ej`                  d“ejb                  d“ejd                  d“ejf                  d“ejh                  d!“ejj                  d!“ejl                  d"“ej,                  d#“ejn                  d$“ejp                  d%ejr                  d&ejt                  d'ejv                  d(ejx                  d(ejz                  d)ej|                  d)ej~                  d*ej€                  d*eAdej„                  di¥ZCd+„ ZDd,„ ZE e# e
d-«      «       d.„ ZFd)d(d*d/œZGd:d0„ZHd6d;d1„ZId6d;d2„ZJd6d7d3„ZKd<d4„ZLd=d5„ZMy)>zL
Expressions
-----------

Offer fast expression evaluation through numexpr

é    )ÚannotationsN)ÚTYPE_CHECKING)Ú
get_option)Únp_version_gt2_3)Úfind_stack_level)Ú	roperator)ÚNUMEXPR_INSTALLED)ÚVersionz2.11.0)ÚFuncTypezbool | NoneÚ
_TEST_MODEú
list[bool]Ú_TEST_RESULTzFuncType | NoneÚ	_evaluateÚ_where>   ÚboolÚint32Úint64Úfloat32Úfloat64>   r   r   r   )ÚevaluateÚwherei@B c                ó|   — t         rt        r	t        sdan| at        rt        nt
        at        rt        a	y t        a	y )NF)
r	   r   Ú	ne_gt_211ÚUSE_NUMEXPRÚ_evaluate_numexprÚ_evaluate_standardr   Ú_where_numexprÚ_where_standardr   ©Úvs    úEC:\FundamentalWorkbench\vendor\pandas\core\computation\expressions.pyÚset_use_numexprr"   2   s0   € õ Ý¥Ið  ‰KàˆKõ
 &1Õ!Ô6H€IÝ*Œ^�F´�Fó    c                óv   — t         r3t        r,| €t        j                  «       } t        j                  | «       y y y ©N)r	   r   ÚneÚdetect_number_of_coresÚset_num_threads)Úns    r!   Úset_numexpr_threadsr*   D   s2   € õ �[Øˆ9Ü×)Ñ)Ó+ˆAÜ
×Ñ˜1Õð )Ðr#   c                ó6   — t         rt        d«        | ||«      S )z
    Standard evaluation.
    F)r   Ú_store_test_result)ÚopÚop_strÚleft_opÚright_ops       r!   r   r   M   s   € õ Ü˜5Ô!Ùˆg�xÓ Ð r#   c                óÒ   — |�e|j                   t        kD  rRt        «       }||fD ])  }t        |d«      sŒ||j                  j
                  hz  }Œ+ t        |«      rt        |   |k\  ryy)z2return left_op boolean if we WILL be using numexprÚdtypeTF)ÚsizeÚ_MIN_ELEMENTSÚsetÚhasattrr2   ÚnameÚlenÚ_ALLOWED_DTYPES)r-   r.   r/   r0   Údtype_checkÚdtypesÚos          r!   Ú_can_use_numexprr=   V   sc   € àÐà�<‰<œ-Ò'ä"›uˆFØ˜xÓ(�ä˜1˜gÕ&Ø˜qŸw™wŸ|™|˜nÑ,‘Fð )ô �v”;¤/°+Ñ">À&Ò"HØàr#   c                ór  — d }t        | |||d«      rZ| j                  j                  d«      j                  d«      }|r||}}|}|}	 t	        j
                  d|› d�||dœd¬«      }|r||}}t        rt        |d u«       |€t        | |||«      }|S # t        $ r Y Œ6t        $ r t        |||«      rn‚ Y ŒOw xY w)	Nr   Ú_Úrzleft_value z right_value)Ú
left_valueÚright_valueÚsafe©Ú
local_dictÚcasting)r=   Ú__name__ÚstripÚ
startswithr&   r   Ú	TypeErrorÚNotImplementedErrorÚ_bool_arith_fallbackr   r,   r   )r-   r.   r/   r0   ÚresultÚis_reversedrA   rB   s           r!   r   r   i   sã   € Ø€Fä˜˜F G¨X°zÔBØ—k‘k×'Ñ'¨Ó,×7Ñ7¸Ó<ˆÙà (¨'�XˆGàˆ
Øˆð	Ü—[‘[Ø˜f˜X \Ð2Ø*4À[ÑQØôˆFñ à (¨'�XˆGåÜ˜6¨Ð-Ô.à€~Ü# B¨°¸ÓBˆà€Møô) ò 	ñ Ü"ò 	Ü# F¨G°XÔ>Øàñ ð	ús   ÁB Â	B6ÂB6Â5B6Ú+Ú*Ú-Ú/z**z==z!=z<=Ú<z>=Ú>Ú&Ú|Ú^c                ó0   — t        j                  | ||«      S r%   )Únpr   )Úcondr/   r0   s      r!   r   r   ¶   s   € ä�8‰8�D˜' 8Ó,Ð,r#   c                ó~   — d }t        d d||d«      rt        j                  d| ||dœd¬«      }|€t        | ||«      }|S )Nr   z#where(cond_value, a_value, b_value))Ú
cond_valueÚa_valueÚb_valuerC   rD   )r=   r&   r   r   )rZ   r/   r0   rM   s       r!   r   r   »   sO   € à€Fä˜˜g w°¸'ÔBÜ—‘Ø1Ø&*°wÈ8ÑTØô
ˆð €~Ü   w°Ó9ˆà€Mr#   zcompute.use_numexprc                óˆ   — 	 | j                   t        k(  S # t        $ r# t        | t        t        j
                  f«      cY S w xY wr%   )r2   r   ÚAttributeErrorÚ
isinstancerY   Úbool_)Úxs    r!   Ú_has_bool_dtyperd   Ð   s:   € ð/Ø�w‰wœ$‰ÐøÜò /Ü˜!œd¤B§H¡HÐ-Ó.Ò.ð/ús   ‚ •)AÁ A)rO   rP   rQ   c                óœ   — t        |«      rAt        |«      r6| t        v r.t        j                  d| ›dt        |    ›d�t	        «       ¬«       yy)z¨
    Check if we should fallback to the python `_evaluate_standard` in case
    of an unsupported operation by numexpr, which is the case for some
    boolean ops.
    z'evaluating in Python space because the z> operator is not supported by numexpr for the bool dtype, use z	 instead.)Ú
stacklevelTF)rd   Ú_BOOL_OP_UNSUPPORTEDÚwarningsÚwarnr   )r.   r/   r0   s      r!   rL   rL   Ú   sX   € ô �wÔ¤O°HÔ$=ØÔ)Ñ)Ü�M‰MØ9¸&¸ð Dä+¨FÑ3Ð6°iðAô ,Ó-õ	ð Ør#   c                óT   — t         |    }|�|rt        | |||«      S t        | |||«      S )a  
    Evaluate and return the expression of the op on left_op and right_op.

    Parameters
    ----------
    op : the actual operand
    left_op : left operand
    right_op : right operand
    use_numexpr : bool, default True
        Whether to try to use numexpr.
    )Ú_op_str_mappingr   r   )r-   r/   r0   Úuse_numexprr.   s        r!   r   r   ì   s9   € ô ˜RÑ €FØÐÙä˜R ¨°(Ó;Ð;Ü˜b &¨'°8Ó<Ð<r#   c                óJ   — t         €J ‚|rt        | ||«      S t        | ||«      S )a  
    Evaluate the where condition cond on left_op and right_op.

    Parameters
    ----------
    cond : np.ndarray[bool]
    left_op : return if cond is True
    right_op : return if cond is False
    use_numexpr : bool, default True
        Whether to try to use numexpr.
    )r   r   )rZ   r/   r0   rl   s       r!   r   r      s1   € ô ÐÐÐÙÜ�d˜G XÓ.Ð.ä˜t W¨hÓ7Ð7r#   c                ó   — | a g ay)z¯
    Keeps track of whether numexpr was used.

    Stores an additional ``True`` for every successful use of evaluate with
    numexpr since the last ``get_test_result``.
    N)r   r   r   s    r!   Úset_test_modero     s   € ð €JØ�Lr#   c                ó4   — | rt         j                  | «       y y r%   )r   Úappend)Úused_numexprs    r!   r,   r,     s   € ÙÜ×Ñ˜LÕ)ð r#   c                 ó   — t         } g a | S )z1
    Get test result and reset test_results.
    )r   )Úress    r!   Úget_test_resultru   $  s   € ô
 €CØ€LØ€Jr#   )T)r    r   ÚreturnÚNoner%   )rv   rw   )rv   r   )rl   r   )rr   r   rv   rw   )rv   r   )NÚ__doc__Ú
__future__r   ÚoperatorÚtypingr   rh   ÚnumpyrY   Úpandas._configr   Úpandas.compat.numpyr   Úpandas.util._exceptionsr   Úpandas.corer   Úpandas.core.computation.checkr	   Úpandas.util.versionr
   Únumexprr&   Ú__version__r   Úpandas._typingr   r   Ú__annotations__r   r   r   r   r9   r4   r"   r*   r   r=   r   ÚaddÚraddÚmulÚrmulÚsubÚrsubÚtruedivÚrtruedivÚfloordivÚ	rfloordivÚmodÚrmodÚpowÚrpowÚeqÚleÚltÚgeÚgtÚand_Úrand_Úor_Úror_ÚxorÚrxorÚdivmodÚrdivmodrk   r   r   rd   rg   rL   r   r   ro   r,   ru   © r#   r!   Ú<module>r£      s�  ðòõ #ã Ý  Û ã å %å 0Ý 4å !Ý ;Ý 'áÛá˜Ÿ™Ó'©7°8Ó+<Ñ<€IáÝ'à€
ˆKÓ Ø€ˆjÓ Ø€Ø!€	ˆ?Ó !Ø€ˆÓ ò AÚ)ñ€ð €ô@ô$ò!óò&&ðR!Ø‡L�L�#ð!à‡N�N�Cð!ð ‡L�L�#ð!ð ‡N�N�Cð	!ð
 ‡L�L�#ð!ð ‡N�N�Cð!ð ×Ñ�cð!ð ×Ñ˜ð!ð ×Ñ�tð!ð ×Ñ˜ð!ð ‡L�L�$ð!ð  ‡N�N�Dð!!ð" ‡L�L�$ð#!ð$ ‡N�N�Dð%!ð& ‡K�K�ð'!ð( ‡K�K�ð)!ð* ‡K�K�ð+!ð, ‡K�K�Ø‡K�K�Ø‡K�K�Ø‡M�M�3Ø‡O�O�SØ‡L�L�#Ø‡N�N�CØ‡L�L�#Ø‡N�N�CØ
ˆDØ×Ñ�tñA!€òH-ò
ñ$ ‘
Ð0Ó1Ô 2ò/ð ! s°Ñ5Ð óô$=ô(8ô&	ó*ô
r#   