zmc
2023-10-12 ed135d79df12a2466b52dae1a82326941211dcc9
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
U
¬ý°dù£ã@sZdZddlmZddlZddlZddlmZmZmZm    Z    m
Z
m Z m Z ddl ZddlmZmZddlmmZddlmmZddlmZmZmZmZmZmZddl m!Z!ddl"m#Z#dd    l$m%Z%m&Z&dd
l'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6dd l7m8Z8dd l9m:Z:m;Z;dd l<m=Z=m>Z>m?Z?m@Z@mAZAddlBmCZCmDZDddlEmFZFddlGmHZHddlImJZJddlKmLZLmMZMmNZNmOZOddlPmQZQddlRmSZSmTZTmUZUmVZVmWZWmXZXerÎddlYmZZZGdd„dƒZ[Gdd„dƒZ\Gdd„de\ƒZ]dddœdd „Z^Gd!d"„d"eeƒZ_Gd#d$„d$e_ƒZ`Gd%d&„d&e_ƒZad-d'd(d)dd"d*œd+d,„ZbdS).a
Provide classes to perform the groupby aggregate operations.
 
These are not exposed to the user and provide implementations of the grouping
operations, primarily in cython. These classes (BaseGrouper and BinGrouper)
are contained *in* the SeriesGroupBy and DataFrameGroupBy objects.
é)Ú annotationsN)Ú TYPE_CHECKINGÚCallableÚGenericÚHashableÚIteratorÚSequenceÚfinal)ÚNaTÚlib)Ú    ArrayLikeÚAxisIntÚDtypeObjÚNDFrameTÚShapeÚnpt©ÚAbstractMethodError)Úcache_readonly)Úmaybe_cast_pointwise_resultÚmaybe_downcast_to_dtype)Úensure_float64Ú ensure_int64Úensure_platform_intÚ ensure_uint64Úis_1d_only_ea_dtypeÚ is_bool_dtypeÚis_complex_dtypeÚis_datetime64_any_dtypeÚis_float_dtypeÚis_integer_dtypeÚis_numeric_dtypeÚis_period_dtypeÚ    is_sparseÚis_timedelta64_dtypeÚneeds_i8_conversion)ÚCategoricalDtype)ÚisnaÚ
maybe_fill)Ú CategoricalÚ DatetimeArrayÚExtensionArrayÚ PeriodArrayÚTimedeltaArray)ÚBaseMaskedArrayÚBaseMaskedDtype)Ú StringDtype)Ú    DataFrame)Úgrouper)ÚCategoricalIndexÚIndexÚ
MultiIndexÚ ensure_index)ÚSeries)Úcompress_group_indexÚdecons_obs_group_idsÚget_flattened_listÚget_group_indexÚget_group_index_sorterÚget_indexer_dict)ÚNDFramec @sžeZdZdZedddddgƒZdddd    d
œd d „Zd ddddddddddœ
ddddddœdœZdd iZe    e
j d!d"ddd#dd$œd%d&„ƒƒZ d'd'd(œd)d*„Z dTd,dd-œd.d/„Zd0d'd1d2œd3d4„Zd#d#d5œd6d7„Zd#d#d5œd8d9„Zed:d0d0d'd;d<œd=d>„ƒZd:d'd(œd?d@„Zd:d'd:dAœdBdC„ZedDd0d0d'dDd<œdEdF„ƒZed!d!dGœd'd0d0d'dHdHd'dIœdJdK„ƒZed'd0d0d'dHdHd'dIœdLdM„ƒZedNdOœd;dPd0d'd0d;dQœdRdS„ƒZd!S)UÚWrappedCythonOpaB
    Dispatch logic for functions defined in _libs.groupby
 
    Parameters
    ----------
    kind: str
        Whether the operation is an aggregate or transform.
    how: str
        Operation name, e.g. "mean".
    has_dropped_na: bool
        True precisely when dropna=True and the grouper contains a null value.
    ÚrankÚcountÚsizeZidxminZidxmaxÚstrÚboolÚNone)ÚkindÚhowÚhas_dropped_naÚreturncCs||_||_||_dS©N©rFrGrH)ÚselfrFrGrH©rMúNd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\pandas/core/groupby/ops.pyÚ__init__xszWrappedCythonOp.__init__Z    group_sumZ
group_prodZ    group_minZ    group_maxZ
group_meanZgroup_median_float64Z    group_varZ    group_nthZ
group_lastZ
group_ohlc)
ÚsumÚprodÚminÚmaxÚmeanÚmedianÚvarÚfirstÚlastÚohlcZ group_cumprodZ group_cumsumZ group_cumminZ group_cummaxZ
group_rank)ÚcumprodÚcumsumZcumminZcummaxr@)Ú    aggregateÚ    transformrYéN)Úmaxsizeznp.dtype)rFrGÚdtypeÚ
is_numericcCs„|j}|j||}tt|ƒ}|r&|S|t t¡krv|dkrRtd|›d|›dƒ‚d|jkrrtd|›d|›dƒ‚|Std|ƒ‚dS)N)rUrZz2function is not implemented for this dtype: [how->z,dtype->ú]ÚobjectzPThis should not be reached. Please report a bug at github.com/pandas-dev/pandas/)    ÚnameÚ_CYTHON_FUNCTIONSÚgetattrÚ
libgroupbyÚnpr`rcÚNotImplementedErrorZ__signatures__)ÚclsrFrGr`raZ    dtype_strZftypeÚfrMrMrNÚ_get_cython_function—s&
ÿ
ÿýz$WrappedCythonOp._get_cython_functionú
np.ndarray)ÚvaluesrIcCsp|j}|dkrt|ƒ}nT|jjdkrl|dks<|jdkrF|jrFt|ƒ}n&|dkrl|jjdkrdt|ƒ}nt|ƒ}|S)zÖ
        Cast numeric dtypes to float64 for functions that only support that.
 
        Parameters
        ----------
        values : np.ndarray
 
        Returns
        -------
        values : np.ndarray
        rU)ÚiÚu)rVrTr])rPrYrQr[rZro)rGrr`rFrHrr)rLrnrGrMrMrNÚ_get_cython_vals¹s 
 ÿÿ
 
z WrappedCythonOp._get_cython_valsFr)r`racCsê|j}|rdSt|tƒrj|dkr4t|›d|›dƒ‚|dkrR|jsRtd|›dƒ‚|dkræt|›d    ƒ‚n|t|ƒr‚t|›d    ƒ‚ndt|ƒr¤|dkrætd
|›dƒ‚nBt|ƒrÆ|dkrætd |›dƒ‚n t    |ƒræ|d krætd |›dƒ‚dS)a+
        Check if we can do this operation with our cython functions.
 
        Raises
        ------
        TypeError
            This is not a valid operation for this dtype.
        NotImplementedError
            This may be a valid operation, but does not have a cython implementation.
        N)rPrQr[rZz type does not support z  operations)rRrSr@zCannot perform z with non-ordered Categorical)r@z dtype not supportedz!datetime64 type does not support zPeriod type does not support )rQrZz"timedelta64 type does not support )
rGÚ
isinstancer&Ú    TypeErrorÚorderedrir#rr"r$)rLr`rarGrMrMrNÚ_disallow_invalid_opsßs* 
z%WrappedCythonOp._disallow_invalid_opsÚintr)ÚngroupsrnrIcCsf|j}|j}|j |d¡}|dkr,||f}n6|dkr>tdƒ‚n$|dkrN|j}n|f|jdd…}|S)NérYz<arity of more than 1 is not supported for the 'how' argumentr])rGrFÚ _cython_arityÚgetriÚshape)rLrwrnrGrFÚarityÚ    out_shaperMrMrNÚ_get_output_shape s
ÿz!WrappedCythonOp._get_output_shape)r`rIcCs<|j}|dkrd}nt|ƒr.|j›|j›}nd}t |¡S)Nr@Úfloat64rc)rGr!rFÚitemsizerhr`)rLr`rGÚ    out_dtyperMrMrNÚ_get_out_dtypeszWrappedCythonOp._get_out_dtypecCs^|j}|dkr*|t t¡krZt tj¡Sn0|dkrZt|ƒsBt|ƒrF|St|ƒrZt tj¡S|S)a 
        Get the desired dtype of a result based on the
        input dtype and how it was computed.
 
        Parameters
        ----------
        dtype : np.dtype
 
        Returns
        -------
        np.dtype
            The desired dtype of the result.
        )rPr[rPrQrZ)rTrUrV)    rGrhr`rDÚint64rrr!r)rLr`rGrMrMrNÚ_get_result_dtype*s z!WrappedCythonOp._get_result_dtyper+r )rnÚ    min_countrwÚcomp_idsrIc    Ks¶t|tƒr$|j|f|||dœ|—ŽSt|tƒrt|jdks<t‚|jsFt‚| ¡}|j}|j    |f||||dœ|—Ž}|S| 
|¡}|j    |f|||ddœ|—Ž}|j|j krª|S|  ||¡S)zs
        If we have an ExtensionArray, unwrap, call _cython_operation, and
        re-wrap if appropriate.
        ©r…rwr†r@©r…rwr†ÚmaskN) rrr.Ú _masked_ea_wrap_cython_operationr)rGÚAssertionErrorrtr'Ú_ndarrayÚ_cython_op_ndim_compatÚ_ea_to_cython_valuesÚcast_blocklistÚ_reconstruct_ea_result)    rLrnr…rwr†Úkwargsr‰ÚnpvaluesÚ
res_valuesrMrMrNÚ_ea_wrap_cython_operationDsP
ÿüû
 
ÿûú 
ÿûú     z)WrappedCythonOp._ea_wrap_cython_operationcCsPt|tttfƒr|j d¡}n.t|jtƒr<|jt    t
j d}nt d|j›ƒ‚|S)NúM8[ns])Zna_valuez,function is not implemented for this dtype: ) rrr*r,r-rŒÚviewr`r0Zto_numpyrcrhÚnanri)rLrnr’rMrMrNrŽ€s 
ÿz$WrappedCythonOp._ea_to_cython_values)rnr“rIcCsft|jtƒr(|j}| ¡}|j||dSt|tttfƒr^|jdksFt‚|     |j
j¡}|  |¡St ‚dS)zL
        Construct an ExtensionArray result from an ndarray result.
        ©r`r•N) rrr`r0Zconstruct_array_typeZ_from_sequencer*r-r,r‹r–rŒZ_from_backing_datari)rLrnr“r`Zstring_array_clsrMrMrNrs 
z&WrappedCythonOp._reconstruct_ea_resultr.c Ksˆ|}|j}|jdkr| ¡}ntj|td}|j}    |j|    f|||||dœ|—Ž}
|jdkr||j     
|jd¡} t  || df¡j }|  |
|¡S)z
        Equivalent of `_ea_wrap_cython_operation`, but optimized for masked EA's
        and cython algorithms which accept a mask.
        r\r˜©r…rwr†r‰Ú result_maskrYrx)Z_maskrFÚcopyrhÚzerosrDÚ_datarrGryrzZtileÚTZ_maybe_mask_result) rLrnr…rwr†r‘Ú orig_valuesr‰ršZarrr“r|rMrMrNrŠ¥s* 
 
ÿúù
 
z0WrappedCythonOp._masked_ea_wrap_cython_operation)r‰ršznpt.NDArray[np.bool_] | None)rnr…rwr†r‰ršrIc
Ks¢|jdkr„|ddd…f}|dk    r2|ddd…f}|dk    rJ|ddd…f}|j|f|||||dœ|—Ž}    |    jddkr~|    dS|    jS|j|f|||||dœ|—ŽS)Nrxr™r)ÚndimÚ_call_cython_opr{rž)
rLrnr…rwr†r‰ršr‘Zvalues2dÚresrMrMrNrÏs>
ÿúù    ÿúùz&WrappedCythonOp._cython_op_ndim_compatc
Ks"|}|j}    t|    ƒ}
t|    ƒ} | r.| d¡}d}
nt|    ƒr@| d¡}|jdkrV| tj¡}|j}|dk    rx|j}|dk    rx|j}|     ||¡} | 
|j |j |j|
¡} |  |¡}| |j¡}ttj| |dƒ}|j dkrBtj|tjd}|j dkr| |||||||| dn<|j d    kr0| ||||f|||d
œ|—Žnt|j ›d ƒ‚n0|j d krV||d <| f||||| |dœ|—Ž|j dkrît|jƒrî| sît|j dkr¢dnd|ƒ}||k}| ¡rî|dk    rÚ|| ¡sît‚n| d¡}tj||<|j}|j |jkr| |j¡}t||ƒ}n|}|S)NrƒTZuint8Úfloat16r˜r\)rRrSrTrXrWrP)ÚoutÚcountsrnÚlabelsr…r‰ršÚis_datetimelike)rVrYrQrU)r…r‰ršz is not implementedr@rš)r¤rnr¦rwr§r‰)rPrQrrxr)r`r!r%r–rZastyperhÚfloat32ržr~rlrFrGrqr‚r(Úemptyrœrƒrir rSÚanyÚallr‹r—rr„r)rLrnr…rwr†r‰ršr‘rŸr`rar§r}ÚfuncrÚresultr¥ÚcutoffZ empty_groupsZ    res_dtypeÚ    op_resultrMrMrNr¡ûs– 
 
 
 
   ø
üùø  úù
 
 
 
 
  zWrappedCythonOp._call_cython_opéÿÿÿÿ)r…r )rnÚaxisr…r†rwrIc    Ks |jdkrtdƒ‚|jdkr.|dksDt|ƒ‚nt|jƒsD|dksDt‚|j}t|ƒ}| ||¡t|tj    ƒs„|j
|f|||dœ|—ŽS|j |f|||ddœ|—ŽS)zW
        Call our cython function, with appropriate pre- and post- processing.
        éz.number of dimensions is currently limited to 2rxrr‡Nrˆ) r rir‹rr`r!rurrrhÚndarrayr”r)    rLrnr±r…r†rwr‘r`rarMrMrNÚcython_operationis:
 
 
   ÿüûÿûúz WrappedCythonOp.cython_operation)F)Ú__name__Ú
__module__Ú __qualname__Ú__doc__Ú    frozensetrrOreryÚ classmethodÚ    functoolsÚ    lru_cacherlrqrur~r‚r„r    r”rŽrrŠrr¡r´rMrMrMrNr?fsZö ûó
 &, ;)ø +mûr?c@sHeZdZUdZded<deddddddœd    d
„Zed d œd d„ƒZedd œdd„ƒZdd œdd„Z    edd œdd„ƒZ
dfddddœdd„Z e dgddd dœd!d"„ƒZ e ed#d$„ƒƒZe dhd%d&dd'd(œd)d*„ƒZed+d œd,d-„ƒZe d.d œd/d0„ƒZe ed1d œd2d3„ƒƒZed4d œd5d6„ƒZed7d œd8d9„ƒZe d:d œd;d<„ƒZed=d œd>d?„ƒZe edd œd@dA„ƒƒZe edd œdBdC„ƒƒZedDd œdEdF„ƒZed.d œdGdH„ƒZe dId œdJdK„ƒZe edd œdLdM„ƒƒZedNd œdOdP„ƒZedd œdQdR„ƒZe dSd œdTdU„ƒZ e didWdWdddXdYœdZd[„ƒZ!e djd:d%ddXd]œd^d_„ƒZ"e d:d%d`daœdbdc„ƒZ#ddS)kÚ BaseGrouperaŒ
    This is an internal Grouper class, which actually holds
    the generated groups
 
    Parameters
    ----------
    axis : Index
    groupings : Sequence[Grouping]
        all the grouping instances to handle in this grouper
        for example for grouper list to groupby, need to pass the list
    sort : bool, default True
        whether this grouper will give sorted result or not
 
    r4r±TzSequence[grouper.Grouping]rDrE)r±Ú    groupingsÚsortÚdropnarIcCs2t|tƒst|ƒ‚||_t|ƒ|_||_||_dSrJ)rrr4r‹r±ÚlistÚ
_groupingsÚ_sortrÀ)rLr±r¾r¿rÀrMrMrNrO­s
 
zBaseGrouper.__init__úlist[grouper.Grouping]©rIcCs|jSrJ)r©rLrMrMrNr¾»szBaseGrouper.groupingsrcCstdd„|jDƒƒS)Ncss|] }|jVqdSrJ)rw©Ú.0ÚpingrMrMrNÚ    <genexpr>Ász$BaseGrouper.shape.<locals>.<genexpr>)Útupler¾rÆrMrMrNr{¿szBaseGrouper.shapezIterator[Hashable]cCs
t|jƒSrJ)ÚiterÚindicesrÆrMrMrNÚ__iter__ÃszBaseGrouper.__iter__rvcCs
t|jƒSrJ)Úlenr¾rÆrMrMrNÚnkeysÆszBaseGrouper.nkeysrrr z#Iterator[tuple[Hashable, NDFrameT]])Údatar±rIccs(|j||d}|j}t||ƒEdHdS)úš
        Groupby iterator
 
        Returns
        -------
        Generator yielding sequence of (name, subsetted object)
        for each group
        ©r±N)Ú _get_splitterÚgroup_keys_seqÚzip)rLrÑr±ÚsplitterÚkeysrMrMrNÚ get_iteratorÊs zBaseGrouper.get_iteratorr>Ú DataSplittercCs|j\}}}t||||dS)zV
        Returns
        -------
        Generator yielding subsetted objects
        rÓ)Ú
group_inforÔ)rLrÑr±ÚidsÚ_rwrMrMrNrÔÙs zBaseGrouper._get_splittercCs:t|jƒdkr|jdS|j\}}}t|||j|jƒSdS©Nrxr)rÏr¾ÚlevelsrÛr:Úcodes)rLrÜrÝrwrMrMrNrÕãs
 zBaseGrouper.group_keys_seqrzDataFrame | Seriesztuple[list, bool])rkrÑr±rIc Cs¤d}|j||d}|j}g}t||ƒ}|D]B\}    }
t |
d|    ¡|
j} ||
ƒ} |sbt| | |ƒsbd}| | ¡q*t|ƒdkrœt    |ddƒdkrœ||j
dd…ƒ||fS)NFrÓrdTrrµ)ZskewrPrQ) rÔrÕrÖrcÚ __setattr__ÚaxesÚ_is_indexed_likeÚappendrÏrfÚiloc) rLrkrÑr±Zmutatedr×Z
group_keysZ result_valuesZzippedÚkeyÚgroupZ
group_axesr¢rMrMrNÚapplyîs
  zBaseGrouper.applyz$dict[Hashable, npt.NDArray[np.intp]]cCsPt|jƒdkr&t|jtƒr&|jdjSdd„|jDƒ}dd„|jDƒ}t||ƒS)z"dict {group name -> group indices}rxrcSsg|]
}|j‘qSrM©ràrÇrMrMrNÚ
<listcomp>sz'BaseGrouper.indices.<locals>.<listcomp>cSsg|]
}|j‘qSrM©Ú group_indexrÇrMrMrNrês)rÏr¾rrÚ result_indexr3rÍr=)rLZ
codes_listrØrMrMrNrÍs
 zBaseGrouper.indicesúnpt.NDArray[np.intp]cCs|t|j|j|jdd}t||jd\}}|jrVt |dk¡}t |dk¡|}||}t    ||j
ƒ}|jrx|t  ||¡7}|S)zR
        Get the original integer locations of result_index in the input.
        T©r¿Úxnull©r¿rr°) r;ràr{rÃr8rHrhÚwherer[r<rwÚtake)rLrìrÝr‰Z    null_gapsr­rMrMrNÚ result_ilocssÿ zBaseGrouper.result_ilocsz#list[npt.NDArray[np.signedinteger]]cCsdd„|jDƒS)NcSsg|]
}|j‘qSrMrérÇrMrMrNrê8sz%BaseGrouper.codes.<locals>.<listcomp>©r¾rÆrMrMrNrà5szBaseGrouper.codesú list[Index]cCsdd„|jDƒS)NcSsg|]
}|j‘qSrMrërÇrMrMrNrê<sz&BaseGrouper.levels.<locals>.<listcomp>rõrÆrMrMrNrß:szBaseGrouper.levelsúlist[Hashable]cCsdd„|jDƒS)NcSsg|]
}|j‘qSrM)rdrÇrMrMrNrê@sz%BaseGrouper.names.<locals>.<listcomp>rõrÆrMrMrNÚnames>szBaseGrouper.namesr7cCs<|j\}}}|r(tj||dk|d}ng}t||jddS)z&
        Compute group sizes.
        r°)Z    minlengthrƒ)Úindexr`)rÛrhZbincountr7rí)rLrÜrÝrwr¤rMrMrNrBBs
 zBaseGrouper.sizezdict[Hashable, np.ndarray]cCsFt|jƒdkr|jdjStdd„|jDƒŽ}t|ƒ}|j |¡SdS)ú!dict {group name -> group labels}rxrcss|] }|jVqdSrJ)Zgrouping_vectorrÇrMrMrNrÊUsz%BaseGrouper.groups.<locals>.<genexpr>N)rÏr¾ÚgroupsrÖr4r±Úgroupby)rLZ
to_groupbyrùrMrMrNrûOs
 zBaseGrouper.groupscCst|jdƒjS©Nr)r4rÛZis_monotonic_increasingrÆrMrMrNÚ is_monotonicYszBaseGrouper.is_monotoniccCst|jddk ¡ƒS)zE
        Whether grouper has null value(s) that are dropped.
        r)rDrÛrªrÆrMrMrNrH_szBaseGrouper.has_dropped_naú6tuple[npt.NDArray[np.intp], npt.NDArray[np.intp], int]cCs&| ¡\}}t|ƒ}t|ƒ}|||fSrJ)Ú_get_compressed_codesrÏr)rLr†Ú obs_group_idsrwrMrMrNrÛgs zBaseGrouper.group_infocCs|j\}}}|SrJ)rÛ)rLrÜrÝrMrMrNÚ
codes_infops zBaseGrouper.codes_infoz:tuple[npt.NDArray[np.signedinteger], npt.NDArray[np.intp]]cCsVt|jƒdkr0t|j|jddd}t||jdS|jd}|jtjt|j    ƒtj
dfS)NrxTrïrñrr˜) rÏr¾r;ràr{r8rÃrhÚarangerìÚintp)rLrìrÉrMrMrNrvs
 
z!BaseGrouper._get_compressed_codescCs
t|jƒSrJ)rÏrírÆrMrMrNrwƒszBaseGrouper.ngroupszlist[npt.NDArray[np.intp]]cCs&|j}|j\}}}t|||j|ddS)NT)rð)ràrÛr9r{)rLràrÜZobs_idsrÝrMrMrNÚreconstructed_codesˆs zBaseGrouper.reconstructed_codescCsNt|jƒdkr&|jdj |jd¡S|j}dd„|jDƒ}t||d|jdS)NrxrcSsg|]
}|j‘qSrM)rírÇrMrMrNrê”sz,BaseGrouper.result_index.<locals>.<listcomp>F)rßràZverify_integrityrø)rÏr¾ríÚrenamerørr5)rLràrßrMrMrNríŽsÿzBaseGrouper.result_indexzlist[ArrayLike]cCsZt|jƒdkr|jdjgSg}t|j|jƒD]&\}}t|ƒ}|j |¡}| |¡q.|SrÞ)rÏr¾Zgroup_arraylikerÖrrrórä)rLÚ    name_listrÉràrßrMrMrNÚget_group_levels™s  zBaseGrouper.get_group_levelsr°rCr )rFrGr±r…rIc KsJ|dks t‚t|||jd}|j\}}    }    |j}
|jf|||||
dœ|—ŽS)z;
        Returns the values of a cython operation.
        )r]r\rK)rnr±r…r†rw)r‹r?rHrÛrwr´) rLrFrnrGr±r…r‘Zcy_oprÜrÝrwrMrMrNÚ_cython_operation¬s  ûúzBaseGrouper._cython_operationF)Úobjr¬Úpreserve_dtyperIcCsVt|ƒdkrt|jtjƒsd}| ||¡}tj|dd}|rNt||j    dd}n|}|S)a1
        Parameters
        ----------
        obj : Series
        func : function taking a Series and returning a scalar-like
        preserve_dtype : bool
            Whether the aggregation is known to be dtype-preserving.
 
        Returns
        -------
        np.ndarray or ExtensionArray
        rTF)Z    try_float)Z numeric_only)
rÏrrÚ_valuesrhr³Ú_aggregate_series_pure_pythonr Zmaybe_convert_objectsrr`)rLr
r¬r r­r’r¤rMrMrNÚ
agg_seriesÈs zBaseGrouper.agg_seriesznpt.NDArray[np.object_])r
r¬rIc Csr|j\}}}tj|dd}d}|j|dd}t|ƒD]8\}}    ||    ƒ}
t |
¡}
|sdt |
|    j¡d}|
||<q4|S)NÚOr˜FrrÓT)    rÛrhr©rÔÚ    enumerateÚ libreductionZextract_resultZcheck_result_arrayr`) rLr
r¬rÝrwr­Z initializedr×rorçr¢rMrMrNr ës 
 
z)BaseGrouper._aggregate_series_pure_pythonN)TT)r)r)r)r°)F)$rµr¶r·r¸Ú__annotations__rOÚpropertyr¾r{rÎrÐrÙr    rÔrrÕrèrÍrôràrßrørBrûrþrHrÛrrrwrrírr    rr rMrMrMrNr½›s„
ûÿ         ÿ!          
úÿ"r½c@sìeZdZUdZded<ded<d,ddœd    d
„Zed d „ƒZed dœdd„ƒZ    eddœdd„ƒZ
d-dddœdd„Z edd„ƒZ eddœdd„ƒZ eddœdd „ƒZeddœd!d"„ƒZed#dœd$d%„ƒZed&dœd'd(„ƒZed)dœd*d+„ƒZdS).Ú
BinGrouperaå
    This is an internal Grouper class
 
    Parameters
    ----------
    bins : the split index of binlabels to group the item of axis
    binlabels : the label list
    indexer : np.ndarray[np.intp], optional
        the indexer created by Grouper
        some groupers (TimeGrouper) will sort its axis and its
        group_info is also sorted, so need the indexer to reorder
 
    Examples
    --------
    bins: [2, 4, 6, 8, 10]
    binlabels: DatetimeIndex(['2005-01-01', '2005-01-03',
        '2005-01-05', '2005-01-07', '2005-01-09'],
        dtype='datetime64[ns]', freq='2D')
 
    the group_info, which contains the label of each item in grouped
    axis, the index of label in label list, group number, is
 
    (array([0, 0, 1, 1, 2, 2, 3, 3, 4, 4]), array([0, 1, 2, 3, 4]), 5)
 
    means that, the grouped axis has 10 items, can be grouped into 5
    labels, the first and second items belong to the first label, the
    third and forth items belong to the second label, and so on
 
    znpt.NDArray[np.int64]Úbinsr4Ú    binlabelsNrErÅcCs6t|ƒ|_t|ƒ|_||_t|jƒt|jƒks2t‚dSrJ)rrr6rÚindexerrÏr‹)rLrrrrMrMrNrO&s
 
zBinGrouper.__init__cCsdd„t|j|jƒDƒ}|S)rúcSsi|]\}}|tk    r||“qSrM)r
)rÈræÚvaluerMrMrNÚ
<dictcomp>9sþz%BinGrouper.groups.<locals>.<dictcomp>)rÖrr)rLr­rMrMrNrû4s þzBinGrouper.groupsrvcCsdS)NrxrMrÆrMrMrNrÐ@szBinGrouper.nkeysrîcCs2|j\}}}|jdk    r.t ||jf¡}||}|SrJ)rÛrrhZlexsort)rLrÜrÝZsorterrMrMrNrEs
 
zBinGrouper.codes_inforr>r )rÑr±c#sŠ|dkr‡fdd„}n ‡fdd„}tˆj|ƒ}d}t|j|jƒD]$\}}|tk    rb||||ƒfV|}qB||kr†|jd||dƒfVdS)rÒrcsˆj||…SrJ©rå©ÚstartÚedge©rÑrMrNÚ<lambda>Xóz)BinGrouper.get_iterator.<locals>.<lambda>csˆjdd…||…fSrJrrrrMrNrZr r°N)rÏrârÖrrr
)rLrÑr±ZslicerÚlengthrrÚlabelrMrrNrÙNs     zBinGrouper.get_iteratorcCsPt t¡}d}t|j|jƒD].\}}||kr|tk    rFtt||ƒƒ||<|}q|Srý)Ú collectionsÚ defaultdictrÁrÖrrr
Úrange)rLrÍror"ÚbinrMrMrNrÍgs
zBinGrouper.indicesrÿcCs€|j}tj|tjd}t tjd|jf¡}t|ƒ}|t|jƒkrVt     t |¡|¡}nt     tjdt |¡f|¡}t|ƒ||fS)Nr˜rr°)
rwrhrrZdiffÚr_rrrÏÚrepeat)rLrwrÚrepr†rMrMrNrÛssýzBinGrouper.group_infozlist[np.ndarray]cCs2tjdt |jdd…|jdd…k¡dfgS)Nrrxr°)rhr'Z flatnonzerorrÆrMrMrNr…szBinGrouper.reconstructed_codescCs0t|jƒdkr*t|jdƒr*|jdd…S|jS)Nrrx)rÏrr'rÆrMrMrNríŠszBinGrouper.result_indexröcCs|jgSrJ)rrÆrMrMrNrߑszBinGrouper.levelsr÷cCs
|jjgSrJ)rrdrÆrMrMrNrø•szBinGrouper.namesrÄcCs6|j}|jd}| |¡}tj||dd|jd}|gS)NrF)Zin_axisÚlevelZuniques)rrÛrór2ZGroupingr )rLZlevràr¦rÉrMrMrNr¾™s
 
ÿzBinGrouper.groupings)N)r)rµr¶r·r¸rrOrrûrrÐrrÙrÍrÛrrírßrør¾rMrMrMrNrs4
ü
 
rr rD)r±rIcCsPt|tƒr.t|ƒdkrdS|j| ||¡St|tƒrL|j| ||¡SdS)NrxF)rrr7rÏrâÚequalsr1)r
râr±rMrMrNrã¤s
 
rãc@sxeZdZdddddddœdd    „Zedd
œd d „ƒZedd
œd d„ƒZdd
œdd„Zedd
œdd„ƒZdddœdd„Z    dS)rÚrrrîrvr rE©rÑr¦rwr±rIcCs2||_t|ƒ|_||_||_t|tƒs.t|ƒ‚dSrJ)rÑrr¦rwr±rrrvr‹)rLrÑr¦rwr±rMrMrNrO´s
 
zDataSplitter.__init__rÅcCs|j |j¡SrJ)r¦róÚ    _sort_idxrÆrMrMrNÚ_slabelsÂszDataSplitter._slabelscCst|j|jƒSrJ)r<r¦rwrÆrMrMrNr-ÇszDataSplitter._sort_idxrccsT|j}|jdkrdSt |j|j¡\}}t||ƒD]\}}| |t||ƒ¡Vq2dSrý)Ú _sorted_datarwr Zgenerate_slicesr.rÖÚ_chopÚslice)rLÚsdataZstartsZendsrÚendrMrMrNrÎÌs 
zDataSplitter.__iter__cCs|jj|j|jdS)NrÓ)rÑrór-r±rÆrMrMrNr/ÙszDataSplitter._sorted_datar1r>)Ú    slice_objrIcCs t|ƒ‚dSrJr)rLr2r4rMrMrNr0ÝszDataSplitter._chopN)r)
rµr¶r·rOrr.r-rÎr/r0rMrMrMrNrÚ³sû rÚc@seZdZddddœdd„ZdS)ÚSeriesSplitterr7r1©r2r4rIcCs,|j |¡}|j||jdd}|j|ddS)NT)rdZfastpathrü©Úmethod)Ú_mgrÚ    get_sliceÚ _constructorrdÚ __finalize__)rLr2r4ÚmgrZserrMrMrNr0âs zSeriesSplitter._chopN©rµr¶r·r0rMrMrMrNr5ásr5c@seZdZddddœdd„ZdS)Ú FrameSplitterr1r1r6cCs.|jj|d|jd}| |¡}|j|ddS)NrxrÓrür7)r9r:r±r;r<)rLr2r4r=ZdfrMrMrNr0ês
zFrameSplitter._chopNr>rMrMrMrNr?ésr?r>rmrvr,cCs"t|tƒrt}nt}|||||ƒSrJ)rrr7r5r?)rÑr¦rwr±ÚklassrMrMrNrÔõs
rÔ)r)cr¸Ú
__future__rr#r»Útypingrrrrrrr    ÚnumpyrhZ pandas._libsr
r Zpandas._libs.groupbyZ_libsrürgZpandas._libs.reductionZ    reductionrZpandas._typingr r rrrrZ pandas.errorsrZpandas.util._decoratorsrZpandas.core.dtypes.castrrZpandas.core.dtypes.commonrrrrrrrrrr r!r"r#r$r%Zpandas.core.dtypes.dtypesr&Zpandas.core.dtypes.missingr'r(Zpandas.core.arraysr)r*r+r,r-Zpandas.core.arrays.maskedr.r/Zpandas.core.arrays.string_r0Zpandas.core.framer1Zpandas.core.groupbyr2Zpandas.core.indexes.apir3r4r5r6Zpandas.core.seriesr7Zpandas.core.sortingr8r9r:r;r<r=Zpandas.core.genericr>r?r½rrãrÚr5r?rÔrMrMrMrNÚ<module>sR $
   D           9k!. ÿ