hyb
2025-11-18 7539e6f48c75dcaeb808359cccfd1c0d0d182ce8
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
Ë
nñúh/—ãóÆ—dZddlmZddlmZmZddlZddlZddl    m
Z
m Z ddl m Z ddlmZddlmZdd    lmZdd
lmZdd lmZmZdd lmZdd lmZddlmZmZddl m!cm"Z#ddl$m%Z%ddl&m'Z'ddl(m)Z)ddl*m+Z+m,Z,m-Z-ddl.m/Z/ddl0m1Z1erddl2m3Z3m4Z4ddl5m6Z6m7Z7m8Z8m9Z9ddl:m;Z;Gd„d«Z<eGd„d««Z=                            d                                                    d d„Z>d!d„Z?d"d„Z@y)#z]
Provide user facing operators for doing the split part of the
split-apply-combine paradigm.
é)Ú annotations)Ú TYPE_CHECKINGÚfinalN)Úusing_copy_on_writeÚwarn_copy_on_write)Úlib)ÚOutOfBoundsDatetime)ÚInvalidIndexError)Úcache_readonly)Úfind_stack_level)Ú is_list_likeÚ    is_scalar)ÚCategoricalDtype)Ú
algorithms)Ú CategoricalÚExtensionArray)Ú    DataFrame)Úops)Úrecode_for_groupby)ÚCategoricalIndexÚIndexÚ
MultiIndex)ÚSeries)Ú pprint_thing)ÚHashableÚIterator)Ú    ArrayLikeÚAxisÚNDFrameTÚnpt)ÚNDFramecó^‡—eZdZUdZded<ded<ded<ded<dZd    ed
<ˆfd „Zd d d ejd df                            dd„Z        d                    dd„Z
    dd dœ                            dd„Z e e dd„««Ze e d„««Ze e d„««Ze e d„««Ze e d„««Ze dd„«ZˆxZS) ÚGrouperaÖ
    A Grouper allows the user to specify a groupby instruction for an object.
 
    This specification will select a column via the key parameter, or if the
    level and/or axis parameters are given, a level of the index of the target
    object.
 
    If `axis` and/or `level` are passed as keywords to both `Grouper` and
    `groupby`, the values passed to `Grouper` take precedence.
 
    Parameters
    ----------
    key : str, defaults to None
        Groupby key, which selects the grouping column of the target.
    level : name/number, defaults to None
        The level for the target index.
    freq : str / frequency object, defaults to None
        This will groupby the specified frequency if the target selection
        (via key or level) is a datetime-like object. For full specification
        of available frequencies, please see `here
        <https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases>`_.
    axis : str, int, defaults to 0
        Number/name of the axis.
    sort : bool, default to False
        Whether to sort the resulting labels.
    closed : {'left' or 'right'}
        Closed end of interval. Only when `freq` parameter is passed.
    label : {'left' or 'right'}
        Interval boundary to use for labeling.
        Only when `freq` parameter is passed.
    convention : {'start', 'end', 'e', 's'}
        If grouper is PeriodIndex and `freq` parameter is passed.
 
    origin : Timestamp or str, default 'start_day'
        The timestamp on which to adjust the grouping. The timezone of origin must
        match the timezone of the index.
        If string, must be one of the following:
 
        - 'epoch': `origin` is 1970-01-01
        - 'start': `origin` is the first value of the timeseries
        - 'start_day': `origin` is the first day at midnight of the timeseries
 
        - 'end': `origin` is the last value of the timeseries
        - 'end_day': `origin` is the ceiling midnight of the last day
 
        .. versionadded:: 1.3.0
 
    offset : Timedelta or str, default is None
        An offset timedelta added to the origin.
 
    dropna : bool, default True
        If True, and if group keys contain NA values, NA values together with
        row/column will be dropped. If False, NA values will also be treated as
        the key in groups.
 
    Returns
    -------
    Grouper or pandas.api.typing.TimeGrouper
        A TimeGrouper is returned if ``freq`` is not ``None``. Otherwise, a Grouper
        is returned.
 
    Examples
    --------
    ``df.groupby(pd.Grouper(key="Animal"))`` is equivalent to ``df.groupby('Animal')``
 
    >>> df = pd.DataFrame(
    ...     {
    ...         "Animal": ["Falcon", "Parrot", "Falcon", "Falcon", "Parrot"],
    ...         "Speed": [100, 5, 200, 300, 15],
    ...     }
    ... )
    >>> df
       Animal  Speed
    0  Falcon    100
    1  Parrot      5
    2  Falcon    200
    3  Falcon    300
    4  Parrot     15
    >>> df.groupby(pd.Grouper(key="Animal")).mean()
            Speed
    Animal
    Falcon  200.0
    Parrot   10.0
 
    Specify a resample operation on the column 'Publish date'
 
    >>> df = pd.DataFrame(
    ...    {
    ...        "Publish date": [
    ...             pd.Timestamp("2000-01-02"),
    ...             pd.Timestamp("2000-01-02"),
    ...             pd.Timestamp("2000-01-09"),
    ...             pd.Timestamp("2000-01-16")
    ...         ],
    ...         "ID": [0, 1, 2, 3],
    ...         "Price": [10, 20, 30, 40]
    ...     }
    ... )
    >>> df
      Publish date  ID  Price
    0   2000-01-02   0     10
    1   2000-01-02   1     20
    2   2000-01-09   2     30
    3   2000-01-16   3     40
    >>> df.groupby(pd.Grouper(key="Publish date", freq="1W")).mean()
                   ID  Price
    Publish date
    2000-01-02    0.5   15.0
    2000-01-09    2.0   30.0
    2000-01-16    3.0   40.0
 
    If you want to adjust the start of the bins based on a fixed timestamp:
 
    >>> start, end = '2000-10-01 23:30:00', '2000-10-02 00:30:00'
    >>> rng = pd.date_range(start, end, freq='7min')
    >>> ts = pd.Series(np.arange(len(rng)) * 3, index=rng)
    >>> ts
    2000-10-01 23:30:00     0
    2000-10-01 23:37:00     3
    2000-10-01 23:44:00     6
    2000-10-01 23:51:00     9
    2000-10-01 23:58:00    12
    2000-10-02 00:05:00    15
    2000-10-02 00:12:00    18
    2000-10-02 00:19:00    21
    2000-10-02 00:26:00    24
    Freq: 7min, dtype: int64
 
    >>> ts.groupby(pd.Grouper(freq='17min')).sum()
    2000-10-01 23:14:00     0
    2000-10-01 23:31:00     9
    2000-10-01 23:48:00    21
    2000-10-02 00:05:00    54
    2000-10-02 00:22:00    24
    Freq: 17min, dtype: int64
 
    >>> ts.groupby(pd.Grouper(freq='17min', origin='epoch')).sum()
    2000-10-01 23:18:00     0
    2000-10-01 23:35:00    18
    2000-10-01 23:52:00    27
    2000-10-02 00:09:00    39
    2000-10-02 00:26:00    24
    Freq: 17min, dtype: int64
 
    >>> ts.groupby(pd.Grouper(freq='17min', origin='2000-01-01')).sum()
    2000-10-01 23:24:00     3
    2000-10-01 23:41:00    15
    2000-10-01 23:58:00    45
    2000-10-02 00:15:00    45
    Freq: 17min, dtype: int64
 
    If you want to adjust the start of the bins with an `offset` Timedelta, the two
    following lines are equivalent:
 
    >>> ts.groupby(pd.Grouper(freq='17min', origin='start')).sum()
    2000-10-01 23:30:00     9
    2000-10-01 23:47:00    21
    2000-10-02 00:04:00    54
    2000-10-02 00:21:00    24
    Freq: 17min, dtype: int64
 
    >>> ts.groupby(pd.Grouper(freq='17min', offset='23h30min')).sum()
    2000-10-01 23:30:00     9
    2000-10-01 23:47:00    21
    2000-10-02 00:04:00    54
    2000-10-02 00:21:00    24
    Freq: 17min, dtype: int64
 
    To replace the use of the deprecated `base` argument, you can now use `offset`,
    in this example it is equivalent to have `base=2`:
 
    >>> ts.groupby(pd.Grouper(freq='17min', offset='2min')).sum()
    2000-10-01 23:16:00     0
    2000-10-01 23:33:00     9
    2000-10-01 23:50:00    36
    2000-10-02 00:07:00    39
    2000-10-02 00:24:00    24
    Freq: 17min, dtype: int64
    ÚboolÚsortÚdropnaú Index | NoneÚ
_gpr_indexÚ_grouper)ÚkeyÚlevelÚfreqÚaxisr%r&ztuple[str, ...]Ú _attributescóT•—|jd«ddlm}|}t‰||«S)Nr,r)Ú TimeGrouper)ÚgetÚpandas.core.resampler0ÚsuperÚ__new__)ÚclsÚargsÚkwargsr0Ú    __class__s    €úNH:\Change_password\venv_build\Lib\site-packages\pandas/core/groupby/grouper.pyr4zGrouper.__new__þs)ø€Ø :‰:fÓ Ð )Ý 8àˆC܉w‰˜sÓ#Ð#óNFTcóv—t|«tur9|tjur%t    j
dt t«¬«nd}|tjurd}||_||_    ||_
||_ ||_ ||_ d|_d|_d|_d|_d|_d|_d|_y)Nz~Grouper axis keyword is deprecated and will be removed in a future version. To group on axis=1, use obj.T.groupby(...) instead©Ú
stacklevelr)Útyper#rÚ
no_defaultÚwarningsÚwarnÚ FutureWarningr r*r+r,r-r%r&Ú_grouper_deprecatedÚ_indexer_deprecatedÚ_obj_deprecatedr(Úbinnerr)Ú_indexer)Úselfr*r+r,r-r%r&s       r9Ú__init__zGrouper.__init__s®€ô ‹:œÑ  àœ3Ÿ>™>Ñ)Ü— ‘ ðô"Ü/Ó1ö ðØ ”3—>‘>Ñ !؈DàˆŒØˆŒ
؈Œ    ØˆŒ    ØˆŒ    ØˆŒ à#'ˆÔ Ø@DˆÔ Ø#ˆÔ؈ŒØˆŒ ؈Œ Ø59ˆ r:c    óԗ|j|«\}}}t||jg|j|j|j
||j ¬«\}}}||_||fS)zô
        Parameters
        ----------
        obj : Series or DataFrame
        validate : bool, default True
            if True, validate the grouper
 
        Returns
        -------
        a tuple of grouper, obj (possibly sorted)
        )r-r+r%Úvalidater&)Ú _set_grouperÚ get_grouperr*r-r+r%r&rC)rHÚobjrKÚ_Úgroupers     r9Ú _get_grouperzGrouper._get_grouper,si€ð×%Ñ% cÓ*‰    ˆˆQÜ%Ø Ø X‰XˆJØ—‘Ø—*‘*Ø—‘ØØ—;‘;ô
‰ˆCð$+ˆÔ à˜ˆ|Ðr:)Ú    gpr_indexcó—|€J‚|j|j td«‚|j€||_|j|_|jë|j}t |dd«|k(r¡t|t«r‘|j€J‚|j
Q|j
j«}|jj|«}|j|j«}nñ|jj|j«}nË||jvrtd|›d«‚t|||¬«}n|j|j «}|jv|j}t|t"«r;|j%|«}t|j'|«|j(|¬«}n|d|j*fvrtd|›d    «‚d}    |j,s|r^|j.sR|j0jd
d ¬ «x}    |_|j|    «}|j|    |j ¬ «}||_||_|||    fS)a·
        given an object and the specifications, setup the internal grouper
        for this particular specification
 
        Parameters
        ----------
        obj : Series or DataFrame
        sort : bool, default False
            whether the resulting grouper should be sorted
        gpr_index : Index or None, default None
 
        Returns
        -------
        NDFrame
        Index
        np.ndarray[np.intp] | None
        Nz2The Grouper cannot specify both a key and a level!ÚnamezThe grouper name z  is not found©rTrz
The level z  is not validÚ    mergesortÚfirst)ÚkindÚ na_position©r-)r*r+Ú
ValueErrorr)rDrGÚgetattrÚ
isinstancerÚargsortÚtakeÚindexÚ
_info_axisÚKeyErrorrÚ    _get_axisr-rÚ_get_level_numberÚ_get_level_valuesÚnamesrTr%Úis_monotonic_increasingÚarrayrEr()
rHrNr%rRr*Úreverse_indexerÚ unsorted_axÚaxr+Úindexers
          r9rLzGrouper._set_grouperKs*€ð(ˆÐˆà 8‰8Ð  D§J¡JÐ$:ÜÐQÓRÐ Rð =‰=Ð  à%ˆDŒMØ ×4Ñ4ˆDŒMð 8‰8Ð Ø—(‘(ˆCäy &¨$Ó/°3Ò6¼:ÀcÌ6Ô;Rð
—}‘}Ð0Ð0Ð0Ø—=‘=Ð,Ø&*§m¡m×&;Ñ&;Ó&=OØ"&§-¡-×"4Ñ"4°_Ó"EKØ$×)Ñ)¨#¯)©)Ó4‘BàŸ™×+Ñ+¨C¯I©IÓ6‘Bà˜cŸn™nÑ,Ü"Ð%6°s°e¸=Ð#IÓJÐJܘ3˜s™8¨#Ô.‘𗑘tŸy™yÓ)ˆB؏z‰zÐ%ØŸ
™
ô˜b¤*Ô-Ø×0Ñ0°Ó7Eܘr×3Ñ3°EÓ:ÀÇÁÈ%ÁÔQ‘Bð Q¨¯© LÑ0Ü(¨:°e°W¸MÐ)JÓKÐKð04ˆØ IŠI™ r×'AÒ'Að24·±×1AÑ1AØ ¨gð2Bó2ð ˆGdÔ.𗑘Ó!ˆBØ—(‘(˜7¨¯©(Ó3ˆCð #ˆÔ؈ŒØB˜ÐÐr:có¬—tjt|«j›dtt «¬«|j }|€ td«‚|S)NzS.ax is deprecated and will be removed in a future version. Use Resampler.ax insteadr<z1_set_grouper must be called before ax is accessed)r@rAr>Ú__name__rBr r(r[)rHr`s  r9rkz
Grouper.axŸsT€ô     ‰ ܐD‹z×"Ñ"Ð#ð$7ð 7ä Ü'Ó)õ        
ð —‘ˆØ ˆ=ÜÐPÓQÐ Q؈ r:cóŽ—tjt|«j›dtt «¬«|j S)Nz^.indexer is deprecated and will be removed in a future version. Use Resampler.indexer instead.r<)r@rAr>rnrBr rD©rHs r9rlzGrouper.indexer­sC€ô     ‰ ܐD‹z×"Ñ"Ð#ð$Bð Bä Ü'Ó)õ        
ð ×'Ñ'Ð'r:cóŽ—tjt|«j›dtt «¬«|j S)NzX.obj is deprecated and will be removed in a future version. Use GroupBy.indexer instead.r<)r@rAr>rnrBr rErps r9rNz Grouper.obj¸sC€ô
     ‰ ܐD‹z×"Ñ"Ð#ð$@ð @ä Ü'Ó)õ        
ð ×#Ñ#Ð#r:cóŽ—tjt|«j›dtt «¬«|j S)Nz\.grouper is deprecated and will be removed in a future version. Use GroupBy.grouper instead.r<)r@rAr>rnrBr rCrps r9rPzGrouper.grouperÅsC€ô     ‰ ܐD‹z×"Ñ"Ð#ð$@ð @ä Ü'Ó)õ        
ð ×'Ñ'Ð'r:có¢—tjt|«j›dtt «¬«|j jS)NzZ.groups is deprecated and will be removed in a future version. Use GroupBy.groups instead.r<)r@rAr>rnrBr rCÚgroupsrps r9rtzGrouper.groupsÐsG€ô     ‰ ܐD‹z×"Ñ"Ð#ð$?ð ?ä Ü'Ó)õ        
ð×'Ñ'×.Ñ.Ð.r:c󊇗ˆfd„‰jD«}dj|«}t‰«j}|›d|›dS)Nc    3ój•K—|]*}t‰|«|›dtt‰|««›–—Œ,y­w)Nú=)r\Úrepr)Ú.0Ú    attr_namerHs  €r9ú    <genexpr>z#Grouper.__repr__.<locals>.<genexpr>Þs>øèø€ò
àܐt˜YÓ'Ð3ðˆk˜œ4¤¨¨iÓ 8Ó9Ð:Ô ;ñ
ùsƒ03z, ú(ú))r.Újoinr>rn)rHÚ
attrs_listÚattrsÚcls_names`   r9Ú__repr__zGrouper.__repr__ÜsJø€ó
à!×-Ñ-ô
ˆ
ð
—    ‘    ˜*Ó%ˆÜ˜“:×&Ñ&ˆØ˜1˜U˜G 1Ð%Ð%r:)r-zAxis | lib.NoDefaultr%r$r&r$ÚreturnÚNone)T)rNrrKr$rƒz tuple[ops.BaseGrouper, NDFrameT])F)rNrr%r$rRr'rƒz3tuple[NDFrameT, Index, npt.NDArray[np.intp] | None]©rƒr©rƒÚstr)rnÚ
__module__Ú __qualname__Ú__doc__Ú__annotations__r.r4rr?rIrQrLrÚpropertyrkrlrNrPrtr‚Ú __classcell__)r8s@r9r#r#Bssø…ñrðh ƒJØ ƒLØÓØÓà#U€KÓUô$ð ØØ Ø%(§^¡^ØØð%:ð
#ð %:ð ð %:ðð%:ð
ó%:ðP/3ðØðØ'+ðà    )óð@+0ðR ØNRñR ØðR Ø#'ðR Ø?KðR à    <óR ðh Ø ò
óó ð
ð Ø ñ(óó ð(ð Ø ñ    $óó ð    $ð Ø ñ(óó ð(ð Ø ñ/óó ð/ð ò&ó ô&r:r#có‚—eZdZUdZdZded<ded<ded<d    ed
<                                d                                                            dd „Zdd „Zdd „Ze    d d„«Z
e    d!d„«Z e    d"d„«Z e d#d„«Ze    d$d„«Ze d%d„«Ze    d&d„«Ze d&d„«Ze    d'd„«Ze d'd„«Ze    d'd„«Ze d'd„«Ze    d(d„«Ze    d)d„«Zy)*ÚGroupingah
    Holds the grouping information for a single key
 
    Parameters
    ----------
    index : Index
    grouper :
    obj : DataFrame or Series
    name : Label
    level :
    observed : bool, default False
        If we are a Categorical, use the observed values
    in_axis : if the Grouping is a column in self.obj and hence among
        Groupby.exclusions list
    dropna : bool, default True
        Whether to drop NA groups.
    uniques : Array-like, optional
        When specified, will be used for unique values. Enables including empty groups
        in the result for a BinGrouper. Must not contain duplicates.
 
    Attributes
    -------
    indices : dict
        Mapping of {group -> index_list}
    codes : ndarray
        Group codes
    group_index : Index or None
        unique groups
    groups : dict
        Mapping of {group -> label_list}
    Nz$npt.NDArray[np.signedinteger] | NoneÚ_codeszCategorical | NoneÚ _all_grouperr'Ú
_orig_catsrÚ_indexc
ó—||_||_t||«}
d|_d|_||_||_||_||_||_    ||_
|    |_ |j} | ?t|t«r|j| «} n|} |
€| }
n^|
} | j!| «}
nIt|
t"«r|j€J‚|
j%|jd¬«\}}||_t|t&j(«r|}
nç|j*dj,}t/||j0j2¬«}
n¬t|
t4t.t6t8j:f«s‚t=|
dd«dk7r#t?tA|
««}tCd|›d«‚|j!|
«}
tE|
d    «rtG|
«tG|«k(stI|
«}d
|›}tK|«‚t|
t8j:«r9|
jLjNd vrbt5|
«jQ«}
|
|_ytt=|
d d«tR«r&|
jT|_tW|
||«\}
|_|
|_y) NF©rKrrUÚndiméú Grouper for 'ú' not 1-dimensionalÚ__len__z9Grouper result violates len(labels) == len(data)
result: ÚmMÚdtype),r+Ú _orig_grouperÚ_convert_grouperr‘r’r“Ú_sortrNÚ    _observedÚin_axisÚ_dropnaÚ_uniquesÚ_ilevelr]rÚget_level_valuesÚmapr#rQrÚ
BinGrouperÚ    groupingsÚgrouping_vectorrÚ result_indexrTrrÚnpÚndarrayr\r‡r>r[ÚhasattrÚlenrÚAssertionErrorrœrXÚto_numpyrÚ
categoriesr)rHr`rPrNr+r%Úobservedr¡r&Úuniquesr©ÚilevelÚ index_levelÚmapperÚ
newgrouperÚnewobjÚngÚtÚgrperÚerrmsgs                    r9rIzGrouping.__init__sf€ðˆŒ
Ø$ˆÔÜ*¨5°'Ó:ˆØ ˆÔ؈ŒØˆŒ ؈Œ
؈ŒØ!ˆŒØˆŒ ؈Œ ؈Œ ð
—‘ˆØ Ð ô˜%¤Ô,Ø#×4Ñ4°VÓ<‘ à# àÐ&Ø"-’à(Ø"-§/¡/°&Ó"9’ô˜¬Ô 1ð
—8‘8Ð'Ð 'Ð'Ø!0×!=Ñ!=¸d¿h¹hÐQVÐ!=Ó!WÑ ˆJ˜ØˆDŒHä˜*¤c§n¡nÔ5ð#-‘ð  ×)Ñ)¨!Ñ,×<Ñ<ä"'¨°×1HÑ1H×1MÑ1MÔ"N‘äØ œf¤e¬^¼R¿Z¹ZÐHô
ô¨°Ó2°aÒ7Üœ˜_Ó-Ó.Ü  =°°Ð3FÐ!GÓHÐHà#Ÿi™i¨Ó8ˆOô˜¨Ô3ܘÓ(¬C°«JÒ6ä$ _Ó5ð*Ø*/¨ð2ðô% VÓ,Ð,ä o¤r§z¡zÔ 2Ø×$Ñ$×)Ñ)¨TÑ1ô
#)¨Ó"9×"BÑ"BÓ"Dð /ˆÕôœ °¸$Ó?ÔAQÔ Rà-×8Ñ8ˆDŒOÜ1CØ  xó2Ñ .ˆO˜TÔ.ð /ˆÕr:có"—d|j›dS)Nz    Grouping(r}rUrps r9r‚zGrouping.__repr__xs€Ø˜4Ÿ9™9˜+ QÐ'Ð'r:có,—t|j«S©N)ÚiterÚindicesrps r9Ú__iter__zGrouping.__iter__{s€ÜD—L‘LÓ!Ð!r:cóP—t|jdd«}t|t«S)Nrœ)r\r©r]r)rHrœs  r9Ú_passed_categoricalzGrouping._passed_categorical~s$€ä˜×,Ñ,¨g°tÓ<ˆÜ˜%Ô!1Ó2Ð2r:có¦—|j}||jj|St|jt
t f«r|jjSt|jtj«r |jjjSt|jt
«r|jjSyr¿) r¤r“rfr]rrrrTr©rÚ BaseGrouperrª)rHr´s  r9rTz Grouping.nameƒsŸ€à—‘ˆØ Ð Ø—;‘;×$Ñ$ VÑ,Ð ,ä d×(Ñ(¬5´&¨/Ô :Ø×%Ñ%×*Ñ*Ð *ä ˜×,Ñ,¬c¯o©oÔ >Ø×'Ñ'×4Ñ4×9Ñ9Ð 9ä ˜×,Ñ,¬eÔ 4Ø×'Ñ'×,Ñ,Ð ,ðr:có̗|j}|€yt|t«sD|j}||jvrt d|›d«‚|jj |«S|S)zS
        If necessary, converted index level name to index level position.
        NzLevel z  not in index)r+r]Úintr“rfr¯r`)rHr+r`s   r9r¤zGrouping._ilevel•sb€ð
—
‘
ˆØ ˆ=ØÜ˜%¤Ô%Ø—K‘KˆEؘEŸK™KÑ'Ü$ v¨e¨W°MÐ%BÓCÐCØ—;‘;×$Ñ$ UÓ+Ð +؈ r:có,—t|j«Sr¿)r®Ú _group_indexrps r9ÚngroupszGrouping.ngroups¤s€ä4×$Ñ$Ó%Ð%r:cóÀ—t|jtj«r|jjSt |j«}|j «Sr¿)r]r©rrÆrÁrÚ_reverse_indexer)rHÚvaluess  r9rÁzGrouping.indices¨sI€ô d×*Ñ*¬C¯O©OÔ <Ø×'Ñ'×/Ñ/Ð /ä˜T×1Ñ1Ó2ˆØ×&Ñ&Ó(Ð(r:có —|jdS)Nr)Ú_codes_and_uniquesrps r9ÚcodeszGrouping.codes±s€à×&Ñ& qÑ)Ð)r:có¨—|j|jjS|jr|jjS|j
dS)úv
        Analogous to result_index, but holding an ArrayLike to ensure
        we can retain ExtensionDtypes.
        r—)r‘Ú _result_indexÚ_valuesrÄrÊrÐrps r9Ú_group_arraylikezGrouping._group_arraylikeµsN€ð × Ñ Ð (à×%Ñ%×-Ñ-Ð -à × %Ò %Ø×$Ñ$×,Ñ,Ð ,à×&Ñ& qÑ)Ð)r:cób—tjdtt«¬«|jS)rÓzOgroup_arraylike is deprecated and will be removed in a future version of pandas©Úcategoryr=)r@rArBr rÖrps r9Úgroup_arraylikezGrouping.group_arraylikeÄs,€ô      ‰ ð  ä"Ü'Ó)õ        
ð ×$Ñ$Ð$r:có¨—|j;|j}t|t«sJ‚|j}|j |«S|jSr¿)r‘rÊr]rr’Úset_categories)rHÚ    group_idxÚcatss   r9rÔzGrouping._result_indexÒsR€ð × Ñ Ð (Ø×)Ñ)ˆIܘiÔ)9Ô:Ð :Ð:Ø—?‘?ˆDà×+Ñ+¨DÓ1Ð 1Ø× Ñ Ð r:cób—tjdtt«¬«|jS)NzLresult_index is deprecated and will be removed in a future version of pandasrØ)r@rArBr rÔrps r9rªzGrouping.result_indexÞs*€ä ‰ ð  ä"Ü'Ó)õ        
ð ×!Ñ!Ð!r:cóê—|j\}}|js7|jr*t|t«sJ‚|j
r^|t |«k(j«rBt    jtj|jdg«|jd¬«}n®t |«dkDr |j}|jdkj«}|j|dkretj |jd|«}tj"|j|d«}t    j||jd¬«}t%j&||j(¬«S)NéÿÿÿÿFr•rrU)rÐr¢rÄr]rrŸr®ÚanyÚ
from_codesr«ÚappendrÑr±r©ÚargmaxrÚ nunique_intsÚinsertrÚ _with_inferrT)rHrÑr³ÚcatÚna_idxÚ na_unique_idxÚ    new_codess       r9rÊzGrouping._group_indexès €à×0Ñ0‰ˆˆw؏|‹| × 8Ó 8ܘg¤{Ô3Ð 3Ð3؏zŠz˜u¬¨G« Ñ4×9Ñ9Ô;ä%×0Ñ0Ü—I‘I˜gŸm™m¨b¨TÓ2°G×4FÑ4FÐQVô‘ôU“˜a’à×*Ñ*ØŸ)™) a™-×/Ñ/Ó1Ø—9‘9˜VÑ$ qÒ(ä$.×$;Ñ$;¸C¿I¹IÀgÀvÐ<NÓ$OMÜ "§    ¡    ¨'¯-©-¸ÈÓ KIÜ)×4Ñ4Ø! 7×#5Ñ#5ÀôGô× Ñ  ¨t¯y©yÔ9Ð9r:cób—tjdtt«¬«|jS)NzKgroup_index is deprecated and will be removed in a future version of pandasrØ)r@rArBr rÊrps r9Ú group_indexzGrouping.group_indexÿs*€ä ‰ ð  ä"Ü'Ó)õ        
ð נѠРr:có—|jr–|j}|j}|jrIt    j
|j «}||dk7}|jr4tj|«}ntjt|««}tj|||jd¬«}|j }|js¥|dk}tj |«r‹|jr#t|«}tj"|||«}n\|j%«}t    j&|d|«}tj"||k\|dz|«}tj"|||«}|js|j)|j*«}||fSt-|jt.j0«r:|jj2}|jj4j6}||fS|j8=t|j|j8¬«}|j }|j8}||fSt    j:|j|j|j¬«\}}||fS)NráF)rÑr±ÚorderedrKrr—)r±)r%Úuse_na_sentinel)rÄr©r±r rÚunique1drÑrŸr«r%Úaranger®rrãrðr¢râÚwhereråræÚreorder_categoriesr’r]rrÆÚ
codes_inforªrÕr£Ú    factorize)    rHrér±Úucodesr³rÑÚna_maskÚna_coderês             r9rÐzGrouping._codes_and_uniques    s€ð × #Ó #ð×&Ñ&ˆCØŸ™ˆJà~Š~Ü#×,Ñ,¨S¯Y©YÓ7Ø ¨"¡ Ñ-Ø—:’:ÜŸW™W V›_‘F䟙¤3 z£?Ó3ä!×,Ñ,ب¸S¿[¹[ÐSXôˆGð—I‘IˆEØ—<’<Ø !™)Ü—6‘6˜'”?Ø—z’zä"% j£/˜Ü "§¡¨°'¸5Ó A™ð")§¡Ó!1˜ä",×"9Ñ"9¸%ÀÀ¸.Ó"I˜Ü "§¡¨°'Ñ)9¸5À1¹9ÀeÓ L˜Ü "§¡¨°'¸5Ó A˜à—>’>Ø!×4Ñ4°T·_±_ÓEà˜'>Ð !ä ˜×,Ñ,¬c¯o©oÔ >à×(Ñ(×3Ñ3ˆEØ×*Ñ*×7Ñ7×?Ñ?ˆGðgˆ~Ðð]‰]Ð &ô˜d×2Ñ2¸t¿}¹}ÔMˆCØ—I‘IˆEØ—m‘mˆGðgˆ~Ðô(×1Ñ1Ø×$Ñ$¨4¯:©:ÀtÇ|Á|ô‰NˆE7ðgˆ~Ðr:có—tj|j|jd¬«}|jj |«S)NFr•)rrãrÑrÊr“Úgroupby)rHrÞs  r9rtzGrouping.groupsHs5€ä×%Ñ% d§j¡j°$×2CÑ2CÈeÔTˆØ{‰{×"Ñ" 4Ó(Ð(r:)NNNTFFTN)r`rrNzNDFrame | Noner%r$r²r$r¡r$r&r$r³zArrayLike | Nonerƒr„r†)rƒr©rƒr$)rƒr)rƒz
int | None)rƒrÈ)rƒz$dict[Hashable, npt.NDArray[np.intp]])rƒznpt.NDArray[np.signedinteger])rƒrr…)rƒz/tuple[npt.NDArray[np.signedinteger], ArrayLike])rƒzdict[Hashable, np.ndarray])rnrˆr‰rŠrr‹rIr‚rÂr rÄrTr¤rŒrËrÁrÑrÖrÚrÔrªrÊrîrÐrt©r:r9rrèsÀ…ñð@48€FÐ 0Ó7Ø$Ó$ØÓØ ƒMð
Ø"ØØØØØØ$(ðg/àðg/ðð    g/ð ð g/ððg/ððg/ððg/ð"ðg/ð
óg/óR(ó"ðò3óð3ðòóðð"ò óð ðò&óð&ðò)óð)ðò*óð*ðò *óð *ðò %óð %ðò    !óð    !ðò"óð"ðò:óð:ð,ò!óð!ðò<óð<ð|ò)óñ)r:rc ó.    ‡—‰j|«}|òt|t«r?t|«rt    |«dk(r|d}|€Ât |«r·|j |«}d}n£t|«r1t    |«}    |    dk(r|d}n|    dk(r td«‚td«‚t|t«r>‰j|«j|k7r5td|›d‰j|«›«‚|dkDs|dkr td    «‚d}|}t|t«rH|j‰d
¬ «\}
Š|j€ |
t«‰fS|
t|jh«‰fSt|tj «r |t«‰fSt|t"«s|g} d
} n|} t    | «t    |«k(} t%d „| D««} t%d „| D««}t%d„| D««}| sk|si|sg| re|€ct‰t&«rt)ˆfd„| D««}n&t‰t*«sJ‚t)ˆfd„| D««}|st-j.| «g} t|t0t"f«r|€dgt    |«z} |}n|gt    | «z}g}t3«}dˆfd„ }dˆfd„ }t5| |«D]<\}}t‰t&«r&||«rd}|j7|j«nÊ||«r†‰j8dk7rR|‰vrN|r‰j;||¬«d|‰|}}}|j8dk7rtd|›d«‚|j7|«na‰j=||¬«rd
|d}}}nGt?|«‚t|t«r*|j|j7|j«d}nd
}t|t@«stA||‰|||||¬«n|}|jC|«Œ?t    |«dk(rt    ‰«r td«‚t    |«dk(rI|jCtAtEgd¬«tGjHgtFjJ¬«««tj ||||¬«}
|
t|«‰fS)aã
    Create and return a BaseGrouper, which is an internal
    mapping of how to create the grouper indexers.
    This may be composed of multiple Grouping objects, indicating
    multiple groupers
 
    Groupers are ultimately index mappings. They can originate as:
    index mappings, keys to columns, functions, or Groupers
 
    Groupers enable local references to axis,level,sort, while
    the passed in axis, level, and sort are 'global'.
 
    This routine tries to figure out what the passing in references
    are and then creates a Grouping for each one, combined into
    a BaseGrouper.
 
    If observed & we have a categorical grouper, only show the observed
    values.
 
    If validate, then check for key/level overlaps.
 
    Nr—rzNo group keys passed!z*multiple levels only valid with MultiIndexz level name z is not the name of the ráz2level > 0 or level < -1 only valid with MultiIndexFr•c3óVK—|]!}t|«xst|t«–—Œ#y­wr¿)Úcallabler]Údict©ryÚgs  r9r{zget_grouper.<locals>.<genexpr>³s#èø€ÒH¸a”x “{Ò9¤j°´DÓ&9Ó9ÑHùs‚')c3óHK—|]}t|ttf«–—Œy­wr¿)r]r#rrs  r9r{zget_grouper.<locals>.<genexpr>´sèø€ÒH¸a”z !¤g¬xÐ%8×9ÑHùs‚ "c    3ózK—|]3}t|ttttt
j f«–—Œ5y­wr¿)r]ÚlistÚtuplerrr«r¬rs  r9r{zget_grouper.<locals>.<genexpr>µs+èø€òØDEŒ
1”tœU¤F¬E´2·:±:Ð>×?ñùs‚9;c3ón•K—|],}|‰jvxs|‰jjv–—Œ.y­wr¿)Úcolumnsr`rf©ryrrNs  €r9r{zget_grouper.<locals>.<genexpr>Âs4øèø€ò'Ø=>S—[‘[РÒ8 A¨¯©¯©Ð$8Ó8ñ'ùsƒ25c3óN•K—|]}|‰jjv–—Œy­wr¿)r`rfr s  €r9r{zget_grouper.<locals>.<genexpr>Çsøèø€Ò&JÀ q¨C¯I©I¯O©OÔ';Ñ&Jùsƒ"%có´•—t|«s2‰jdk(ry‰jd}    |j|«yy#tt
t f$rYywxYw)Nr—FráT)Ú_is_label_liker–ÚaxesÚget_locrbÚ    TypeErrorr
)r*ÚitemsrNs  €r9Ú
is_in_axiszget_grouper.<locals>.is_in_axis×sZø€Ü˜cÔ"؏x‰x˜1Š}Øð—H‘H˜R‘LˆEð Ø— ‘ ˜cÔ"ñ
øô    œiÔ):Ð;ò áð ús­AÁAÁAcó”•—t|d«syt«s
t«rW    ‰|j}t|t«r6t|t«r&|jj|jd«Sy    |‰|juS#tt
t tf$rYywxYw#tt
t tf$rYywxYw)NrTFr) r­rrrTrbÚ
IndexErrorr
r    r]rÚ_mgrÚreferences_same_values)ÚgprÚobj_gpr_columnrNs  €r9Ú    is_in_objzget_grouper.<locals>.is_in_objçsÁø€Üs˜FÔ#ØÜ Ô  Ô$6Ô$8ð Ø!$ S§X¡X¡ô˜#œvÔ&¬:°nÄfÔ+MØ—x‘x×6Ñ6Ø"×'Ñ'¨óððð        Ø˜#˜cŸh™h™-Ð'Ð 'øôœjÔ*;Ô=PÐQò Ùð ûôœ*Ô&7Ô9LÐMò    ñð    ús#¤B Á;B+ B(Â'B(Â+CÃCTrZr˜r™)rNr+r%r²r¡r&rÈ)rœ)r%r&rý)&rcr]rr r®rr¥r[r‡rTÚ_get_axis_namer#rQr*Ú    frozensetrrÆrrârÚallrÚcomÚasarray_tuplesaferÚsetÚzipÚaddr–Ú_check_label_or_level_ambiguityÚ_is_level_referencerbrrärr«rhÚintp)rNr*r-r+r%r²rKr&Ú
group_axisÚnlevelsrPÚkeysÚmatch_axis_lengthÚ any_callableÚ any_groupersÚ any_arraylikeÚall_in_columns_indexÚlevelsr¨Ú
exclusionsrrrr¡rTÚpings`                         r9rMrMNsƒø€ð@—‘˜tÓ$€Jð Ðô j¤*Ô -ܘEÔ"¤s¨5£z°Q¢Ø˜a™àˆ{œy¨Ô/à ×1Ñ1°%Ó8Ø‘ô ˜EÔ"ܘe›*Ø˜a’<Ø! !™H‘EØ ’\Ü$Ð%<Ó=Ð=ä$Ð%QÓRÐRä˜%¤Ô%Ø—=‘= Ó&×+Ñ+¨uÒ4Ü$Ø% e Wð-"Ø"%×"4Ñ"4°TÓ":Ð!;ð=óð𘒘e bšjÜ Ð!UÓVÐVðˆE؈Cô#”wÔØ×'Ñ'¨°eÐ'Ó<‰ ˆØ 7‰7ˆ?ØœI›K¨Ð,Ð ,àœI s§w¡w iÓ0°#Ð5Ð 5ô
CœŸ™Ô    )Ø”I“K Ð$Ð$ä cœ4Ô  ØˆuˆØ!ÑàˆÜ ›I¬¨Z«Ñ8ÐôÑHÀ4ÔHÓH€LÜÑHÀ4ÔHÓH€LÜñØIMôó€Mñ ÙÙÙ Ø ˆMä cœ9Ô %Ü#&ó'ØBFô'ó$Ñ  ô˜c¤6Ô*Ð *Ð*Ü#&Ó&JÀTÔ&JÓ#JÐ  á#Ü×)Ñ)¨$Ó/Ð0ˆDä%œ%¤˜Ô'Ø ˆ;ؐ6œC ›JÑ&ˆDØ‰àœ3˜t›9Ñ$ˆà "€IÜ #£€Jõ õ ô4˜$ Ó'ó+‰
ˆˆUÜ cœ9Ô %©)°C¬.؈GØ N‰N˜3Ÿ8™8Õ $á ˜Œ_؏x‰x˜1Š} ¨¡ÙØ×7Ñ7¸À$Ð7ÔGØ%)¨3°°C±˜s˜Ø—8‘8˜q’=ô% }°T°FÐ:MÐ%NÓOÐOØ—‘˜tÕ$Ø×(Ñ(¨°4Ð(Ô8Ø&+¨S°$ ˜‘ä˜s“mÐ#Ü ˜œWÔ %¨#¯'©'Ð*=à N‰N˜3Ÿ7™7Ô #؉GàˆGô˜c¤8Ô,ô ØØØØØØ!ØØõ     ðð     ð    ×јÖðW+ôZ ˆ9ƒ~˜Òœs 3œxÜÐ0Ó1Ð1Ü
ˆ9ƒ~˜ÒØ×Ñœ¤%¨°%Ô"8¼"¿(¹(À2ÌRÏWÉWÔ:UÓVÔWôo‰o˜j¨)¸$ÀvÔN€GØ ”I˜jÓ)¨3Ð .Ð.r:cóT—t|ttf«xs|duxr t|«Sr¿)r]r‡rr)Úvals r9rr8s%€Ü cœC¤˜<Ó (Ò P¨S¸¨_Ò-OÄÈ3ÃÐPr:có—t|t«r |jSt|t«rB|jj |«r |j S|j|«j St|t«r |j St|tttttjf«rOt|«t|«k7r t!d«‚t|ttf«rt#j$|«}|S|S)Nz$Grouper and axis must be same length)r]rr1rr`ÚequalsrÕÚreindexrrrrrr«r¬r®r[rr)r-rPs  r9ržrž<s€Ü'œ4Ԡ؏{‰{ÐÜ    GœVÔ    $Ø =‰=× Ñ  Ô %Ø—?‘?Ð "à—?‘? 4Ó(×0Ñ0Ð 0Ü    GœZÔ    (؏‰ÐÜ    Gœd¤E¬5´+¼r¿z¹zÐJÔ    KÜ ˆw‹<œ3˜t›9Ò $ÜÐCÓDÐ Dä g¤¤e˜}Ô -Ü×+Ñ+¨GÓ4ˆG؈àˆr:)NrNTFTT)rNrr-rr%r$r²r$rKr$r&r$rƒz5tuple[ops.BaseGrouper, frozenset[Hashable], NDFrameT]rý)r-r)ArŠÚ
__future__rÚtypingrrr@Únumpyr«Úpandas._configrrÚ pandas._libsrÚpandas._libs.tslibsr    Ú pandas.errorsr
Úpandas.util._decoratorsr Úpandas.util._exceptionsr Úpandas.core.dtypes.commonr rÚpandas.core.dtypes.dtypesrÚ pandas.corerÚpandas.core.arraysrrÚpandas.core.commonÚcoreÚcommonrÚpandas.core.framerÚpandas.core.groupbyrÚpandas.core.groupby.categoricalrÚpandas.core.indexes.apirrrÚpandas.core.seriesrÚpandas.io.formats.printingrÚcollections.abcrrÚpandas._typingrrrr Úpandas.core.genericr!r#rrMrržrþr:r9ú<module>rOsðñõ#÷óã÷õ
Ý3Ý+Ý2Ý4÷õ7å"÷÷!РÝ'Ý#Ý>÷ñõ
&å3á÷÷
óõ,÷c&ñc&ðL ÷b)ðb)óðb)ðN      ØØ
ØØØØðg/Ø    ðg/ð ðg/ð
ð g/ð ð g/ððg/ð ðg/ð;óg/óTQôr: