zmc
2023-08-08 e792e9a60d958b93aef96050644f369feb25d61b
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
U
¬ý°d¸¼ã@s¶ddlmZddlZddlmZddlmZddlmZddl    Z    ddl
m Z m Z m Z mZmZmZmZmZmZmZmZmZddlZddlmZddlmZdd    lmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%dd
l&m'Z'dd l(m)Z)dd l*m+Z+dd l,m-Z-m.Z.m/Z/m0Z0ddl1m2Z2m3Z3m4Z4ddl5m6Z6ddl7m8Z8ddl9m:m;Z<ddl=m>Z>e r„ddl?m@Z@mAZAmBZBddlCmDZDddlEmFZFddlGmHZHeeIe fZJdTdddddddœdd„ZKGd d!„d!ejLd"ZMGd#d$„d$eMƒZNGd%d„deNƒZOGd&d'„d'eOƒZPGd(d)„d)eOƒZQGd*d+„d+eNƒZRGd,d-„d-eMƒZSGd.d/„d/eMƒZTd0d1d2œd3d4„ZUdd5œd6d7„ZVd8d9d:œd;d<„ZWd=d=d>œd?d@„ZXdAdBdCdDdEdFœdGdH„ZYdIdIdJœdKdL„ZZdMdMdNœdOdP„Z[d8dQd:œdRdS„Z\dS)Ué)Ú annotationsN)Ú defaultdict)Ú nullcontext)Úpartial) Ú TYPE_CHECKINGÚAnyÚCallableÚContextManagerÚ DefaultDictÚDictÚHashableÚIterableÚIteratorÚListÚSequenceÚcast)Úoption_context)Úlib)Ú AggFuncTypeÚAggFuncTypeBaseÚAggFuncTypeDictÚ
AggObjTypeÚAxisÚAxisIntÚNDFrameTÚnpt)ÚSpecificationError)Úcache_readonly)Úis_nested_object)Ú is_dict_likeÚis_extension_array_dtypeÚ is_list_likeÚ is_sequence)Ú ABCDataFrameÚ
ABCNDFrameÚ    ABCSeries)Ú    safe_sort)ÚSelectionMixin)Úensure_wrapped_if_datetimelike)Ú    DataFrameÚIndexÚSeries)ÚGroupBy)Ú    Resampler)Ú
BaseWindowFr)rrÚboolú
str | NoneÚ
FrameApply)ÚobjÚfuncÚaxisÚrawÚ result_typeÚreturncCs8| |¡}|dkrt}n |dkr$t}|||||||dS)z=construct and return a row or column based frame apply objectré©r5r6ÚargsÚkwargs)Ú_get_axis_numberÚ FrameRowApplyÚFrameColumnApply)r2r3r4r5r6r:r;Úklass©r@úHd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\pandas/core/apply.pyÚ frame_applyIs
 
úrBc@sÊeZdZUded<dddddœdd    „Zejd
d œd d „ƒZdd œdd„Zd
d œdd„Z    dd„Z
d
d œdd„Z d
d œdd„Z d
d œdd„Z d
d œdd„Zd
d œdd„Zdd
d d d!œd"d#„Zdd$œd%d&„Zd'S)(ÚApplyrr4rr/r0ÚNone)r2r5r6r7cs|||_||_ˆpd|_ˆpi|_|dkr0tdƒ‚||_ˆs>ˆrhtˆtjt    fƒsht
ˆƒsh‡‡‡fdd„}nˆ}ˆ|_ ||_ dS)Nr@)NÚreduceÚ    broadcastÚexpandzUinvalid value for result_type, must be one of {None, 'reduce', 'broadcast', 'expand'}csˆ|fˆžˆŽS©Nr@)Úx©r:r3r;r@rAÚf„szApply.__init__.<locals>.f) r2r5r:r;Ú
ValueErrorr6Ú
isinstanceÚnpÚufuncÚstrr!Úorig_frK)Úselfr2r3r5r6r:r;rKr@rJrAÚ__init__gs*    
 
ÿÿÿþýzApply.__init__úDataFrame | Series©r7cCsdSrHr@©rRr@r@rAÚapplysz Apply.applyzDataFrame | Series | NonecCsx|j}|j}|j}|j}t|tƒr*| ¡St|ƒr:| ¡St    |ƒrJ| 
¡St |ƒrtt   |¡}|rt|st|stt||ƒƒSdS)z»
        Provide an implementation for the aggregators.
 
        Returns
        -------
        Result of aggregation, or None if agg cannot be performed by
        this method.
        N)r2rKr:r;rMrPÚ    apply_strrÚ agg_dict_liker!Ú agg_list_likeÚcallableÚcomÚget_cython_funcÚgetattr©rRr2Úargr:r;rKr@r@rAÚagg‘s    
 
  z    Apply.aggc
sf|j}|j‰|j}|j}|j}|jdk}| |¡dkrV|r>t‚|jj    ˆdf|ž|ŽjSt
ˆƒršt ˆƒsšt t tˆƒ‰|rˆdd„ˆDƒ‰n‡fdd„|Dƒ‰t ˆƒr¶t tˆƒ‰| ˆ¡St tˆƒ‰z| ˆ¡}WnBtk
rä‚Yn.tk
r}ztdƒ|‚W5d}~XYnXt|ttfƒr:|jr:|js:tdƒ‚t|ttfƒrZ|j |j¡sbtdƒ‚|S)    aI
        Transform a DataFrame or Series.
 
        Returns
        -------
        DataFrame or Series
            Result of applying ``func`` along the given axis of the
            Series or DataFrame.
 
        Raises
        ------
        ValueError
            If the transform function fails or does not transform.
        r8rcSsi|]}t |¡p||“qSr@©r\Úget_callable_name©Ú.0Úvr@r@rAÚ
<dictcomp>Ïs z#Apply.transform.<locals>.<dictcomp>csi|]
}|ˆ“qSr@r@)reÚcol©r3r@rArgÑszTransform function failedNzFunction did not transform)r2rQr4r:r;Úndimr<ÚAssertionErrorÚTÚ    transformr!rrrrrÚtransform_dict_likeÚtransform_str_or_callableÚ    TypeErrorÚ    ExceptionrLrMr%r#ÚemptyÚindexÚequals)rRr2r4r:r;Z    is_seriesÚresultÚerrr@rirArm°sH
 
 
 
 ÿþýÿzApply.transformc
Cs–ddlm}|j}|j}|j}t|tƒs,t‚t|ƒdkr@t    dƒ‚| 
d||¡}i}|  ¡D].\}}|j |dd}    |    j |df|ž|Ž||<qZ||ddS)zC
        Compute transform in the case of a dict-like func
        r©Úconcatz$No transform functions were providedrmr8©rj©r4)Úpandas.core.reshape.concatrxr2r:r;rMr$rkÚlenrLÚnormalize_dictlike_argÚitemsÚ_gotitemrm)
rRr3rxr2r:r;ÚresultsÚnameÚhowÚcolgr@r@rArnós  zApply.transform_dict_likecCs”|j}|j}|j}t|tƒr0|j||f|ž|ŽS|sR|sRt |¡}|rRt||ƒƒSz|j    |fd|i|—ŽWSt
k
rŽ||f|ž|ŽYSXdS)zL
        Compute transform in the case of a string or callable func
        r:N) r2r:r;rMrPÚ_try_aggregate_string_functionr\r]r^rWrq)rRr3r2r:r;rKr@r@rAro s
 
 zApply.transform_str_or_callablec
CsPddlm}m}ddlm}|j}ttt|j    ƒ}t
|ddƒdkrJt dƒ‚t |t ƒsZ|}n|jjdkrn|j}n|j}g}g}t |||fƒ}    |    ržt |dd¡}
ntƒ}
|
,|jdkr:|D]z} |j|jd|d    } t | ttfƒrü| j| |jf|jž|jŽ} n| j| f|jž|jŽ} | | ¡t | ¡p*| }| |¡q¼n˜g}t|ƒD]~\}}|j|d|jd
d
…|fd    } t | ttfƒr˜| j||jf|jž|jŽ} n| j|f|jž|jŽ} | | ¡| |¡qF|j  !|¡}W5QRXz|||dd d WSt"k
rJ}z<dd l#m$}||||jd}t%|ƒr2t&dƒ|‚|WY¢Sd
}~XYnXd
S)zŠ
        Compute aggregation in the case of a list-like argument.
 
        Returns
        -------
        Result of aggregation.
        r©ÚDataFrameGroupByÚ SeriesGroupByrwr4r8ú"axis other than 0 is not supportedÚas_indexT)rjZsubsetNF)Úkeysr4Úsort©r+)rsrz3cannot combine transform and aggregation operations)'Úpandas.core.groupby.genericr†r‡r{rxr2rrrrKr^ÚNotImplementedErrorrMr'Ú _selected_objrjZ_obj_with_exclusionsr\Ú temp_setattrrrrr%r#Ú    aggregater4r:r;ÚappendrcÚ    enumerateZilocÚcolumnsZtakerpÚpandasr+rrL)rRr†r‡rxr2r`Ú selected_objr€rŠÚ
is_groupbyÚcontext_managerÚarƒZnew_resrÚindicesrsrhrvr+rur@r@rArZ!s| 
  ÿÿÿ
ÿÿÿ
 
ÿþzApply.agg_list_likec    sôddlm}ddlm}m}ddlm}|j‰tt    |j
ƒ}t ˆddƒdkrRt dƒ‚t ˆtƒsfˆ}d}n ˆj}ˆj}| d    ||¡}t ˆ||fƒ}|r¢t ˆd
d ¡}    ntƒ}    |    L|jdkrވj|dd ‰‡fd d„| ¡Dƒ‰n‡fdd„| ¡Dƒ‰W5QRXt| ¡ƒ}
dd„ˆ ¡Dƒ} t| ƒr¢‡fdd„|
Dƒ} | gkrF| n|
} |jdkrp|| ƒ} |  |jj¡| } t ˆtƒr€dnd}|‡fdd„| Dƒ|| d}nNt | ƒr¶t!dƒ‚n:ddlm"}ˆjdkràtdˆƒ‰ˆj#}nd}|ˆ|d}|S)zŠ
        Compute aggregation in the case of a dict-like argument.
 
        Returns
        -------
        Result of aggregation.
        r©r*r…rwr4r8rˆNrar‰Trycsi|]\}}|ˆ |¡“qSr@)ra©reÚkeyr‚)rƒr@rArg¡sz'Apply.agg_dict_like.<locals>.<dictcomp>cs&i|]\}}|ˆj|dd |¡“qS)r8ry)rrarœ)r2r@rArg¤scSsg|]}t|tƒ‘qSr@)rMr$)reÚrr@r@rAÚ
<listcomp>¬sz'Apply.agg_dict_like.<locals>.<listcomp>csg|]}ˆ|js|‘qSr@)rr©reÚk©r€r@rArŸ±s
écsi|]}|ˆ|“qSr@r@r r¢r@rArg¼s)r4rŠzLcannot perform both aggregation and transformation operations simultaneouslyrŒr+)r)$r•r*rr†r‡r{rxr2rrrKr^rŽrMr'rZ
_selectionr}r\rrrjrr~ÚlistrŠÚvaluesÚallZ
_set_namesr”Únamesr%ÚanyrLr+r)rRr*r†r‡rxr`r–Z    selectionr—r˜rŠZ
is_ndframeZ keys_to_useZktur4rur+rr@)rƒr2r€rArYvsd   
 
 
ÿ 
 ý
ÿ  
 zApply.agg_dict_likecCs’tt|jƒ}|j}t||dƒ}t|ƒrzt |¡}|j|j    ˜}|j
dkrfd|ksV|dkrft d|›dƒ‚d|krz|j
|j d<|j ||f|jž|j ŽS)zy
        Compute apply in case of a string.
 
        Returns
        -------
        result: Series or DataFrame
        Nrr4)ZcorrwithZskewz
Operation z does not support axis=1)rrPrKr2r^r[ÚinspectÚgetfullargspecr:Ú
kwonlyargsr4rLr;r„)rRrKr2r3ÚsigÚ    arg_namesr@r@rArXÖs      
 
ÿÿ zApply.apply_strcCs|jj|j|jf|jž|jŽS)zÜ
        Compute apply in case of a list-like or dict-like.
 
        Returns
        -------
        result: Series, DataFrame, or None
            Result when self.f is a list-like or dict-like, None otherwise.
        )r2r‘rKr4r:r;rVr@r@rAÚapply_multipleòs    zApply.apply_multiplerPr)r‚r2r3r7c    sþ|dks t‚|dkr4t|tƒr4tdd„| ¡DƒƒsJtdd„| ¡DƒƒrRtdƒ‚|jdkržt| ¡ƒt|j    ƒ}t
|ƒdkržt t t |ƒƒƒ}t d    |›d
ƒ‚t ttf‰t‡fd d„| ¡Dƒƒrúi}| ¡D]&\}}t|ˆƒsì|g||<qÎ|||<qÎ|}|S) a
        Handler for dict-like argument.
 
        Ensures that necessary columns exist if obj is a DataFrame, and
        that a nested renamer is not passed. Also normalizes to all lists
        when values consists of a mix of list and non-lists.
        )rWrarmracss|]\}}t|ƒVqdSrH)r!©reÚ_rfr@r@rAÚ    <genexpr> sz/Apply.normalize_dictlike_arg.<locals>.<genexpr>css|]\}}t|ƒVqdSrH)rr¯r@r@rAr±sznested renamer is not supportedr8rz
Column(s) z  do not existc3s|]\}}t|ˆƒVqdSrH)rM)rer°rI©Zaggregator_typesr@rAr±s)rkrMr%r¨r~rrjÚsetrŠr”r|r¤r&ÚKeyErrorÚtupleÚdict)    rRr‚r2r3ÚcolsZ cols_sortedÚnew_funcr¡rfr@r²rAr}ýs0
ÿþýü
 
 
 
zApply.normalize_dictlike_arg)r`cOs°t|tƒst‚t||dƒ}|dk    rbt|ƒr4|||ŽSt|ƒdksDt‚tdd„|Dƒƒdks^t‚|Stt|dƒ}|dk    rt|dƒr||f|ž|ŽStd|›dt    |ƒj
›dƒ‚dS)    z´
        if arg is a string, then try to operate on it:
        - try to find a function (or attribute) on ourselves
        - try to find a numpy function
        - raise
        NrcSsg|]}|dkr|‘qS)rzr@)reÚkwargr@r@rArŸ:sz8Apply._try_aggregate_string_function.<locals>.<listcomp>Z    __array__ú'z' is not a valid function for 'z' object) rMrPrkr^r[r|rNÚhasattrÚAttributeErrorÚtypeÚ__name__r_r@r@rAr„)s 
 ÿz$Apply._try_aggregate_string_functionN)r¾Ú
__module__Ú __qualname__Ú__annotations__rSÚabcÚabstractmethodrWrarmrnrorZrYrXr®r}r„r@r@r@rArCds
&CU` ,rC)Ú    metaclassc@s>eZdZUdZded<eddœdd„ƒZeddœdd    „ƒZd
S) Ú NDFrameApplyzg
    Methods shared by FrameApply and SeriesApply but
    not GroupByApply or ResamplerWindowApply
    rTr2r*rUcCs|jjSrH)r2rsrVr@r@rArsOszNDFrameApply.indexcCs|j |j¡SrH)r2Z _get_agg_axisr4rVr@r@rAÚagg_axisSszNDFrameApply.agg_axisN)r¾r¿rÀÚ__doc__rÁÚpropertyrsrÆr@r@r@rArÅGs
rÅcs0eZdZUded<eejddœdd„ƒƒZeejddœdd„ƒƒZeejd    dœd
d „ƒƒZ    ejd dd dœdd„ƒZ
eddœdd„ƒZ eddœdd„ƒZ e dd„ƒZe ddœdd„ƒZd dœdd„Z‡fdd„Zdd„Zd d!„Zddd"œd#d$„Zd%d&„Zd'dœd(d)„Zd dd dœd*d+„Zd dœ‡fd,d-„ Z‡ZS).r1r)r2r*rUcCsdSrHr@rVr@r@rAÚ result_index^szFrameApply.result_indexcCsdSrHr@rVr@r@rAÚresult_columnscszFrameApply.result_columnszIterator[Series]cCsdSrHr@rVr@r@rAÚseries_generatorhszFrameApply.series_generatorÚResTyperT©r€Ú    res_indexr7cCsdSrHr@©rRr€rÎr@r@rAÚwrap_results_for_axismsz FrameApply.wrap_results_for_axiscCs|jSrH)rÊrVr@r@rAÚ res_columnsuszFrameApply.res_columnscCs|jjSrH)r2r”rVr@r@rAr”yszFrameApply.columnscCs|jjSrH)r2r¥rVr@r@rAr¥}szFrameApply.valuesr+cCs|jjSrH)r2ÚdtypesrVr@r@rArҁszFrameApply.dtypesc    CsÒt|jƒr| ¡St|jƒdkr6t|jƒdkr6| ¡St|jtƒrJ|     ¡St|jt
j ƒr’t
j dd|j jjd|jd}W5QRX|j j|dS|jdkr¨| |j ¡St|j jƒs¼| ¡S|jrÊ| ¡S| ¡S)zcompute the resultsrÚignore©r¦rWri©ÚdatarF)r!rKr®r|r”rsÚapply_empty_resultrMrPrXrNrOÚerrstater2Ú_mgrrWÚ _constructorr6Úapply_broadcastr¦Úshaper5Ú    apply_rawÚapply_standard)rRr€r@r@rArW…s"
 
  zFrameApply.applycs”|j}|j}|jdkr|jn|jj|_d|_d}ztƒ ¡}W5||_||_X|dkrh|dk    rd|jn|}|dkr|jj|j|fd|ji|j—Ž}|S)Nrr8r:)    r2r4rlÚsuperrarWrQr:r;)rRr2r4ru©Ú    __class__r@rAra¨s zFrameApply.aggcCsât|jƒst‚|jdkr"|j ¡S|jdk}ddlm}|s˜z:|jdkr^| |gt    j
d¡}n| ||j t    j
d¡}Wnt k
rŠYnXt ||ƒ }|rÔt|jƒr¼| |gt    j
d¡}nt    j}|jj||jdS|j ¡SdS)    zµ
        we have an empty result; at least 1 axis is 0
 
        we will try to apply the function to an empty
        series in order to see if this is a reduction function
        )rENrErrŒ©Údtype)rsrã©rsN)r[rKrkr6r2Úcopyr•r+r4rNÚfloat64r”rqrMr|rÆÚnanÚ_constructor_sliced)rRZ should_reducer+ržr@r@rAr׿s&
 
 
 
 
zFrameApply.apply_empty_resultcCsVdd„}t ||jƒ|j|j¡}|jdkr@|jj||j|j    dS|jj
||j dSdS)z$apply to the values as a numpy arraycs‡fdd„}|S)z
            Wrap user supplied function to work around numpy issue.
 
            see https://github.com/numpy/numpy/issues/8352
            cs&ˆ||Ž}t|tƒr"tj|td}|S)Nrâ)rMrPrNÚarrayÚobject)r:r;rurir@rAÚwrapperñs
 
z<FrameApply.apply_raw.<locals>.wrap_function.<locals>.wrapperr@)r3rër@rirAÚ wrap_functionês z+FrameApply.apply_raw.<locals>.wrap_functionr£©rsr”räN) rNZapply_along_axisrKr4r¥rjr2rÚrsr”rèrÆ)rRrìrur@r@rArÝçs
 
zFrameApply.apply_raw©Útargetr7c    Cs¨t|jƒst‚t |j¡}|jd}t|jƒD]^\}}| ||¡}t     |¡j
}|dkr`t dƒ‚|dkr||t |ƒkr|t dƒ‚||dd…|f<q.|j j||j|jd}|S)Nrr8ztoo many dims to broadcastzcannot broadcast resultrí)r[rKrkrNZ
empty_liker¥rÜr“r”ZasarrayrjrLr|r2rÚrs)    rRrïZ result_valuesZresult_compareÚirhÚresZaresrur@r@rArÛs$ 
  ÿzFrameApply.apply_broadcastcCs| ¡\}}| ||¡SrH)Úapply_series_generatorÚ wrap_resultsrÏr@r@rArÞs zFrameApply.apply_standardztuple[ResType, Index]c    Cs~t|jƒst‚|j}|j}i}tddƒHt|ƒD]8\}}| |¡||<t||tƒr2||j    dd||<q2W5QRX||fS)Nzmode.chained_assignmentF)Údeep)
r[rKrkrËrÉrr“rMr%rå)rRZ
series_genrÎr€rðrfr@r@rArò#s  z!FrameApply.apply_series_generatorcCsvddlm}t|ƒdkr8d|kr8t|dƒr8| ||¡S|jj}t|ƒdkrd||krd||tjd}n||ƒ}||_    |S)NrrŒrâ)
r•r+r|r"rÐr2rèrNrærs)rRr€rÎr+Zconstructor_slicedrur@r@rAró6s   zFrameApply.wrap_resultscs6|jdkr,|j}|j|j}|j||jdStƒ ¡S)NÚsizerä)rKr2rÜr4rèrÆrßrX)rRr2Úvalueràr@rArXKs
 
 zFrameApply.apply_str)r¾r¿rÀrÁrÈrÂrÃrÉrÊrËrÐrÑr”rr¥rÒrWrar×rÝrÛrÞròrórXÚ __classcell__r@r@ràrAr1Xs:
 
# (c@s\eZdZUdZded<edd„ƒZeddœdd    „ƒZeddœd
d „ƒZd dd dœdd„Z    dS)r=rrr4cs‡fdd„ttˆjƒƒDƒS)Nc3s|]}ˆjj|ddVqdS)r8rzN)r2Ú_ixs)rerðrVr@rAr±[sz1FrameRowApply.series_generator.<locals>.<genexpr>)Úranger|r”rVr@rVrArËYszFrameRowApply.series_generatorr*rUcCs|jSrH©r”rVr@r@rArÉ]szFrameRowApply.result_indexcCs|jSrHrärVr@r@rArÊaszFrameRowApply.result_columnsrÌrTrÍc
Csþ|jdkr |j |¡}||_|S|jdkrVtdd„| ¡DƒƒrV|j |¡}||_|Sz|jj|d}WnNtk
r¶}z0dt|ƒkr¤|j |¡}||_|WY¢S‚W5d}~XYnXt    |dt
ƒsât |jƒt |j ƒkrâ|j |_t |j ƒt |ƒkrú||_ |S)zreturn the results for the rowsrENcss|]}t|tƒVqdSrH)rMr¶)rerIr@r@rAr±psz6FrameRowApply.wrap_results_for_axis.<locals>.<genexpr>rÕz%All arrays must be of the same lengthr)r6r2rèrsr¦r¥rÚrLrPrMr%r|rÑr”)rRr€rÎrñrurvr@r@rArÐes0
 ÿ    z#FrameRowApply.wrap_results_for_axisN)
r¾r¿rÀr4rÁrÈrËrÉrÊrÐr@r@r@rAr=Vs
 
r=cs†eZdZUdZded<dddœ‡fdd„ Zedd    „ƒZed
d œd d „ƒZed
d œdd„ƒZ    dd
ddœdd„Z
dd
ddœdd„Z ‡Z S)r>r8rr4r)rîcstƒ |j¡}|jSrH)rßrÛrl)rRrïruràr@rArےsz FrameColumnApply.apply_broadcastccs¦|j}t|ƒ}t|ƒdkst‚|jjddd}|j}t|jƒrh|j}t    t|ƒƒD]}|j|ddVqPn:t
||j ƒD],\}}||_|  |¡t  |d|¡|VqtdS)NrrzÚ_name)r¥r(r|rkr2rørÙr rãrùÚziprsZ
set_valuesrêÚ __setattr__)rRr¥ZserZmgrr2rðZarrrr@r@rAr˖s
 
z!FrameColumnApply.series_generatorr*rUcCs|jSrHrärVr@r@rArɰszFrameColumnApply.result_indexcCs|jSrHrúrVr@r@rArÊ´szFrameColumnApply.result_columnsrÌrTrÍcCsJ|jdkr| ||¡}n.t|dtƒs:|j |¡}||_n | ||¡}|S)z"return the results for the columnsrGr)r6Úinfer_to_same_shaperMr%r2rèrs©rRr€rÎrur@r@rArиs
  z&FrameColumnApply.wrap_results_for_axiscCs*|jj|d}|j}||_|jdd}|S)z7infer the results to the same shape as the input objectrÕF©rå)r2rÚrlrsZ infer_objectsrÿr@r@rArþÍs
 z$FrameColumnApply.infer_to_same_shape) r¾r¿rÀr4rÁrÛrÈrËrÉrÊrÐrþr÷r@r@ràrAr>s
 
r>csteZdZUded<dZded<ddddd    œ‡fd
d „ Zd d œdd„Z‡fdd„Zdd œdd„Zd d œdd„Z    ‡Z
S)Ú SeriesApplyr+r2rrr4rr/rD)r2r3Ú convert_dtyper7cs"||_tƒj||dd||ddS©NFr9)rrßrS)rRr2r3rr:r;ràr@rArSßsúzSeriesApply.__init__rTrUcCsH|j}t|ƒdkr| ¡St|jƒr,| ¡St|jtƒr@| ¡S|     ¡S)Nr)
r2r|r×r!rKr®rMrPrXrÞ©rRr2r@r@rArWòs 
 zSeriesApply.applyc
sptƒ ¡}|dkrl|j}|j}t|ƒs*t‚| dd¡z|j |¡}Wn$t    t
t fk
rj||jƒ}YnX|S)NZ_level) rßrarKr;r[rkÚpopr2rWrLr¼rp)rRrurKr;ràr@rAras
 
zSeriesApply.aggcCs"|j}|j|j|jdj|ddS)N)rãrsrW©Úmethod)r2rÚrãrsÚ __finalize__rr@r@rAr×s
ÿzSeriesApply.apply_empty_resultc
CsÔtt|jƒ}|j}tjddht|tjƒr@||ƒW5QR£St|j    ƒrdt
|j dƒrd|j   |¡}n|  t¡j }tj|||jd}W5QRXt|ƒr¶t|dtƒr¶|jt|ƒ|jdS|j||jdj|ddSdS)    NrÓrÔÚmap)ÚconvertrrärWr)rrrKr2rNrØrMrOr rãr»Z_valuesr    ZastyperêrZ    map_inferrr|r%Z_constructor_expanddimr¤rsrÚr)rRrKr2Zmappedr¥r@r@rArÞ%s&   ýÿzSeriesApply.apply_standard) r¾r¿rÀrÁr4rSrWrar×rÞr÷r@r@ràrArÛs
  rcs6eZdZddddœ‡fdd„ Zdd„Zd    d
„Z‡ZS) Ú GroupByApplyzGroupBy[NDFrameT]rrD©r2r3r7cs:| ¡}|j | dd¡¡|_tƒj||dd||ddS)Nr4rFr9)rår2r<Úgetr4rßrS©rRr2r3r:r;ràr@rArSEsúzGroupByApply.__init__cCst‚dSrH©rŽrVr@r@rArWWszGroupByApply.applycCst‚dSrHrrVr@r@rArmZszGroupByApply.transform)r¾r¿rÀrSrWrmr÷r@r@ràrAr Dsr csLeZdZUdZded<ded<ddddœ‡fd    d
„ Zd d „Zd d„Z‡ZS)ÚResamplerWindowApplyrrr4zResampler | BaseWindowr2rrDr cstƒj||dd||ddSr)rßrSrràr@rArSbsúzResamplerWindowApply.__init__cCst‚dSrHrrVr@r@rArWrszResamplerWindowApply.applycCst‚dSrHrrVr@r@rArmuszResamplerWindowApply.transform)    r¾r¿rÀr4rÁrSrWrmr÷r@r@ràrAr^s
 
 rzAggFuncType | NonezNtuple[bool, AggFuncType | None, list[str] | None, npt.NDArray[np.intp] | None])r3r7cKsr|dkotf|Ž}d}d}|sTt|tƒrDt|ƒtt|ƒƒkrDtdƒ‚|dkrTtdƒ‚|rft|ƒ\}}}||||fS)aÅ
    This is the internal function to reconstruct func given if there is relabeling
    or not and also normalize the keyword to get new order of columns.
 
    If named aggregation is applied, `func` will be None, and kwargs contains the
    column and aggregation function information to be parsed;
    If named aggregation is not applied, `func` is either string (e.g. 'min') or
    Callable, or list of them (e.g. ['min', np.max]), or the dictionary of column name
    and str/Callable/list of them (e.g. {'A': 'min'}, or {'A': [np.min, lambda x: x]})
 
    If relabeling is True, will return relabeling, reconstructed func, column
    names, and the reconstructed order of columns.
    If relabeling is False, the columns and order will be None.
 
    Parameters
    ----------
    func: agg function (e.g. 'min' or Callable) or list of agg functions
        (e.g. ['min', np.max]) or dictionary (e.g. {'A': ['min', np.max]}).
    **kwargs: dict, kwargs used in is_multi_agg_with_relabel and
        normalize_keyword_aggregation function for relabelling
 
    Returns
    -------
    relabelling: bool, if there is relabelling or not
    func: normalized and mangled func
    columns: list of column names
    order: array of columns indices
 
    Examples
    --------
    >>> reconstruct_func(None, **{"foo": ("col", "min")})
    (True, defaultdict(<class 'list'>, {'col': ['min']}), ('foo',), array([0]))
 
    >>> reconstruct_func("min")
    (False, 'min', None, None)
    NzFFunction names must be unique if there is no new column names assignedz4Must provide 'func' or tuples of '(column, aggfunc).)Úis_multi_agg_with_relabelrMr¤r|r³rrpÚnormalize_keyword_aggregation)r3r;Z
relabelingr”Úorderr@r@rAÚreconstruct_funcys'ÿrrUcKs"tdd„| ¡Dƒƒo t|ƒdkS)ax
    Check whether kwargs passed to .agg look like multi-agg with relabeling.
 
    Parameters
    ----------
    **kwargs : dict
 
    Returns
    -------
    bool
 
    Examples
    --------
    >>> is_multi_agg_with_relabel(a="max")
    False
    >>> is_multi_agg_with_relabel(a_max=("a", "max"), a_min=("a", "min"))
    True
    >>> is_multi_agg_with_relabel()
    False
    css$|]}t|tƒot|ƒdkVqdS)r£N)rMrµr|rdr@r@rAr±Ësz,is_multi_agg_with_relabel.<locals>.<genexpr>r)r¦r¥r|)r;r@r@rAr¶s
ÿrr¶z,tuple[dict, list[str], npt.NDArray[np.intp]])r;r7c Csšddlm}ttƒ}g}tt| ¡Žƒ\}}|D].\}}|| |¡| |t |¡pX|f¡q0t    |ƒ}dd„| ¡Dƒ}    t    |    ƒ}
||
ƒ 
|¡} ||| fS)aL
    Normalize user-provided "named aggregation" kwargs.
    Transforms from the new ``Mapping[str, NamedAgg]`` style kwargs
    to the old Dict[str, List[scalar]]].
 
    Parameters
    ----------
    kwargs : dict
 
    Returns
    -------
    aggspec : dict
        The transformed kwargs.
    columns : List[str]
        The user-provided keys.
    col_idx_order : List[int]
        List of columns indices.
 
    Examples
    --------
    >>> normalize_keyword_aggregation({"output": ("input", "sum")})
    (defaultdict(<class 'list'>, {'input': ['sum']}), ('output',), array([0]))
    rr›cSs,g|]$\}}|D]}|t |¡p"|f‘qqSr@rb)reÚcolumnÚaggfuncsÚaggfuncr@r@rArŸÿsþz1normalize_keyword_aggregation.<locals>.<listcomp>) Úpandas.core.indexes.baser*rr¤rür~r’r\rcÚ_make_unique_kwarg_listÚ get_indexer) r;r*Zaggspecrr”ÚpairsrrZuniquified_orderZ aggspec_orderZuniquified_aggspecÚ col_idx_orderr@r@rArÐs  þrzSequence[tuple[Any, Any]])Úseqr7cs‡fdd„tˆƒDƒS)a
    Uniquify aggfunc name of the pairs in the order list
 
    Examples:
    --------
    >>> kwarg_list = [('a', '<lambda>'), ('a', '<lambda>'), ('b', '<lambda>')]
    >>> _make_unique_kwarg_list(kwarg_list)
    [('a', '<lambda>_0'), ('a', '<lambda>_1'), ('b', '<lambda>')]
    csJg|]B\}}ˆ |¡dkrB|d|d›dˆd|… |¡›fn|‘qS)r8rr°N)Úcount)rerðÚpair©rr@rArŸsÿz+_make_unique_kwarg_list.<locals>.<listcomp>)r“r r@r rAr s
þrrTzdict[str, list[Callable | str]]zIterable[Hashable]z Iterable[int]zdict[Hashable, Series])rur3r”rr7c CsÎddlm}dd„tt||ƒdd„dDƒ}i}d}t|tƒ oLt|jƒdk}| ¡D]r\}    }
||         ¡} |r”d    d„|
Dƒ}
|| j
ƒ  |
¡} | | } |||t|
ƒ…| _
| j |d
d ||    <|t|
ƒ}qV|S) a¥
    Internal function to reorder result if relabelling is True for
    dataframe.agg, and return the reordered result in dict.
 
    Parameters:
    ----------
    result: Result from aggregation
    func: Dict of (column name, funcs)
    columns: New columns name for relabelling
    order: New order for relabelling
 
    Examples:
    ---------
    >>> result = DataFrame({"A": [np.nan, 2, np.nan],
    ...       "C": [6, np.nan, np.nan], "B": [np.nan, 4, 2.5]})  # doctest: +SKIP
    >>> funcs = {"A": ["max"], "C": ["max"], "B": ["mean", "min"]}
    >>> columns = ("foo", "aab", "bar", "dat")
    >>> order = [0, 1, 2, 3]
    >>> _relabel_result(result, func, columns, order)  # doctest: +SKIP
    dict(A=Series([2.0, NaN, NaN, NaN], index=["foo", "aab", "bar", "dat"]),
         C=Series([NaN, 6.0, NaN, NaN], index=["foo", "aab", "bar", "dat"]),
         B=Series([NaN, NaN, 2.5, 4.0], index=["foo", "aab", "bar", "dat"]))
    rr›cSsg|] }|d‘qS)rr@)rerr@r@rArŸ<sz"relabel_result.<locals>.<listcomp>cSs|dS)Nr8r@)Útr@r@rAÚ<lambda>=óz relabel_result.<locals>.<lambda>)rr8cSs$g|]}t|tƒst |¡n|‘qSr@)rMrPr\rc)rerKr@r@rArŸ[sFr) rr*ÚsortedrürMr%r|r”r~ZdropnarsrZreindex) rur3r”rr*Zreordered_indexesZreordered_result_in_dictÚidxZ reorder_maskrhZfunÚsrr@r@rAÚrelabel_results& ÿ ÿr'z Sequence[Any])rr7cCs\t|ƒdkr|Sd}g}|D]:}t |¡dkrLt|ƒ}d|›d|_|d7}| |¡q|S)aJ
    Possibly mangle a list of aggfuncs.
 
    Parameters
    ----------
    aggfuncs : Sequence
 
    Returns
    -------
    mangled: list-like
        A new AggSpec sequence, where lambdas have been converted
        to have unique names.
 
    Notes
    -----
    If just one aggfunc is passed, the name will not be mangled.
    r8rz<lambda>z<lambda_ú>)r|r\rcrr¾r’)rrðÚmangled_aggfuncsrr@r@rAÚ_managle_lambda_listps  r*r)Úagg_specr7cCslt|ƒ}|st|ƒs|St|ƒƒ}|r`| ¡D].\}}t|ƒrPt|ƒsPt|ƒ}n|}|||<q.nt|ƒ}|S)aZ
    Make new lambdas with unique names.
 
    Parameters
    ----------
    agg_spec : Any
        An argument to GroupBy.agg.
        Non-dict-like `agg_spec` are pass through as is.
        For dict-like `agg_spec` a new spec is returned
        with name-mangled lambdas.
 
    Returns
    -------
    mangled : Any
        Same type as the input.
 
    Examples
    --------
    >>> maybe_mangle_lambdas('sum')
    'sum'
    >>> maybe_mangle_lambdas([lambda: 1, lambda: 2])  # doctest: +SKIP
    [<function __main__.<lambda_0>,
     <function pandas...._make_lambda.<locals>.f(*args, **kwargs)>]
    )rr!r½r~r*)r+Zis_dictZmangled_aggspecrrr)r@r@rAÚmaybe_mangle_lambdas‘s 
 
 r,z0tuple[list[str], list[str | Callable[..., Any]]]cCsfd}t|ƒ}g}| ¡D]4}t|tƒsBt|ƒsBt| t|ƒj¡ƒ‚|     |¡q|s^d}t|ƒ‚||fS)aÛ
    Validates types of user-provided "named aggregation" kwargs.
    `TypeError` is raised if aggfunc is not `str` or callable.
 
    Parameters
    ----------
    kwargs : dict
 
    Returns
    -------
    columns : List[str]
        List of user-provied keys.
    func : List[Union[str, callable[...,Any]]]
        List of user-provided aggfuncs
 
    Examples
    --------
    >>> validate_func_kwargs({'one': 'min', 'two': 'max'})
    (['one', 'two'], ['min', 'max'])
    z-func is expected but received {} in **kwargs.z2Must provide 'func' or named aggregation **kwargs.)
r¤r¥rMrPr[rpÚformatr½r¾r’)r;Ztuple_given_messager”r3Zcol_funcZno_arg_messager@r@rAÚvalidate_func_kwargs½s  r.)rFNNN)]Ú
__future__rrÂÚ collectionsrÚ
contextlibrÚ    functoolsrr©Útypingrrrr    r
r r r rrrrÚnumpyrNZpandas._configrZ pandas._libsrZpandas._typingrrrrrrrrZ pandas.errorsrZpandas.util._decoratorsrZpandas.core.dtypes.castrZpandas.core.dtypes.commonrr r!r"Zpandas.core.dtypes.genericr#r$r%Zpandas.core.algorithmsr&Zpandas.core.baser'Zpandas.core.commonÚcoreÚcommonr\Zpandas.core.constructionr(r•r)r*r+Zpandas.core.groupbyr,Zpandas.core.resampler-Zpandas.core.window.rollingr.ÚintrÌrBÚABCMetarCrÅr1r=r>rr rrrrrr'r*r,r.r@r@r@rAÚ<module>sh    8  (
         ùf9Li=;S!,