1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
U
¬ý°dÄ>ã!@s`UdZddlmZddlZddlmZmZddlZddl    m
Z
ddl m Z m Z mZddlmZddlmZmZdd    lmZmZdd
lmZdd lmZmZdd lmZmZmZm Z m!Z!m"Z"dd l#m$Z$m%Z%ddl&m'Z'm(Z(m)Z)ddl*m+Z+ddl,m-Z-m.Z.m/Z/ddl0m1Z1ddl2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>erXddl?m@Z@mAZAddddddddddddd d!d"d#hZBd$eCd%<d&d'd(d)d*d+hZDd$eCd,<d-d.„ZEd[d0d1d2œd3d4„ZFd5d6„ZGd\d7d8d9œd:d;„ZHd<d=d1d>œd?d@„ZId<d<d<dAœdBdC„ZJd<d0dDdEœdFdG„ZKdHdI„ZLdJdK„ZMdLd;d4d%dMd,dNdOd.dIdKd6dCdPdQdRdSdTdUddVdWd#d!d ddXddd"dYd@dZg!ZNdS)]zD
Arithmetic operations for PandasObjects
 
This is not a public API.
é)Ú annotationsN)Ú TYPE_CHECKINGÚcast)Ú!maybe_dispatch_ufunc_to_dunder_op)ÚAxisÚAxisIntÚLevel)ÚAppender)Ú is_array_likeÚ is_list_like)Ú ABCDataFrameÚ    ABCSeries)Úisna)Ú
algorithmsÚ    roperator)Ú arithmetic_opÚcomp_method_OBJECT_ARRAYÚ comparison_opÚ get_array_opÚ
logical_opÚmaybe_prepare_scalar_for_op)Úget_op_result_nameÚunpack_zerodim_and_defer)Ú_flex_comp_doc_FRAMEÚ_op_descriptionsÚ make_flex_doc)Úinvalid_comparison)Ú
kleene_andÚ    kleene_orÚ
kleene_xor)Úadd_flex_arithmetic_methods) ÚraddÚrand_ÚrdivÚrdivmodÚ    rfloordivÚrmodÚrmulÚror_ÚrpowÚrsubÚrtruedivÚrxor)Ú    DataFrameÚSeriesÚaddÚsubÚmulÚpowÚmodÚfloordivÚtruedivÚdivmodr!r*r'r)r&r%r+r$zset[str]ÚARITHMETIC_BINOPSÚeqÚneÚltÚgtÚleÚgeÚCOMPARISON_BINOPScCs`|dk    rXt|ƒ}t|ƒ}||A}| ¡r<| ¡}||||@<| ¡rX| ¡}||||@<||fS)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.
    N)rÚanyÚcopy)ÚleftÚrightÚ
fill_valueZ    left_maskZ
right_maskÚmask©rEúOd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\pandas/core/ops/__init__.pyÚ
fill_binopps  rGFr.Úbool)rAÚalign_asobjectcCsJt|tƒrB|j |j¡sB|r0| t¡}| t¡}|j|dd\}}||fS)zalign lhs and rhs SeriesF)r@)Ú
isinstancer ÚindexÚequalsZastypeÚobjectÚalign)rArBrIrErErFÚalign_method_SERIESs
 
 
rOcs<ˆj d¡}t|dƒ}t|ƒdddœ‡fdd„ ƒ}||_|S)    NÚ_Úseriesrr©Úaxiscs¬|dk    r| |¡t||ƒ}t|tƒr8|j|ˆ||dSt|tjttfƒrŒt    |ƒt    |ƒkrbt
dƒ‚|  ||j ¡}|j|ˆ||d}||_ |S|dk    rž| |¡}ˆ||ƒSdS)N)ÚlevelrCzLengths must be equal)Ú_get_axis_numberrrJr Z_binopÚnpÚndarrayÚlistÚtupleÚlenÚ
ValueErrorÚ _constructorrKÚnameÚfillna)ÚselfÚotherrTrCrSZres_nameÚresult©ÚoprErFÚ flex_wrapper´s
 
 
 
z(flex_method_SERIES.<locals>.flex_wrapper)NNr)Ú__name__Ústriprr    )rcr]ÚdocrdrErbrFÚflex_method_SERIES°s  
rhz bool | Noner©ÚflexrTcs:‡‡fdd„}t|tjƒr0|jdkr0||ƒ}nþ|jdkrd}t|ddƒtkrTt}|jˆjkrxˆj|ˆjˆj    |d}n˜|jdˆjdkrÀ|jddkrÀt 
|ˆj¡}ˆj|ˆjˆj    |d}nP|jdˆjdkrø|jddkrø||ddd…fƒ}nt d    ˆj›d
|j›ƒ‚n|jdkr~t d |j›ƒ‚nNt |ƒr~t|t tfƒs~td d „|Dƒƒrvt dt|dƒ›dƒ‚||ƒ}|dk    rÈt|tƒrȈ |¡s2|r¾ˆj|d|dd\‰}nt dƒ‚njt|t ƒr2ˆdk    r舠ˆ¡nd‰|sˆjˆ |j¡st dƒ‚ˆj|dˆ|dd\‰}tˆ|ˆƒ}ˆ|fS)a¯
    Convert rhs to meet lhs dims if input is list, tuple or np.ndarray.
 
    Parameters
    ----------
    left : DataFrame
    right : Any
    axis : int, str, or None
    flex : bool or None, default False
        Whether this is a flex op, in which case we reindex.
        None indicates not to check for alignment.
    level : int or level name, default None
 
    Returns
    -------
    left : DataFrame
    right : Any
    cs¸d}d}t|ddƒtkrt}ˆdk    rtˆ ˆ¡dkrttˆjƒt|ƒkr`t|jtˆjƒt|ƒdƒ‚ˆj|ˆj|d}n@tˆjƒt|ƒkr¢t|jtˆjƒt|ƒdƒ‚ˆj|ˆj|d}|S)NzGUnable to coerce to Series, length must be {req_len}: given {given_len}ÚdtyperK)Zreq_lenZ    given_len)rKrk)    ÚgetattrrMZ_get_axis_namerZrKr[ÚformatZ_constructor_slicedÚcolumns)rBÚmsgrk©rSrArErFÚ    to_seriesés ÿÿz%align_method_FRAME.<locals>.to_seriesééNrk©rKrnrkrz-Unable to coerce to DataFrame, shape must be z: given z>Unable to coerce to Series/DataFrame, dimension must be <= 2: css|]}t|ƒVqdS)N)r
)Ú.0ÚelrErErFÚ    <genexpr>-sz%align_method_FRAME.<locals>.<genexpr>zUnable to coerce list of z to Series/DataFrameÚouterF)ÚjoinrTr@zOCan only compare identically-labeled (both index and columns) DataFrame objectszdOperands are not aligned. Do `left, right = left.align(right, axis=1, copy=False)` before operating.)ryrSrTr@)rJrVrWÚndimrlrMÚshaper\rKrnÚ broadcast_tor[r r r r?ÚtypeZ _indexed_samerNrUZaxesrLÚ_maybe_align_series_as_frame)rArBrSrjrTrqrkrErprFÚalign_method_FRAMEÓsz
 
  ÿ"ÿ"ÿ 
ÿÿ ÿ ÿÿ
 rr-Úint)rArSÚreturnc    Csšt|tƒst‚|tjks"|tjkr&dSt|tƒs4dS|dkr–|dkr–|dkr–|j ¡}|j ¡}|     |¡}t
|ƒr–t
|ƒt
|ƒkr’t
|ƒt
|ƒks–dSdS)zU
    Check if this is an operation between DataFrames that will need to reindex.
    FNrrT) rJr ÚAssertionErrorÚoperatorr2rr)rnÚuniqueÚ intersectionrZ)    rArBrcrSrCrTZ left_uniquesZ right_uniquesÚcolsrErErFÚshould_reindex_frame_opQs 
 
 
 
ÿÿr‡)rArBrc Cs²|jj|jdddd\}}}|jdd…|f}|jdd…|f}|||ƒ}|jj|jdddd\}    }
}
|jjr |j |    ¡\} }
t | ¡} |jd|    | gidd}n|j|    dd}|S)    a
    For DataFrame-with-DataFrame operations that require reindexing,
    operate only on shared columns, then reindex.
 
    Parameters
    ----------
    left : DataFrame
    right : DataFrame
    op : binary operator
 
    Returns
    -------
    DataFrame
    ÚinnerNT)ÚhowrTZreturn_indexersrxrr)Z
allow_dupsrR)    rnryZilocZhas_duplicatesZget_indexer_non_uniquerZunique1dZ_reindex_with_indexersZreindex) rArBrcr†ZlcolsZrcolsZnew_leftZ    new_rightraZ join_columnsrPZindexerrErErFÚframe_arith_method_with_reindexps0ÿ 
ÿ 
 
ÿrŠr)ÚframerQrScCsv|j}t|tjƒs,|jdkr(t |¡}n|S|dkrB| dd¡}n | dd¡}t ||j¡}t    |ƒ||j
|j |jdS)zb
    If the Series operand is not EA-dtype, we can broadcast to 2D and operate
    blockwise.
    )zdatetime64[ns]ztimedelta64[ns]réÿÿÿÿrrrt) Z_valuesrJrVrWrkZasarrayZreshaper|r{r}rKrn)r‹rQrSZrvaluesrErErFr~œs 
  ÿr~csFˆj d¡}tˆƒ‰t|dƒ}t|ƒdddœ‡‡fdd„ ƒ}||_|S)    NrPZ    dataframernrrRcsà|dk    r| |¡nd}tt|ƒ}t||ˆ|||ƒr>t||ˆƒSt|tƒr`|dk    r`td|›dƒ‚t||j    ƒ}t
|||d|d\}}t|t ƒrœ|  |ˆ|¡}n:t|tƒr¸|j |ˆ|d}n|dk    rÊ| |¡}|  |ˆ¡}| |¡S)Nrrz fill_value z not supported.TrirR)rUrr€r‡rŠrJr ÚNotImplementedErrorrr{rr Z_combine_frameÚ_dispatch_frame_opr^Ú_construct_result)r_r`rSrTrCÚnew_data©Zna_oprcrErFÚf¼s 
 
 
 
 z"flex_arith_method_FRAME.<locals>.f)rnNN)rerfrrr    ©rcÚop_namergr’rEr‘rFÚflex_arith_method_FRAME¶s 
r•csHˆj d¡}tj|t|dd}t|ƒd    ddœ‡fdd„ ƒ}||_|S)
NrPÚdesc)r”r–rnrrRcsF|dk    r| |¡nd}t|||d|d\}}|j|ˆ|d}| |¡S)NrrTrirR)rUrrŽr)r_r`rSrTrrbrErFr’çsz!flex_comp_method_FRAME.<locals>.f)rnN)rerfrrmrr    r“rErbrFÚflex_comp_method_FRAMEàs 
ÿr—r rrrrrrrrrr"r#r(r,r)F)FN)OÚ__doc__Ú
__future__rrƒÚtypingrrÚnumpyrVZpandas._libs.ops_dispatchrZpandas._typingrrrZpandas.util._decoratorsr    Zpandas.core.dtypes.commonr
r Zpandas.core.dtypes.genericr r Zpandas.core.dtypes.missingrZ pandas.corerrZpandas.core.ops.array_opsrrrrrrZpandas.core.ops.commonrrZpandas.core.ops.docstringsrrrZpandas.core.ops.invalidrZpandas.core.ops.mask_opsrrrZpandas.core.ops.methodsr Zpandas.core.roperatorr!r"r#r$r%r&r'r(r)r*r+r,Zpandasr-r.r7Ú__annotations__r>rGrOrhrr‡rŠr~r•r—Ú__all__rErErErFÚ<module>s¦       8ð -$ÿ~,*ß