Ë
    *�£jæL  ã                  ó$  — d Z ddlmZ ddlZddlmZ ddlZddlmZm	Z	 ddl
ZddlmZmZmZmZmZ ddlmZmZmZmZ ddlmZmZ dd	lmZmZmZmZm Z m!Z! dd
l"m#Z#m$Z$m%Z% ddl&m'Z'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5 erddl6m7Z7m8Z8 d„ Z9d„ Z:dd„Z;dd d„Z<d!d„Z=d"d„Z>d#d„Z?d"d„Z@d„ ZAd$d„ZBej†                  e*jˆ                  ejŠ                  e*jŒ                  ejŽ                  e*j�                  eIe*j”                  hZKd%d„ZLy)&zY
Functions for arithmetic and comparison operations on NumPy arrays and
ExtensionArrays.
é    )ÚannotationsN)Úpartial)ÚTYPE_CHECKINGÚAny)ÚNaTÚ	TimedeltaÚ	TimestampÚlibÚops)Ú
BaseOffsetÚget_supported_dtypeÚis_supported_dtypeÚis_unitless)Ú'construct_1d_object_array_from_listlikeÚfind_common_type)Úensure_objectÚis_bool_dtypeÚis_list_likeÚis_numeric_v_string_likeÚis_object_dtypeÚ	is_scalar)ÚABCExtensionArrayÚABCIndexÚ	ABCSeries)ÚisnaÚnotna)Ú	roperator)Úexpressions)Úensure_wrapped_if_datetimelikeÚsanitize_array)Úmissing)Úshould_extension_dispatch)Úinvalid_comparison)Ú	ArrayLikeÚShapec                óä   — |�kt        | «      }t        |«      }||z  }|j                  «       r| j                  «       } || ||z  <   |j                  «       r|j                  «       }||||z  <   | |fS )a®  
    If a non-None fill_value is given, replace null entries in left and right
    with this value, but only in positions where _one_ of left/right is null,
    not both.

    Parameters
    ----------
    left : array-like
    right : array-like
    fill_value : object

    Returns
    -------
    left : array-like
    right : array-like

    Notes
    -----
    Makes copies if fill_value is not None and NAs are present.
    )r   ÚanyÚcopy)ÚleftÚrightÚ
fill_valueÚ	left_maskÚ
right_maskÚmasks         ú;C:\FundamentalWorkbench\vendor\pandas\core\ops\array_ops.pyÚ
fill_binopr0   J   sy   € ð* ÐÜ˜“Jˆ	Ü˜%“[ˆ
ð ˜:Ñ%ˆà�=‰=Œ?à—9‘9“;ˆDØ%/ˆD�˜TÑ!Ñ"à�>‰>Ôà—J‘J“LˆEØ'1ˆE�*˜tÑ#Ñ$à�ˆ;Ðó    c                óŠ  — t        |t        «      rt        |«      }t        |t        j                  t
        t        f«      rÄt        |j                  «      s|j                  t        j                  «      }t        |t
        t        f«      r|j                  }|j                  |j                  k7  r!t        d|j                  |j                  «      ‚t        j                  |j!                  «       |j!                  «       | «      }n%t        j"                  |j!                  «       || «      }|j%                  |j                  «      S )NzShapes must match)Ú
isinstanceÚlistr   ÚnpÚndarrayr   r   r   ÚdtypeÚastypeÚobject_Ú_valuesÚshapeÚ
ValueErrorÚlibopsÚvec_compareÚravelÚscalar_compareÚreshape)ÚopÚxÚyÚresults       r/   Úcomp_method_OBJECT_ARRAYrF   s   sÖ   € Ü�!”TÔä3°AÓ6ˆä�!”b—j‘j¤)¬XÐ6Ô7Ü˜qŸw™wÔ'Ø—‘œŸ™Ó$ˆAä�aœ)¤XÐ.Ô/Ø—	‘	ˆAà�7‰7�a—g‘gÒÜÐ0°!·'±'¸1¿7¹7ÓCÐCÜ×#Ñ# A§G¡G£I¨q¯w©w«y¸"Ó=‰ä×&Ñ& q§w¡w£y°!°RÓ8ˆØ�>‰>˜!Ÿ'™'Ó"Ð"r1   c                ó  — | j                  «       }t        |t        j                  «      rÓt	        | j
                  |j
                  g«      }t        j                  | j                  |¬«      }t        | «      t        |«      k7  r t        | j                  |j                  «      ‚t        |«      }|j                  «       }t        |«      |j                  «       z  }|j                  «       rÙ |||   ||   «      ||<   nÆt        |«      st        dt        |«      › �«      ‚t        j                  | j                  | j
                  ¬«      }t        |«      }|t         u rt        j"                  | dk(  d|«      }n,|t$        j&                  u rt        j"                  |dk(  d|«      }|j                  «       r |||   |«      ||<   t        j(                  || t        j*                  «       |j-                  | j                  «      }|S )zé
    If the given arithmetic operation fails, attempt it again on
    only the non-null elements of the input array(s).

    Parameters
    ----------
    x : np.ndarray
    y : np.ndarray, Series, Index
    op : binary operator
    ©r7   z1Cannot broadcast np.ndarray with operand of type é   F)r?   r3   r5   r6   r   r7   ÚemptyÚsizeÚlenr<   r;   r   r'   r   Ú	TypeErrorÚtypeÚpowÚwherer   ÚrpowÚputmaskÚnanrA   )	rC   rD   rB   Úxravr7   rE   ÚymaskÚyravr.   s	            r/   Ú_masked_arith_oprW   ‡   sŒ  € ð �7‰7‹9€Dä�!”R—Z‘ZÔ Ü  !§'¡'¨1¯7©7Ð!3Ó4ˆÜ—‘˜!Ÿ&™&¨Ô.ˆäˆq‹6”S˜“VÒÜ˜QŸW™W a§g¡gÓ.Ð.Ü�a“ˆð �w‰w‹yˆÜ�T‹{˜UŸ[™[›]Ñ*ˆð �8‰8Œ:Ù˜d 4™j¨$¨t©*Ó5ˆF�4ŠLô ˜Œ|ÜØCÄDÈÃGÀ9ÐMóð ô
 —‘˜!Ÿ&™&¨¯©Ô0ˆÜ�T‹{ˆð ”‰9Ü—8‘8˜A ™F E¨4Ó0‰DØ”9—>‘>Ñ!Ü—8‘8˜A ™F E¨4Ó0ˆDà�8‰8Œ:Ù˜d 4™j¨!Ó,ˆF�4‰Lä‡J�Jˆv˜�uœbŸf™fÔ%Ø�^‰^˜AŸG™GÓ$€FØ€Mr1   c                ór  — t        |t        «      r|}nt        t        j                  |«      }	  || |«      }|r t        |«      s|t        u rt        | ||«      S t        j                  || ||«      S # t
        $ r; |s5| j                  t        k(  st        |dd«      t        k(  rt        | ||«      }n‚ Y Œ}w xY w)aÇ  
    Return the result of evaluating op on the passed in values.

    If native types are not compatible, try coercion to object dtype.

    Parameters
    ----------
    left : np.ndarray
    right : np.ndarray or scalar
        Excludes DataFrame, Series, Index, ExtensionArray.
    is_cmp : bool, default False
        If this a comparison operation.

    Returns
    -------
    array-like

    Raises
    ------
    TypeError : invalid operation
    r7   N)r3   Ústrr   r   ÚevaluaterM   r7   ÚobjectÚgetattrrW   r   ÚNotImplementedr#   r!   Údispatch_fill_zeros)r)   r*   rB   Úis_cmpÚfuncrE   s         r/   Ú_na_arithmetic_opra   ¿   s¹   € ô, �%œÔà‰ä”{×+Ñ+¨RÓ0ˆðÙ�d˜EÓ"ˆñ ”9˜VÔ$¨´.Ñ(@ô " $¨¨rÓ2Ð2ä×&Ñ& r¨4°¸Ó?Ð?øô% ò 
ÙØ�J‰Jœ&Ò ¤G¨E°7¸DÓ$AÄVÒ$Kô & d¨E°2Ó6‰Fàñ ð
ús   ¯	A2 Á2AB6Â5B6c                óü   — t        |t        «      rt        |d«      }t        |«      }t	        | |«      s#t        |t
        t        t        f«      s|t        u r || |«      }|S t        || |«       t        | ||«      }|S )aO  
    Evaluate an arithmetic operation `+`, `-`, `*`, `/`, `//`, `%`, `**`, ...

    Note: the caller is responsible for ensuring that numpy warnings are
    suppressed (with np.errstate(all="ignore")) if needed.

    Parameters
    ----------
    left : np.ndarray or ExtensionArray
    right : object
        Cannot be a DataFrame or Index.  Series is *not* excluded.
    op : {operator.add, operator.sub, ...}
        Or one of the reversed variants from roperator.

    Returns
    -------
    ndarray or ExtensionArray
        Or a 2-tuple of these in the case of divmod or rdivmod.
    N)r3   r4   r    r   r"   r   r   r	   r   Ú_bool_arith_checkra   )r)   r*   rB   Ú
res_valuess       r/   Úarithmetic_opre   ò   s�   € ô2 �%œÔä˜u dÓ+ˆÜ*¨5Ó1€Eô 	" $¨Ô.Ü�eœi¬´YÐ?Ô@Ø”C‰<ñ ˜˜e“_ˆ
ð Ðô 	˜"˜d EÔ*ô ' t¨U°BÓ7ˆ
àÐr1   c                ó¼  — t        | «      }t        |«      }t        j                  |«      }t        |dd«      dk(  }t	        |t
        «      rt        |d«      }t        |«      }t	        |t        j                  t        f«      r:|s8t        |«      t        |«      k7  r!t        d|j                  |j                  «      ‚t        ||«      s6t	        |t        t        t         f«      s|t"        u r|j$                  t&        k7  r |||«      }|S t)        |«      s|rkt+        |«      r`|t,        j.                  u r't        j0                  |j                  t2        ¬«      }|S t        j4                  |j                  t2        ¬«      }|S t7        ||«      rt9        |||«      S |j$                  t&        k(  st	        |t:        «      rt=        |||«      }|S t?        |||d¬«      }|S )aì  
    Evaluate a comparison operation `=`, `!=`, `>=`, `>`, `<=`, or `<`.

    Note: the caller is responsible for ensuring that numpy warnings are
    suppressed (with np.errstate(all="ignore")) if needed.

    Parameters
    ----------
    left : np.ndarray or ExtensionArray
    right : object
        Cannot be a DataFrame, Series, or Index.
    op : {operator.eq, operator.ne, operator.gt, operator.ge, operator.lt, operator.le}

    Returns
    -------
    ndarray or ExtensionArray
    ÚndimNr   zLengths must match to comparerH   T)r_   ) r   r
   Úitem_from_zerodimr\   r3   r4   r    r5   r6   r   rL   r<   r;   r"   r   r   r	   r   r7   r[   r   r   ÚoperatorÚneÚonesÚboolÚzerosr   r#   rY   rF   ra   )r)   r*   rB   ÚlvaluesÚrvaluesÚrvalues_is_zerodimrd   s          r/   Úcomparison_oprq   &  s¡  € ô& -¨TÓ2€GÜ,¨UÓ3€Gä×#Ñ# GÓ,€Gô  ' w°¸Ó=ÀÑBÐä�'œ4Ô ô ! ¨$Ó/ˆÜ,¨WÓ5€Gä�'œBŸJ™JÔ(9Ð:Ô;ÑDVô ˆw‹<œ3˜w›<Ò'ÜØ/°·±ÀÇÁóð ô ! ¨'Ô2Ü	�Gœi¬´YÐ?Ô	@ÀEÌSÁLØ�M‰MœVÒ#ñ ˜ Ó)ˆ
ð( Ðô# �GÔ
Ñ 2¼¸W¼à”—‘ÑÜŸ™ §¡´dÔ;ˆJð Ðô Ÿ™ '§-¡-´tÔ<ˆJð Ðô 
" '¨7Ô	3ä! '¨7°BÓ7Ð7à	�‰œ&Ò	 ¤J¨w¼Ô$<Ü-¨b°'¸7ÓCˆ
ð
 Ðô ' w°¸ÀDÔIˆ
àÐr1   c                óô  — 	  || |«      }|j+                  | j,                  «      S # t         $ �rG t        |t        j                  «      r~| j                  j
                  dk(  r|j                  j
                  dk(  rJ ‚t        | «      } t        |«      }t        j                  | j                  «       |j                  «       |«      }n«t        j                  |«      sJ ‚t        |«      st        |«      }	 t        j                  | ||«      }ne# t         t        t         t"        t$        f$ rD}t'        |«      j(                  }t        d|j(                  › d| j                  › d|› d�«      |‚d }~ww xY wY �Œkw xY w)NÚbzCannot perform 'z' with a dtyped [z] array and scalar of type [Ú])rM   r3   r5   r6   r7   Úkindr   r=   Ú	vec_binopr?   r
   r   r   rl   Úscalar_binopr<   ÚAttributeErrorÚOverflowErrorÚNotImplementedErrorrN   Ú__name__rA   r;   )rC   rD   rB   rE   ÚerrÚtyps         r/   Úna_logical_opr~   l  sJ  € ð#ñ �A�q“ˆð8 �>‰>˜!Ÿ'™'Ó"Ð"øô7 ó Ü�aœŸ™Ô$àŸ™Ÿ™¨Ò+°·±·±ÀÒ0CÐDÐDÜ˜aÓ ˆAÜ˜aÓ ˆAÜ×%Ñ% a§g¡g£i°·±³¸BÓ?‰Fô —=‘= Ô#Ð#Ð#Ü˜”7Ü˜“G�ðÜ×,Ñ,¨Q°°2Ó6‘øäÜÜÜÜ#ðò ô ˜1“g×&Ñ&�ÜØ& r§{¡{ mÐ3DÀQÇWÁWÀIð N+Ø+.¨%¨qð2óð ðûðýðús4   ‚	& ¦CE7Ã6DÄE7ÄE0Ä,?E+Å+E0Å0E7Å6E7c                óÈ  — dd„}t        j                  |«      }t        |«      rt        |d«      st	        d«      ‚t        | «      }|}t        ||«      r |||«      }|S t        |t        j                  «      r$|j                  j                  dv }|s |||«      }nt        j                  |«      }t        |||«      }| j                  j                  dv r|s ||«      }|S )ag  
    Evaluate a logical operation `|`, `&`, or `^`.

    Parameters
    ----------
    left : np.ndarray or ExtensionArray
    right : object
        Cannot be a DataFrame, Series, or Index.
    op : {operator.and_, operator.or_, operator.xor}
        Or one of the reversed variants from roperator.

    Returns
    -------
    ndarray or ExtensionArray
    c                ó   — | j                   j                  dv r5t        | «      }|j                  «       r| j	                  t
        «      } d| |<   |�|j                   j                  dk(  r| j	                  t        «      } | S )NÚcfOFrs   )r7   ru   r   r'   r8   r[   rl   )rC   r)   r.   s      r/   Ú	fill_boolzlogical_op.<locals>.fill_bool¦  sa   € à�7‰7�<‰<˜5Ñ ä˜“7ˆDØ�x‰xŒzØ—H‘HœVÓ$�Ø��$‘àˆ<˜4Ÿ:™:Ÿ?™?¨cÒ1Ø—‘œ“ˆAØˆr1   r7   zÀLogical ops (and, or, xor) between Pandas objects and dtype-less sequences (e.g. list, tuple) are no longer supported. Wrap the object in a Series, Index, or np.array before operating instead.Úiu)N)r
   rh   r   ÚhasattrrM   r   r"   r3   r5   r6   r7   ru   Ú
is_integerr~   )r)   r*   rB   r‚   rn   ro   rd   Úis_other_int_dtypes           r/   Ú
logical_opr‡   •  sã   € ó"ô ×!Ñ! %Ó(€EÜ�EÔ¤7¨5°'Ô#:äð(ó
ð 	
ô -¨TÓ2€GØ€Gä  ¨'Ô2á˜ Ó)ˆ
ð& Ðô! �gœrŸz™zÔ*Ø!(§¡×!3Ñ!3°tÐ!;ÐÙ%Ù# G¨WÓ5‘ô "%§¡°Ó!8Ðä" 7¨G°RÓ8ˆ
ð —
‘
—‘ 4Ñ'Ñ,>Ù" :Ó.ˆJàÐr1   c                ó  — t        | t        «      r| S | j                  j                  d«      j	                  d«      }|dk(  r| S |dv rt        t
        | ¬«      S |dv rt        t        | ¬«      S |dv rt        t        | ¬«      S t        |«      ‚)zì
    Return a binary array operation corresponding to the given operator op.

    Parameters
    ----------
    op : function
        Binary operator from operator or roperator module.

    Returns
    -------
    functools.partial
    Ú_ÚrÚarith_op>   ÚeqÚgeÚgtÚleÚltrj   )rB   >   ÚorÚandÚrorÚxorÚrandÚrxor>   ÚaddÚmodÚmulrO   ÚsubÚdivmodÚtruedivÚfloordiv)	r3   r   r{   ÚstripÚlstriprq   r‡   re   rz   )rB   Úop_names     r/   Úget_array_opr¡   Ú  s–   € ô �"”gÔð ˆ	à�k‰k×Ñ Ó$×+Ñ+¨CÓ0€GØ�*Òð ˆ	àÐ6Ñ6Ü”}¨Ô,Ð,Ø	Ð?Ñ	?Ü”z bÔ)Ð)Ø	ð 	ñ 	
ô ”}¨Ô,Ð,ä! 'Ó*Ð*r1   c                ó^  — t        | «      t        j                  u rt        | «      S t        | «      t        j                  u rt	        | «      S t        | t        j                  «      r±t        | «      r›ddl	m
} t        | j                  «      r| j                  d«      } n;t        | j                  «      s&t        | j                  «      }| j                  |«      } t        j                   | |«      }|j#                  ||j                  ¬«      S t	        | «      S t        | t        j$                  «      r±t        | «      r›ddl	m} t        | j                  «      r| j                  d«      } n;t        | j                  «      s&t        | j                  «      }| j                  |«      } t        j                   | |«      }|j#                  ||j                  ¬«      S t        | «      S t        | t        j(                  «      rt+        | «      S t        | t        j,                  «      rt/        | «      S | S )ax  
    Cast non-pandas objects to pandas types to unify behavior of arithmetic
    and comparison operations.

    Parameters
    ----------
    obj: object
    shape : tuple[int]

    Returns
    -------
    out : object

    Notes
    -----
    Be careful to call this *after* determining the `name` attribute to be
    attached to the result of the arithmetic operation.
    r   )ÚDatetimeArrayzdatetime64[s]rH   )ÚTimedeltaArrayztimedelta64[s])rN   ÚdatetimeÚ	timedeltar   r	   r3   r5   Ú
datetime64r   Úpandas.core.arraysr£   r   r7   r8   r   r   Úbroadcast_toÚ_simple_newÚtimedelta64r¤   ÚintegerÚintÚfloatingÚfloat)Úobjr;   r£   Ú	new_dtyper*   r¤   s         r/   Úmaybe_prepare_scalar_for_opr²     s�  € ô& ˆCƒy”H×&Ñ&Ñ&ô ˜‹~ÐÜ	ˆc‹”h×'Ñ'Ñ	'ä˜‹~ÐÜ	�CœŸ™Ô	'ô �Œ9Ý8ô ˜3Ÿ9™9Ô%ð —j‘j Ó1‘Ü'¨¯	©	Ô2Ü/°·	±	Ó:�	Ø—j‘j Ó+�Ü—O‘O C¨Ó/ˆEØ ×,Ñ,¨U¸%¿+¹+Ð,ÓFÐFä˜‹~Ðä	�CœŸ™Ô	(Ü�Œ9Ý9ô ˜3Ÿ9™9Ô%ð —j‘jÐ!1Ó2‘Ü'¨¯	©	Ô2Ü/°·	±	Ó:�	Ø—j‘j Ó+�Ü—O‘O C¨Ó/ˆEØ!×-Ñ-¨e¸5¿;¹;Ð-ÓGÐGô
 ˜‹~Ðô 
�CœŸ™Ô	$Ü�3‹xˆä	�CœŸ™Ô	%Ü�S‹zÐà€Jr1   c                óü   — | t         v rt|j                  j                  dk(  rZt        |«      st	        j
                  |«      r9| j                  j                  d«      j                  d«      }t        d|› d�«      ‚yyy)z`
    In contrast to numpy, pandas raises an error for certain operations
    with booleans.
    rs   r‰   rŠ   z
operator 'z!' not implemented for bool dtypesN)
Ú_BOOL_OP_NOT_ALLOWEDr7   ru   r   r
   Úis_boolr{   rž   rŸ   rz   )rB   Úars   r    s       r/   rc   rc   b  su   € ð
 
Ô!Ñ!Ø�7‰7�<‰<˜3Ò¤M°!Ô$4¼¿¹ÀA¼Ø—k‘k×'Ñ'¨Ó,×3Ñ3°CÓ8ˆGÜ%Ø˜W˜IÐ%FÐGóð ð 9GÐð "r1   )rC   ú
np.ndarrayÚreturnr·   )F)r)   r·   r_   rl   )r)   r$   r*   r   )r)   r$   r*   r   r¸   r$   )rC   r·   )r;   r%   )r¶   r·   r¸   ÚNone)MÚ__doc__Ú
__future__r   r¥   Ú	functoolsr   ri   Útypingr   r   Únumpyr5   Úpandas._libsr   r   r	   r
   r   r=   Úpandas._libs.tslibsr   r   r   r   Úpandas.core.dtypes.castr   r   Úpandas.core.dtypes.commonr   r   r   r   r   r   Úpandas.core.dtypes.genericr   r   r   Úpandas.core.dtypes.missingr   r   Úpandas.corer   Úpandas.core.computationr   Úpandas.core.constructionr   r    Úpandas.core.opsr!   Úpandas.core.ops.dispatchr"   Úpandas.core.ops.invalidr#   Úpandas._typingr$   r%   r0   rF   rW   ra   re   rq   r~   r‡   r¡   r²   rœ   Úrtruedivr�   Ú	rfloordivrO   rQ   r›   Úrdivmodr´   rc   © r1   r/   Ú<module>rÐ      s   ðñõ
 #ã Ý Û ÷ó
 ÷õ ÷ó ÷÷÷ ÷ñ ÷
õ
 "Ý /÷õ $Ý >Ý 6á÷ò&òR#ó(5ôp0@óf1óhCóL&#óRBòJ(+óVNðd ×ÑØ×ÑØ×ÑØ×ÑØ‡L�LØ‡N�NØ
Ø×Ñð	Ð ô
r1   