U
    `»{jlI  ã                   @  s,  d Z ddlmZ ddl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 ddlmZ dddddœZG dd„ dƒZdd„ Zdddddœdd„Zdddddœdd„Zddœdd „Zddd!œd"d#„Zd$dœd%d&„Zddd!œd'd(„Z ddd!œd)d*„Z!dS )+zn
Methods that can be shared by many array-like classes or subclasses:
    Series
    Index
    ExtensionArray
é    )ÚannotationsN)ÚAny)Úlib)Ú!maybe_dispatch_ufunc_to_dunder_op)Úfind_stack_level)Ú
ABCNDFrame)Ú	roperator©Úextract_array)Úunpack_zerodim_and_deferÚmaxÚminÚsumÚprod)ÚmaximumÚminimumÚaddÚmultiplyc                   @  sä  e Zd Zdd„ Zedƒdd„ ƒZedƒdd„ ƒZed	ƒd
d„ ƒZedƒdd„ ƒZedƒdd„ ƒZ	edƒdd„ ƒZ
dd„ Zedƒdd„ ƒZedƒdd„ ƒZedƒdd„ ƒZed ƒd!d"„ ƒZed#ƒd$d%„ ƒZed&ƒd'd(„ ƒZd)d*„ Zed+ƒd,d-„ ƒZed.ƒd/d0„ ƒZed1ƒd2d3„ ƒZed4ƒd5d6„ ƒZed7ƒd8d9„ ƒZed:ƒd;d<„ ƒZed=ƒd>d?„ ƒZed@ƒdAdB„ ƒZedCƒdDdE„ ƒZedFƒdGdH„ ƒZedIƒdJdK„ ƒZedLƒdMdN„ ƒZedOƒdPdQ„ ƒZedRƒdSdT„ ƒZ edUƒdVdW„ ƒZ!edXƒdYdZ„ ƒZ"d[S )\ÚOpsMixinc                 C  s   t S ©N©ÚNotImplemented©ÚselfÚotherÚop© r   úT/var/www/html/bwave/python/venv/lib/python3.8/site-packages/pandas/core/arraylike.pyÚ_cmp_method&   s    zOpsMixin._cmp_methodÚ__eq__c                 C  s   |   |tj¡S r   )r   ÚoperatorÚeq©r   r   r   r   r   r   )   s    zOpsMixin.__eq__Ú__ne__c                 C  s   |   |tj¡S r   )r   r    Úner"   r   r   r   r#   -   s    zOpsMixin.__ne__Ú__lt__c                 C  s   |   |tj¡S r   )r   r    Últr"   r   r   r   r%   1   s    zOpsMixin.__lt__Ú__le__c                 C  s   |   |tj¡S r   )r   r    Úler"   r   r   r   r'   5   s    zOpsMixin.__le__Ú__gt__c                 C  s   |   |tj¡S r   )r   r    Úgtr"   r   r   r   r)   9   s    zOpsMixin.__gt__Ú__ge__c                 C  s   |   |tj¡S r   )r   r    Úger"   r   r   r   r+   =   s    zOpsMixin.__ge__c                 C  s   t S r   r   r   r   r   r   Ú_logical_methodD   s    zOpsMixin._logical_methodÚ__and__c                 C  s   |   |tj¡S r   )r-   r    Úand_r"   r   r   r   r.   G   s    zOpsMixin.__and__Ú__rand__c                 C  s   |   |tj¡S r   )r-   r   Zrand_r"   r   r   r   r0   K   s    zOpsMixin.__rand__Ú__or__c                 C  s   |   |tj¡S r   )r-   r    Úor_r"   r   r   r   r1   O   s    zOpsMixin.__or__Ú__ror__c                 C  s   |   |tj¡S r   )r-   r   Zror_r"   r   r   r   r3   S   s    zOpsMixin.__ror__Ú__xor__c                 C  s   |   |tj¡S r   )r-   r    Úxorr"   r   r   r   r4   W   s    zOpsMixin.__xor__Ú__rxor__c                 C  s   |   |tj¡S r   )r-   r   Zrxorr"   r   r   r   r6   [   s    zOpsMixin.__rxor__c                 C  s   t S r   r   r   r   r   r   Ú_arith_methodb   s    zOpsMixin._arith_methodÚ__add__c                 C  s   |   |tj¡S r   )r7   r    r   r"   r   r   r   r8   e   s    zOpsMixin.__add__Ú__radd__c                 C  s   |   |tj¡S r   )r7   r   Zraddr"   r   r   r   r9   i   s    zOpsMixin.__radd__Ú__sub__c                 C  s   |   |tj¡S r   )r7   r    Úsubr"   r   r   r   r:   m   s    zOpsMixin.__sub__Ú__rsub__c                 C  s   |   |tj¡S r   )r7   r   Zrsubr"   r   r   r   r<   q   s    zOpsMixin.__rsub__Ú__mul__c                 C  s   |   |tj¡S r   )r7   r    Úmulr"   r   r   r   r=   u   s    zOpsMixin.__mul__Ú__rmul__c                 C  s   |   |tj¡S r   )r7   r   Zrmulr"   r   r   r   r?   y   s    zOpsMixin.__rmul__Ú__truediv__c                 C  s   |   |tj¡S r   )r7   r    Útruedivr"   r   r   r   r@   }   s    zOpsMixin.__truediv__Ú__rtruediv__c                 C  s   |   |tj¡S r   )r7   r   Zrtruedivr"   r   r   r   rB   �   s    zOpsMixin.__rtruediv__Ú__floordiv__c                 C  s   |   |tj¡S r   )r7   r    Úfloordivr"   r   r   r   rC   …   s    zOpsMixin.__floordiv__Z__rfloordivc                 C  s   |   |tj¡S r   )r7   r   Z	rfloordivr"   r   r   r   Ú__rfloordiv__‰   s    zOpsMixin.__rfloordiv__Ú__mod__c                 C  s   |   |tj¡S r   )r7   r    Úmodr"   r   r   r   rF   �   s    zOpsMixin.__mod__Ú__rmod__c                 C  s   |   |tj¡S r   )r7   r   Zrmodr"   r   r   r   rH   ‘   s    zOpsMixin.__rmod__Ú
__divmod__c                 C  s   |   |t¡S r   )r7   Údivmodr"   r   r   r   rI   •   s    zOpsMixin.__divmod__Ú__rdivmod__c                 C  s   |   |tj¡S r   )r7   r   Zrdivmodr"   r   r   r   rK   ™   s    zOpsMixin.__rdivmod__Ú__pow__c                 C  s   |   |tj¡S r   )r7   r    Úpowr"   r   r   r   rL   �   s    zOpsMixin.__pow__Ú__rpow__c                 C  s   |   |tj¡S r   )r7   r   Zrpowr"   r   r   r   rN   ¡   s    zOpsMixin.__rpow__N)#Ú__name__Ú
__module__Ú__qualname__r   r   r   r#   r%   r'   r)   r+   r-   r.   r0   r1   r3   r4   r6   r7   r8   r9   r:   r<   r=   r?   r@   rB   rC   rE   rF   rH   rI   rK   rL   rN   r   r   r   r   r   "   sv   


























r   c                 C  s2   ddl m} t||ƒr |  |¡S | j |j¡S dS )zU
    Helper to check if a DataFrame is aligned with another DataFrame or Series.
    r   ©Ú	DataFrameN)ÚpandasrS   Ú
isinstanceZ_indexed_sameÚcolumnsÚequalsÚindex)Úframer   rS   r   r   r   Ú_is_alignedª   s    

rZ   znp.ufuncÚstrr   )ÚufuncÚmethodÚinputsÚkwargsc           	        sú   ddl m‰  ddlm‰ t‡fdd„|D ƒƒ}t‡ fdd„|D ƒƒ}|dkrö|dkröt‡ fd	d„|D ƒƒ‰t‡‡fd
d„|D ƒƒ}|rötjdtt	t
 ¡ ƒd� g }|D ]>}|ˆkr¾| |¡ q¦t|ˆƒrÚ| t |¡¡ q¦| |¡ q¦t| |ƒ||ŽS tS )a‚  
    In the future DataFrame, inputs to ufuncs will be aligned before applying
    the ufunc, but for now we ignore the index but raise a warning if behaviour
    would change in the future.
    This helper detects the case where a warning is needed and then fallbacks
    to applying the ufunc on arrays to avoid alignment.

    See https://github.com/pandas-dev/pandas/pull/39239
    r   rR   ©ÚNDFramec                 3  s   | ]}t |ˆ ƒV  qd S r   ©rU   ©Ú.0Úxr`   r   r   Ú	<genexpr>Ä   s     z"_maybe_fallback.<locals>.<genexpr>c                 3  s   | ]}t |ˆ ƒV  qd S r   rb   rc   rR   r   r   rf   Å   s     é   é   c                 3  s   | ]}t |ˆ ƒr|V  qd S r   rb   rc   rR   r   r   rf   Í   s     
 c                 3  s$   | ]}t |ˆ ƒrtˆ|ƒ V  qd S r   )rU   rZ   rc   )ra   Úfirst_framer   r   rf   Ð   s    
 aö  Calling a ufunc on non-aligned DataFrames (or DataFrame/Series combination). Currently, the indices are ignored and the result takes the index/columns of the first DataFrame. In the future , the DataFrames/Series will be aligned before applying the ufunc.
Convert one of the arguments to a NumPy array (eg 'ufunc(df1, np.asarray(df2)') to keep the current behaviour, or align manually (eg 'df1, df2 = df1.align(df2)') before passing to the ufunc to obtain the future behaviour and silence this warning.©Ú
stacklevel)rT   rS   Úpandas.core.genericra   r   ÚnextÚwarningsÚwarnÚFutureWarningr   ÚinspectÚcurrentframeÚappendrU   ÚnpÚasarrayÚgetattrr   )	r\   r]   r^   r_   Zn_alignableZn_framesZnon_alignedÚ
new_inputsre   r   )rS   ra   ri   r   Ú_maybe_fallback·   s0    
ÿ
ö
rx   c                   s6  ddl m‰ ddlm‰  tˆƒ}tf |Ž}tˆˆf|ž|Ž}|tk	rH|S tˆˆˆf|ž|Ž}|tk	rh|S t	j
j|jf}|D ]P}t|dƒo’|jˆjk}	t|dƒo¸t|ƒj|ko¸t|ˆjƒ }
|	sÂ|
rzt  S qztdd„ |D ƒƒ}‡fdd	„t||ƒD ƒ‰tˆƒd
k�rœtt|ƒƒd
k�r$td ˆ¡ƒ‚ˆj}ˆd
d… D ]4}tt||jƒƒD ]\}\}}| |¡||< �qJ�q6ttˆj|ƒƒ‰t‡‡fdd„t||ƒD ƒƒ}nttˆjˆjƒƒ‰ˆjd
k�rðdd	„ |D ƒ}tt|ƒƒd
k�râ|d nd}d|i‰ni ‰‡‡fdd„}‡ ‡‡‡‡‡‡fdd„‰d|k�r@tˆˆˆf|ž|Ž}||ƒS ˆdk�rltˆˆˆf|ž|Ž}|tk	�rl|S ˆjd
k�r¶t|ƒd
k�s’ˆjd
k�r¶tdd„ |D ƒƒ}tˆˆƒ||Ž}ntˆjd
k�rætdd„ |D ƒƒ}tˆˆƒ||Ž}nDˆdk�r|�s|d j }| !tˆˆƒ¡}nt"|d ˆˆf|ž|Ž}||ƒ}|S )z˜
    Compatibility with numpy ufuncs.

    See also
    --------
    numpy.org/doc/stable/reference/arrays.classes.html#numpy.class.__array_ufunc__
    r   r`   )ÚBlockManagerÚ__array_priority__Ú__array_ufunc__c                 s  s   | ]}t |ƒV  qd S r   )Útyperc   r   r   r   rf   "  s     zarray_ufunc.<locals>.<genexpr>c                   s   g | ]\}}t |ˆ ƒr|‘qS r   )Ú
issubclass©rd   re   Útr`   r   r   Ú
<listcomp>#  s     
 zarray_ufunc.<locals>.<listcomp>rh   z;Cannot apply ufunc {} to mixed DataFrame and Series inputs.Nc                 3  s,   | ]$\}}t |ˆ ƒr |jf ˆŽn|V  qd S r   )r}   Zreindexr~   )ra   Úreconstruct_axesr   r   rf   ;  s   ÿc                 S  s    g | ]}t |d ƒrt|d ƒ‘qS )Úname)Úhasattrrv   rc   r   r   r   r€   C  s     
 r‚   c                   s(   ˆj dkr t‡ fdd„| D ƒƒS ˆ | ƒS )Nrh   c                 3  s   | ]}ˆ |ƒV  qd S r   r   rc   )Ú_reconstructr   r   rf   L  s     z3array_ufunc.<locals>.reconstruct.<locals>.<genexpr>)ÚnoutÚtuple)Úresult)r„   r\   r   r   ÚreconstructI  s    
z array_ufunc.<locals>.reconstructc                   s®   t  | ¡r| S | jˆjkrZˆdkrVˆjdkrRd}tj| ˆ¡ttt 	¡ ƒd� | S t
‚| S t| ˆ ƒr|ˆj| fˆddi—Ž} nˆj| fˆˆddi—Ž} tˆƒdkrª|  ˆ¡} | S )NÚouterrg   zãouter method for ufunc {} is not implemented on pandas objects. Returning an ndarray, but in the future this will raise a 'NotImplementedError'. Consider explicitly converting the DataFrame to an array with '.to_numpy()' first.rj   ÚcopyFrh   )r   Z	is_scalarÚndimrn   ro   Úformatrp   r   rq   rr   ÚNotImplementedErrorrU   Z_constructorÚlenZ__finalize__)r‡   Úmsg)ry   Ú	alignabler]   r�   Úreconstruct_kwargsr   r\   r   r   r„   P  s8    

ÿ
ý
ÿ ÿÿ
z!array_ufunc.<locals>._reconstructÚoutÚreducec                 s  s   | ]}t  |¡V  qd S r   ©rt   ru   rc   r   r   r   rf   Ž  s     c                 s  s   | ]}t |d d�V  qdS )T)Zextract_numpyNr	   rc   r   r   r   rf   ”  s     Ú__call__)#rl   ra   Zpandas.core.internalsry   r|   Ú_standardize_out_kwargrx   r   r   rt   Zndarrayr{   rƒ   rz   rU   Z_HANDLED_TYPESr†   ÚziprŽ   Úsetr�   rŒ   ÚaxesÚ	enumerateÚunionÚdictZ_AXIS_ORDERSr‹   Údispatch_ufunc_with_outÚdispatch_reduction_ufuncr…   rv   Z_mgrÚapplyÚdefault_array_ufunc)r   r\   r]   r^   r_   Úclsr‡   Zno_deferÚitemZhigher_priorityZhas_array_ufuncÚtypesr™   ÚobjÚiZax1Zax2Únamesr‚   rˆ   Zmgrr   )	ry   ra   r„   r�   r]   r�   r‘   r   r\   r   Úarray_ufuncõ   sˆ    
þ

þ
ÿý
ÿÿþ

'


&	
r§   rœ   )Úreturnc                  K  s@   d| kr<d| kr<d| kr<|   d¡}|   d¡}||f}|| d< | S )z²
    If kwargs contain "out1" and "out2", replace that with a tuple "out"

    np.divmod, np.modf, np.frexp can have either `out=(out1, out2)` or
    `out1=out1, out2=out2)`
    r’   Úout1Úout2)Úpop)r_   r©   rª   r’   r   r   r   r–   ¨  s    

r–   )r\   r]   c           
      O  s²   |  d¡}|  dd¡}t||ƒ||Ž}|tkr2tS t|tƒr~t|tƒrVt|ƒt|ƒkrZt‚t||ƒD ]\}}	t||	|ƒ qd|S t|tƒr¢t|ƒdkrž|d }nt‚t|||ƒ |S )zz
    If we have an `out` keyword, then call the ufunc without `out` and then
    set the result into the given `out`.
    r’   ÚwhereNrh   r   )	r«   rv   r   rU   r†   rŽ   r�   r—   Ú_assign_where)
r   r\   r]   r^   r_   r’   r¬   r‡   ZarrÚresr   r   r   r�   ·  s"    



r�   ÚNonec                 C  s(   |dkr|| dd…< nt  | ||¡ dS )zV
    Set a ufunc result into 'out', masking with a 'where' argument if necessary.
    N)rt   Zputmask)r’   r‡   r¬   r   r   r   r­   Ú  s    r­   c                   s<   t ‡ fdd„|D ƒƒst‚‡ fdd„|D ƒ}t||ƒ||ŽS )z�
    Fallback to the behavior we would get if we did not define __array_ufunc__.

    Notes
    -----
    We are assuming that `self` is among `inputs`.
    c                 3  s   | ]}|ˆ kV  qd S r   r   rc   ©r   r   r   rf   í  s     z&default_array_ufunc.<locals>.<genexpr>c                   s"   g | ]}|ˆ k	r|nt  |¡‘qS r   r”   rc   r°   r   r   r€   ð  s     z'default_array_ufunc.<locals>.<listcomp>)Úanyr�   rv   )r   r\   r]   r^   r_   rw   r   r°   r   r    å  s    r    c                 O  s’   |dkst ‚t|ƒdks$|d | k	r(tS |jtkr6tS t|j }t| |ƒsNtS | jdkrzt| tƒrjd|d< d|krzd|d< t	| |ƒf ddi|—ŽS )z@
    Dispatch ufunc reductions to self's reduction methods.
    r“   rh   r   FZnumeric_onlyZaxisZskipna)
ÚAssertionErrorrŽ   r   rO   ÚREDUCTION_ALIASESrƒ   r‹   rU   r   rv   )r   r\   r]   r^   r_   Úmethod_namer   r   r   rž   õ  s    




rž   )"Ú__doc__Ú
__future__r   rq   r    Útypingr   rn   Únumpyrt   Zpandas._libsr   Zpandas._libs.ops_dispatchr   Zpandas.util._exceptionsr   Zpandas.core.dtypes.genericr   Zpandas.corer   Zpandas.core.constructionr
   Zpandas.core.ops.commonr   r³   r   rZ   rx   r§   r–   r�   r­   r    rž   r   r   r   r   Ú<module>   s:   ü 	> 4#