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
U
¬ý°dtšã @sºdZddlmZddlmZmZddlZddlmZm    Z    m
Z
ddl Z ddl mZddlmZmZmZddlmZmZmZmZdd    lmZmZmZmZdd
lmZdd lm Z m!Z!dd l"m#Z#dd l$m%Z%m&Z&m'Z'm(Z(m)Z)ddl*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7ddl8m9Z9ddl:m;Z;ddl<m=Z=ddl>m?Z?m@Z@ddlAmBmCZDddlEmFZFddlGmBmHmIZJddlGmKZKmLZLmMZMmNZNddlOmPZPmQZQddlRmSZSmTZTddlUmVZVddlWmXZXmYZYeZeJj[ƒZ[e[ \ddde ]d¡dœ¡dd„Z^dd „Z_d!d"„Z`e e@d#dd$e[d%d&d'd(e ]d)¡d*œƒeTd+d,ge?d-d.eTd/d0d1d2d3d4d5d6ge?ƒeTd7d8ge?d-d9Gd:d„deSƒƒƒƒƒZad;d<œd=d>„Zbd;d<œd?d@„ZcdGdBdCddDœdEdF„ZddS)Hz define the IntervalIndex é)Ú annotations)ÚleÚltN)ÚAnyÚHashableÚLiteral)Úlib)ÚIntervalÚ IntervalMixinÚ IntervalTree)Ú
BaseOffsetÚ    TimedeltaÚ    TimestampÚ    to_offset)ÚDtypeÚDtypeObjÚIntervalClosedTypeÚnpt)ÚInvalidIndexError)ÚAppenderÚcache_readonly)Úrewrite_exception)Úfind_common_typeÚinfer_dtype_from_scalarÚmaybe_box_datetimelikeÚmaybe_downcast_numericÚmaybe_upcast_numeric_to_64bit) Úensure_platform_intÚis_datetime64tz_dtypeÚis_datetime_or_timedelta_dtypeÚis_dtype_equalÚis_floatÚis_float_dtypeÚ
is_integerÚis_integer_dtypeÚis_interval_dtypeÚ is_list_likeÚ    is_numberÚis_object_dtypeÚ    is_scalar)Ú IntervalDtype)Úis_valid_na_for_dtype©Úunique)Ú IntervalArrayÚ_interval_shared_docs)Úis_valid_positional_slice)ÚIndexÚ_index_shared_docsÚ ensure_indexÚmaybe_extract_name)Ú DatetimeIndexÚ
date_range)ÚExtensionIndexÚ inherit_names)Ú
MultiIndex)ÚTimedeltaIndexÚtimedelta_rangeÚ IntervalIndexz"IntervalIndex or list of IntervalszX         name : object, optional
              Name to be stored in the index.
         )ÚklassÚqualnameZ target_klassÚnamecCs‚t|dt|ƒƒ}t|ttfƒr"d}t|ƒs2t|ƒrB|t dd¡St    |ƒrR|dSt
|ƒrht  |tj ¡St dtt|ƒƒ›ƒ‚dS©NÚdtypeÚ
datetime64éÚnsz%cannot determine next label for type ©ÚgetattrÚtypeÚ
isinstancerr rrÚnpÚ timedelta64r$r"Z    nextafterZinftyÚ    TypeErrorÚrepr©ÚlabelrA©rOúSd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\pandas/core/indexes/interval.pyÚ_get_next_labelpsrQcCs„t|dt|ƒƒ}t|ttfƒr"d}t|ƒs2t|ƒrB|t dd¡St    |ƒrR|dSt
|ƒrjt  |tj ¡St dtt|ƒƒ›ƒ‚dSr@rErMrOrOrPÚ_get_prev_label~srRcCs |jf|ŽS)zv
    This is called upon unpickling, rather than the default which doesn't have
    arguments and breaks __new__.
    )Ú from_arrays)ÚclsÚdrOrOrPÚ_new_IntervalIndexŒsrVÚclassz>Immutable index of intervals that are closed on the same side.r?z0.20.0zis_overlapping
values
Úa7    Examples
    --------
    A new ``IntervalIndex`` is typically constructed using
    :func:`interval_range`:
 
    >>> pd.interval_range(start=0, end=5)
    IntervalIndex([(0, 1], (1, 2], (2, 3], (3, 4], (4, 5]],
                  dtype='interval[int64, right]')
 
    It may also be constructed using one of the constructor
    methods: :meth:`IntervalIndex.from_arrays`,
    :meth:`IntervalIndex.from_breaks`, and :meth:`IntervalIndex.from_tuples`.
 
    See further examples in the doc strings of ``interval_range`` and the
    mentioned constructor methods.
    )r=Úsummaryr?Z versionaddedZextra_attributesZ extra_methodsÚexamplesZ
set_closedZ    to_tuplesT)ÚwrapZ    __array__ÚoverlapsÚcontainsÚ closed_leftÚ closed_rightÚ    open_leftÚ
open_rightZis_emptyÚis_non_overlapping_monotonicÚclosed)Úcachec    s‚eZdZUdZded<ded<ded<ded<ded<ded    <d
ed <d
ed <d ZeZdŒddddddœdd„Ze    e
e dde   d¡e   d¡dœƒdddddddœdd„ƒƒZe    e
e dde   d¡e   d¡dœƒdŽddddddœd d!„ƒƒZe    e
e d"de   d¡e   d#¡dœƒdddddddœd$d%„ƒƒZed&d'œd(d)„ƒZd*dd+œd,d-„Zed.d'œd/d0„ƒZd1d2„Zed3d'œd4d5„ƒZe
ejjƒddd6d7œd8d9„ƒZedd'œd:d;„ƒZedd'œd<d=„ƒZedd'œd>d?„ƒZdd'œd@dA„ZdBdC„Zd‘dEdFœdGdH„Z dId'œdJdK„Z!d’dLdMdNdOdPdQœdRdS„Z"e
e#dTe$ƒdLdUdVœdWdX„ƒZ%ddPdVœdYdZ„Z&dLdUdVœd[d\„Z'edd'œd]d^„ƒZ(d_Z)d`d3daœ‡fdbdc„ Z*edd'œddde„ƒZ+d3dFœdfdg„Z,dhddiœdjdk„Z-edLd'œdldm„ƒZ.edLd'œdndo„ƒZ/edLd'œdpdq„ƒZ0edLd'œdrds„ƒZ1dtd3dtduœdvdw„Z2dxddyœd3dzd{œ‡fd|d}„Z3d“d3d'œd~d„Z4d€d„Z5ddd‚œdƒd„„Z6ddd‚œd…d†„Z7d‡d'œdˆd‰„Z8dŠd‹„Z9‡Z:S)”r<Z intervalindexrrcÚboolrbr^r_r`rar.Ú_dataZ_valuesFNTz Dtype | Noner)rAÚcopyr?Úverify_integrityÚreturnc    CsBt|||ƒ}td|jƒt|||||d}W5QRX| ||¡S)Nr.)rcrgrArh)r4rÚ__name__r.Ú _simple_new)rTÚdatarcrArgr?rhÚarrayrOrOrPÚ__new__Ôs     ûzIntervalIndex.__new__Ú from_breakszY
             name : str, optional
                  Name of the resulting IntervalIndex.zÇ        Examples
        --------
        >>> pd.IntervalIndex.from_breaks([0, 1, 2, 3])
        IntervalIndex([(0, 1], (1, 2], (2, 3]],
                      dtype='interval[int64, right]')
        )r=r?rZÚrightzIntervalClosedType | None)rcr?rgrAric    Cs8td|jƒtj||||d}W5QRX|j||dS©Nr.)rcrgrA©r?)rrjr.rork)rTÚbreaksrcr?rgrArmrOrOrProêsÿzIntervalIndex.from_breaksrSzÏ        Examples
        --------
        >>> pd.IntervalIndex.from_arrays([0, 1, 2], [1, 2, 3])
        IntervalIndex([(0, 1], (1, 2], (2, 3]],
                      dtype='interval[int64, right]')
        c    Cs:td|jƒtj|||||d}W5QRX|j||dS)Nr.)rgrArr)rrjr.rSrk)rTÚleftrprcr?rgrArmrOrOrPrS sÿzIntervalIndex.from_arraysÚ from_tupleszÄ        Examples
        --------
        >>> pd.IntervalIndex.from_tuples([(0, 1), (1, 2)])
        IntervalIndex([(0, 1], (1, 2]],
                       dtype='interval[int64, right]')
        c    Cs8td|jƒtj||||d}W5QRX|j||dSrq)rrjr.rurk)rTrlrcr?rgrAZarrrOrOrPru1szIntervalIndex.from_tuplesr ©ricCs8| |j¡}t|ƒ}| |j¡}t|ƒ}t|||jdS)N©rc)Ú_maybe_convert_i8rtrrpr rc)ÚselfrtrprOrOrPÚ_engineUs
  zIntervalIndex._enginer)ÚkeyricCsTt|ƒt|tƒs(t||jƒr$|jSdSz| |¡WdStk
rNYdSXdS)zÏ
        return a boolean if this key is IN the index
        We *only* accept an Interval
 
        Parameters
        ----------
        key : Interval
 
        Returns
        -------
        bool
        FTN)ÚhashrHr    r+rAÚhasnansÚget_locÚKeyError)ryr{rOrOrPÚ __contains__^s 
 
zIntervalIndex.__contains__r9cCstj|j|jgddgdS)Nrtrp)Únames)r9rSrtrp©ryrOrOrPÚ _multiindexwszIntervalIndex._multiindexcCs(|j|j|j|jdœ}tt|ƒ|fdfS)N)rtrprcr?)rtrprcr?rVrG)ryrUrOrOrPÚ
__reduce__{s üzIntervalIndex.__reduce__ÚstrcCsdS)z4Return a string of the type inferred from the valuesÚintervalrOr‚rOrOrPÚ inferred_type„szIntervalIndex.inferred_typeÚint)ÚdeepricCs|jj|d|jj|dS)N)r‰)rtÚ memory_usagerp)ryr‰rOrOrPrŠŠszIntervalIndex.memory_usagecCs|ddd…jS)z€
        Return True if the IntervalIndex is monotonic decreasing (only equal or
        decreasing values), else False
        Néÿÿÿÿ)Úis_monotonic_increasingr‚rOrOrPÚis_monotonic_decreasing’sz%IntervalIndex.is_monotonic_decreasingcCs‚|j}|j}| ¡ ¡dkr dS|js,|jr0dStƒ}t |jdd¡d}|D],}||||f}||krrdS|     |¡qPdS)zX
        Return True if the IntervalIndex contains unique elements, else False.
        rCFT)Zkeepr)
rtrpÚisnaÚsumÚ    is_uniqueÚsetrIÚwhereZ
duplicatedÚadd)ryrtrpZ
seen_pairsZ    check_idxÚidxÚpairrOrOrPršs  zIntervalIndex.is_uniquecCs|jjS)a
        Return True if the IntervalIndex has overlapping intervals, else False.
 
        Two intervals overlap if they share a common point, including closed
        endpoints. Intervals that only have an open endpoint in common do not
        overlap.
 
        Returns
        -------
        bool
            Boolean indicating if the IntervalIndex has overlapping intervals.
 
        See Also
        --------
        Interval.overlaps : Check whether two Interval objects overlap.
        IntervalIndex.overlaps : Check an IntervalIndex elementwise for
            overlaps.
 
        Examples
        --------
        >>> index = pd.IntervalIndex.from_tuples([(0, 2), (1, 3), (4, 5)])
        >>> index
        IntervalIndex([(0, 2], (1, 3], (4, 5]],
              dtype='interval[int64, right]')
        >>> index.is_overlapping
        True
 
        Intervals that share closed endpoints overlap:
 
        >>> index = pd.interval_range(0, 3, closed='both')
        >>> index
        IntervalIndex([[0, 1], [1, 2], [2, 3]],
              dtype='interval[int64, both]')
        >>> index.is_overlapping
        True
 
        Intervals that only have an open endpoint in common do not overlap:
 
        >>> index = pd.interval_range(0, 3, closed='left')
        >>> index
        IntervalIndex([[0, 1), [1, 2), [2, 3)],
              dtype='interval[int64, left]')
        >>> index.is_overlapping
        False
        )rzÚis_overlappingr‚rOrOrPr–²s0zIntervalIndex.is_overlappingcCs4t|ƒst|tƒr| |j¡Sttttf}t||ƒS)a    
        Check if a given key needs i8 conversion. Conversion is necessary for
        Timestamp, Timedelta, DatetimeIndex, and TimedeltaIndex keys. An
        Interval-like requires conversion if its endpoints are one of the
        aforementioned types.
 
        Assumes that any list-like data has already been cast to an Index.
 
        Parameters
        ----------
        key : scalar or Index-like
            The key that should be checked for i8 conversion
 
        Returns
        -------
        bool
        )    r%rHr    Ú_needs_i8_conversionrtrr r5r:)ryr{Zi8_typesrOrOrPr—äs  z"IntervalIndex._needs_i8_conversionc    Cst|ƒrt|ƒ}t|ƒ}| |¡s&|St|ƒ}t|ƒs@t|tƒrv| |j    ¡}| |j
¡}|r`tnt j }||||j dS|rÌt|dd\}}t |¡rœ|j}qòt|tƒr®|j}qòt|tjtjfƒrò| d¡}n&|jt|jƒ}}|jrò| |j¡}|jj}t||ƒst d|›d|›ƒ‚|S)a
        Maybe convert a given key to its equivalent i8 value(s). Used as a
        preprocessing step prior to IntervalTree queries (self._engine), which
        expects numeric data.
 
        Parameters
        ----------
        key : scalar or list-like
            The key that should maybe be converted to i8.
 
        Returns
        -------
        scalar or list-like
            The original key if no conversion occurred, int if converted scalar,
            Index with an int64 dtype if converted list-like.
        rwT)Z pandas_dtypeÚi8z)Cannot index an IntervalIndex of subtype z with values of dtype )!r&r3rr—r)r%rHr    rxrtrpr<rSrcrrZ    is_periodZordinalrÚ_valuerIrBrJÚviewrAr1Zasi8r}r’Z_isnanÚsubtyper Ú
ValueError)    ryr{ZscalarrtrpÚ constructorZ    key_dtypeZkey_i8r›rOrOrPrxüs@
  ÿ
 
  ÿzIntervalIndex._maybe_convert_i8rtzLiteral[('left', 'right')])ÚsidecCsz|jstdƒ‚t|ttfƒr$tdƒ‚|dkr4|jjsD|dkrZ|jjsZ|j}|j    rnt
|ƒ}n|j}|j rnt |ƒ}|  ||¡S)Nzrcan only get slices from an IntervalIndex if bounds are non-overlapping and all monotonic increasing or decreasingz,Interval objects are not currently supportedrtrp)rbrrHr
r<ÚNotImplementedErrorrtrŒrprarQr`rRÚ_searchsorted_monotonic)ryrNržZsub_idxrOrOrPr =s$ÿÿÿ
z%IntervalIndex._searchsorted_monotoniczint | slice | np.ndarrayc
Cs&| |¡t|tƒrB|j|jkr(t|ƒ‚|j|jk|j|jk@}n|t||jƒrX|     ¡}nf|j
rbt nt }|j rpt nt }z||j|ƒ|||jƒ@}Wn,tk
r¼}zt|ƒ|‚W5d}~XYnX| ¡}|dkrÖt|ƒ‚|dkræ| ¡St | d¡¡}t|tƒr"|jdkr"t|jt|ƒ|jƒ}|S)a£
        Get integer location, slice or boolean mask for requested label.
 
        Parameters
        ----------
        key : label
 
        Returns
        -------
        int if unique index, slice if monotonic index, else mask
 
        Examples
        --------
        >>> i1, i2 = pd.Interval(0, 1), pd.Interval(1, 2)
        >>> index = pd.IntervalIndex([i1, i2])
        >>> index.get_loc(1)
        0
 
        You can also supply a point inside an interval.
 
        >>> index.get_loc(1.5)
        1
 
        If a label is in several intervals, you get the locations of all the
        relevant intervals.
 
        >>> i3 = pd.Interval(0, 2)
        >>> overlapping_index = pd.IntervalIndex([i1, i2, i3])
        >>> overlapping_index.get_loc(0.5)
        array([ True, False,  True])
 
        Only exact matches will be returned if an interval is provided.
 
        >>> index.get_loc(pd.Interval(0, 1))
        0
        NrrCÚu1)Z_check_indexing_errorrHr    rcrrtrpr+rArŽr^rrr_rKrZargmaxrZmaybe_booleans_to_sliceršÚsliceÚstopÚstartÚlenÚstep)ryr{ÚmaskZop_leftZop_rightÚerrÚmatchesÚresrOrOrPr~Zs,%
 
 
zIntervalIndex.get_locr1z
str | Nonez
int | Nonez
Any | Noneznpt.NDArray[np.intp])ÚtargetÚmethodÚlimitÚ    tolerancericCsPt|tƒr| |¡}n2t|jƒs:| |¡}|j |j¡}n|     |¡dSt
|ƒS)Nr) rHr<Ú_get_indexer_unique_sidesr(rArxrzÚ get_indexerÚvaluesÚ_get_indexer_pointwiser)ryr«r¬r­r®ÚindexerrOrOrPÚ _get_indexers
 
 
zIntervalIndex._get_indexerÚget_indexer_non_uniquez1tuple[npt.NDArray[np.intp], npt.NDArray[np.intp]])r«ricCs¸t|ƒ}| |¡s,| |¡s,|j|dddSt|tƒrn|jjrb|jjrb|     |¡}|dk 
¡d}q¨|  |¡Sn:t |j ƒs‚| |¡sŒ|  |¡S| |¡}|j |j¡\}}t|ƒt|ƒfS)NFr,r‹r)r3Z_should_compareZ_should_partial_indexZ_get_indexer_non_comparablerHr<rtrrpr¯Únonzeror²r(rArxrzrµr±r)ryr«r³ÚmissingrOrOrPrµ·s
 
 
 
z$IntervalIndex.get_indexer_non_uniquecCs2|j |j¡}|j |j¡}t ||k|d¡}|S)zZ
        _get_indexer specialized to the case where both of our sides are unique.
        r‹)rtr°rprIr’)ryr«Z left_indexerZ right_indexerr³rOrOrPr¯Ösz'IntervalIndex._get_indexer_unique_sidesc    Csîgg}}t|ƒD]À\}}zZ| |¡}t|tƒrJtj|j|j|jdd}n(t     
|¡rdtj |dd}nt  |¡d}WnRt k
rž| |¡t  dg¡}Yn*tk
rÆ| |¡t  dg¡}YnX| |¡qt |¡}t|ƒt|ƒfS)zV
        pointwise implementation for get_indexer and get_indexer_non_unique.
        Zintp©rArC)Zndminrr‹)Ú    enumerater~rHr¢rIÚaranger¤r£r¦rr#rmr’rÚappendrZ concatenater)ryr«r³r·Úir{ZlocsrOrOrPr²âs$
 
 
 
 
 
 
z$IntervalIndex._get_indexer_pointwisecCs|j o|jjdkS)Né)r–rzZ    _na_countr‚rOrOrPÚ_index_as_uniqueszIntervalIndex._index_as_uniquezKcannot handle overlapping indices; use IntervalIndex.get_indexer_non_uniquer¢)r{ÚkindcsN|jdks@|jdks@d}|dkr(t|ƒ‚|dkr@t|ƒs@t|ƒ‚tƒ ||¡S)NrCzClabel-based slicing with step!=1 is not supported for IntervalIndexÚlocÚgetitem)r¦rœr0ÚsuperÚ_convert_slice_indexer)ryr{r¿Úmsg©Ú    __class__rOrPrÃ
sz$IntervalIndex._convert_slice_indexercCs|jjjdkS)N)ÚmÚM)rAr›r¿r‚rOrOrPÚ_should_fallback_to_positionalsz,IntervalIndex._should_fallback_to_positionalcCst||ƒ ||¡S©N)rFÚ_maybe_cast_slice_bound)ryrNržrOrOrPrË sz%IntervalIndex._maybe_cast_slice_boundr)rAricCs&t|tƒsdSt|j|gƒ}t|ƒ S)NF)rHr*rrAr()ryrAZcommon_subtyperOrOrPÚ_is_comparable_dtype#s
z"IntervalIndex._is_comparable_dtypecCst|jjddS©NF)rg)r1rfrtr‚rOrOrPrt+szIntervalIndex.leftcCst|jjddSrÍ)r1rfrpr‚rOrOrPrp/szIntervalIndex.rightcCst|jjddSrÍ)r1rfÚmidr‚rOrOrPrÎ3szIntervalIndex.midcCst|jjddSrÍ)r1rfÚlengthr‚rOrOrPrÏ7szIntervalIndex.lengthz    list[str])ÚheaderÚna_repricCs|t|j|dƒS)N)rÑ)ÚlistÚ_format_native_types)ryrÐrÑrOrOrPÚ_format_with_header?sz!IntervalIndex._format_with_headerÚNaN©rÑÚquotingznpt.NDArray[np.object_])rÑric stƒjf||dœ|—ŽS)NrÖ)rÂrÓ)ryrÑr×ÚkwargsrÅrOrPrÓCsz"IntervalIndex._format_native_typescCs|j ¡›d| ¡›S)Nú,)rfÚ _format_dataZ _format_space)ryr?rOrOrPrÚIszIntervalIndex._format_datacCsf|jjr|jjr| |¡}n6|jjrH|jjrH| ¡ ¡dkrH| |¡}n
| |¡}|dkrb| ¡}|S)zL
        intersection specialized to the case with matching dtypes.
        rCN)rtrrpÚ_intersection_uniquerŽrÚ_intersection_non_uniqueZ sort_values)ryÚotherÚsortZtakenrOrOrPÚ _intersectionQs   
zIntervalIndex._intersection)rÝricCsP|j |j¡}|j |j¡}||k|dk@}| | ¡d¡}t|ƒ}| |¡S)a'
        Used when the IntervalIndex does not have any common endpoint,
        no matter left or right.
        Return the intersection with another IntervalIndex.
        Parameters
        ----------
        other : IntervalIndex
        Returns
        -------
        IntervalIndex
        r‹r)rtr°rpZtaker¶r-)ryrÝZlindexerZrindexerÚmatchr³rOrOrPrÛes z"IntervalIndex._intersection_uniquecCs†tjt|ƒtd}|jr@|jr@t t|ƒ¡| ¡d}d||<tt|j    |j
ƒƒ}t t|j    |j
ƒƒD]\}}||krdd||<qd||S)a
        Used when the IntervalIndex does have some common endpoints,
        on either sides.
        Return the intersection with another IntervalIndex.
 
        Parameters
        ----------
        other : IntervalIndex
 
        Returns
        -------
        IntervalIndex
        r¸rT) rIÚzerosr¥rer}rºrŽr‘Úziprtrpr¹)ryrÝr§Z first_nan_locZ
other_tupsr¼ÚtuprOrOrPrÜ{s 
z&IntervalIndex._intersection_non_uniquez
np.ndarraycCs tdƒ‚dS)NzRIntervalIndex does not use libjoin fastpaths or pass values to IndexEngine objects©rŸr‚rOrOrPÚ_get_engine_targetšsÿz IntervalIndex._get_engine_targetcCs tdƒ‚dS)Nz,IntervalIndex does not use libjoin fastpathsrä)ryÚresultrOrOrPÚ_from_join_target£szIntervalIndex._from_join_target)NNFNT)rpNFN)rpNFN)rpNFN)F)rt)NNN)N);rjÚ
__module__Ú __qualname__Z_typÚ__annotations__Z_can_hold_stringsr.Z    _data_clsrnÚ classmethodrr/ÚtextwrapÚdedentrorSrurrzr€rƒr„Úpropertyr‡r1rŠÚ__doc__rrr–r—rxr r~r´r2Ú_index_doc_kwargsrµr¯r²r¾Z_requires_unique_msgrÃrÉrËrÌrtrprÎrÏrÔrÓrÚrßrÛrÜrårçÚ __classcell__rOrOrÅrPr<”sü
.ùÿÿùÿÿúÿÿùÿÿùÿÿùÿÿú    
1AFû  ÿÿ    rervcCs$tt|ƒt|tƒt|tƒ|dkgƒS)zJ
    Helper for interval_range to check if start/end are valid types.
    N)Úanyr'rHrr )ÚendpointrOrOrPÚ_is_valid_endpoint©süÿrôcCsLdd„}dd„}t|ƒr t|ƒpJ||ƒr0||ƒpJ||ƒr@||ƒpJt ||¡S)zK
    Helper for interval_range to check type compat of start/end/freq.
    cSst|ttfƒSrÊ)rHrr ©ÚxrOrOrPÚ<lambda>»óz%_is_type_compatible.<locals>.<lambda>cSst|ttfƒSrÊ)rHr r rõrOrOrPr÷¼rø)r'ÚcomÚany_none)ÚaÚbZ is_ts_compatZ is_td_compatrOrOrPÚ_is_type_compatible·sÿþ
ürýrprr)r?rcric    
CsLt|ƒ}t|ƒ}|dk    r|n|}|dkrFt |||¡rFt|ƒrBdnd}t ||||¡dkrbtdƒ‚t|ƒsxtd|›ƒ‚t|ƒsŽtd|›ƒ‚t|ƒr t|ƒ}nt    |ƒs¾|dk    r¾t
d|›ƒ‚|dk    rt|ƒsz t |ƒ}Wn4tk
r}ztd    |›ƒ|‚W5d}~XYnXt t ||ƒt ||ƒt ||ƒgƒs>t
d
ƒ‚|dk    rP|d7}t|ƒrt |||¡rz||||8}|dkršt|||ƒd}n6|dkr¶||d|}n|dkrÐ||d|}t |||¡}t d d „t |||¡Dƒƒr<t|t d ¡ƒ}n.t|tƒr,t||||d}nt||||d}tj|||dS)ad
    Return a fixed frequency IntervalIndex.
 
    Parameters
    ----------
    start : numeric or datetime-like, default None
        Left bound for generating intervals.
    end : numeric or datetime-like, default None
        Right bound for generating intervals.
    periods : int, default None
        Number of periods to generate.
    freq : numeric, str, datetime.timedelta, or DateOffset, default None
        The length of each interval. Must be consistent with the type of start
        and end, e.g. 2 for numeric, or '5H' for datetime-like.  Default is 1
        for numeric and 'D' for datetime-like.
    name : str, default None
        Name of the resulting IntervalIndex.
    closed : {'left', 'right', 'both', 'neither'}, default 'right'
        Whether the intervals are closed on the left-side, right-side, both
        or neither.
 
    Returns
    -------
    IntervalIndex
 
    See Also
    --------
    IntervalIndex : An Index of intervals that are all closed on the same side.
 
    Notes
    -----
    Of the four parameters ``start``, ``end``, ``periods``, and ``freq``,
    exactly three must be specified. If ``freq`` is omitted, the resulting
    ``IntervalIndex`` will have ``periods`` linearly spaced elements between
    ``start`` and ``end``, inclusively.
 
    To learn more about datetime-like frequency strings, please see `this link
    <https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases>`__.
 
    Examples
    --------
    Numeric ``start`` and  ``end`` is supported.
 
    >>> pd.interval_range(start=0, end=5)
    IntervalIndex([(0, 1], (1, 2], (2, 3], (3, 4], (4, 5]],
                  dtype='interval[int64, right]')
 
    Additionally, datetime-like input is also supported.
 
    >>> pd.interval_range(start=pd.Timestamp('2017-01-01'),
    ...                   end=pd.Timestamp('2017-01-04'))
    IntervalIndex([(2017-01-01, 2017-01-02], (2017-01-02, 2017-01-03],
                   (2017-01-03, 2017-01-04]],
                  dtype='interval[datetime64[ns], right]')
 
    The ``freq`` parameter specifies the frequency between the left and right.
    endpoints of the individual intervals within the ``IntervalIndex``.  For
    numeric ``start`` and ``end``, the frequency must also be numeric.
 
    >>> pd.interval_range(start=0, periods=4, freq=1.5)
    IntervalIndex([(0.0, 1.5], (1.5, 3.0], (3.0, 4.5], (4.5, 6.0]],
                  dtype='interval[float64, right]')
 
    Similarly, for datetime-like ``start`` and ``end``, the frequency must be
    convertible to a DateOffset.
 
    >>> pd.interval_range(start=pd.Timestamp('2017-01-01'),
    ...                   periods=3, freq='MS')
    IntervalIndex([(2017-01-01, 2017-02-01], (2017-02-01, 2017-03-01],
                   (2017-03-01, 2017-04-01]],
                  dtype='interval[datetime64[ns], right]')
 
    Specify ``start``, ``end``, and ``periods``; the frequency is generated
    automatically (linearly spaced).
 
    >>> pd.interval_range(start=0, end=6, periods=4)
    IntervalIndex([(0.0, 1.5], (1.5, 3.0], (3.0, 4.5], (4.5, 6.0]],
              dtype='interval[float64, right]')
 
    The ``closed`` parameter specifies which endpoints of the individual
    intervals within the ``IntervalIndex`` are closed.
 
    >>> pd.interval_range(end=5, periods=4, closed='both')
    IntervalIndex([[1, 2], [2, 3], [3, 4], [4, 5]],
                  dtype='interval[int64, both]')
    NrCÚDézVOf the four parameters: start, end, periods, and freq, exactly three must be specifiedz,start must be numeric or datetime-like, got z*end must be numeric or datetime-like, got zperiods must be a number, got z7freq must be numeric or convertible to DateOffset, got z+start, end, freq need to be type compatiblecss|]}t|ƒVqdSrÊ)r#)Ú.0rörOrOrPÚ    <genexpr>`sz!interval_range.<locals>.<genexpr>Úint64)r¤ÚendÚperiodsÚfreq)r?rc)rrùrúr'Zcount_not_nonerœrôr!rˆr#rKrÚallrýZ all_not_nonerIZlinspaceZnot_nonerrArHrr6r;r<ro)    r¤rrrr?rcrór¨rsrOrOrPÚinterval_rangeÅsl^ÿ
 ÿþýÿ
 
 
 
 
þ r)NNNNNrp)erïÚ
__future__rÚoperatorrrrìÚtypingrrrÚnumpyrIZ pandas._libsrZpandas._libs.intervalr    r
r Zpandas._libs.tslibsr r rrZpandas._typingrrrrZ pandas.errorsrZpandas.util._decoratorsrrZpandas.util._exceptionsrZpandas.core.dtypes.castrrrrrZpandas.core.dtypes.commonrrrr r!r"r#r$r%r&r'r(r)Zpandas.core.dtypes.dtypesr*Zpandas.core.dtypes.missingr+Zpandas.core.algorithmsr-Zpandas.core.arrays.intervalr.r/Zpandas.core.commonÚcoreÚcommonrùZpandas.core.indexersr0Zpandas.core.indexes.baseZindexesÚbaseZibaser1r2r3r4Zpandas.core.indexes.datetimesr5r6Zpandas.core.indexes.extensionr7r8Zpandas.core.indexes.multir9Zpandas.core.indexes.timedeltasr:r;ÚdictrðÚupdaterírQrRrVr<rôrýrrOrOrOrPÚ<module>s¤    <     
ÿüÿÿùÿÿø
õ mú