
    m*i                    (   % S r SSKJr  SSKrSSKJrJrJrJrJ	r	J
r
Jr  SSKrSSKrSSKJr  SSKJr  SSKJrJrJrJrJrJrJr  SSKJr  SS	KJr  SS
K J!r!  SSK"J#r#J$r$  SSK%J&r&  SSK'J(r(  SSK)J*r*J+r+  SSK,J-r-  SSK.J/r/J0r0J1r1J2r2  SSK3J4r4J5r5  SSK6J7r7J8r8J9r9  SSK:J;r;  SSK<J=r=  SSK>J?r?  SSK@JArAJBrB  \(       a  SSKCJDrDJErE  SSKJFrFJGrGJHrHJIrI  SSKJJKrKJLrLJMrM  0 rNS\OS'   SSSSS.rP " S S \;5      rQ " S! S"5      rR " S# S$\\   5      rS " S% S\=5      rTg)&z.
Base and utility classes for pandas objects.
    )annotationsN)TYPE_CHECKINGAnyGenericLiteralcastfinaloverload)using_copy_on_write)lib)AxisIntDtypeObj
IndexLabelNDFrameTSelfShapenpt)PYPY)functionAbstractMethodError)cache_readonlydoc)find_stack_level)can_hold_element)is_object_dtype	is_scalar)ExtensionDtype)ABCDataFrameABCIndexABCMultiIndex	ABCSeries)isnaremove_na_arraylike)
algorithmsnanopsops)DirNamesMixin)OpsMixin)ExtensionArray)ensure_wrapped_if_datetimelikeextract_array)HashableIterator)DropKeepNumpySorterNumpyValueArrayLikeScalarLike_co)	DataFrameIndexSerieszdict[str, str]_shared_docsIndexOpsMixin )klassinplaceunique
duplicatedc                  d   ^  \ rS rSr% SrS\S'   \S 5       rS
S jrSSS jjr	SU 4S jjr
S	rU =r$ )PandasObjecte   z'
Baseclass for various pandas objects.
zdict[str, Any]_cachec                    [        U 5      $ )z;
Class constructor (for this class it's just `__class__`).
)typeselfs    P/var/www/html/land-doc-ocr/venv/lib/python3.13/site-packages/pandas/core/base.py_constructorPandasObject._constructorm   s    
 Dz    c                ,    [         R                  U 5      $ )z9
Return a string representation for a particular object.
)object__repr__rC   s    rE   rK   PandasObject.__repr__t   s    
 t$$rH   c                    [        U S5      (       d  gUc  U R                  R                  5         gU R                  R                  US5        g)zF
Reset cached properties. If ``key`` is passed, only clears that key.
r@   N)hasattrr@   clearpop)rD   keys     rE   _reset_cachePandasObject._reset_cache{   s;     tX&&;KKKKOOC&rH   c                   > [        U SS5      nU(       a5  U" SS9n[        [        U5      (       a  U5      $ UR                  5       5      $ [        TU ]  5       $ )z`
Generates the total memory usage for an object that returns
either a value or Series of values
memory_usageNTdeep)getattrintr   sumsuper
__sizeof__)rD   rU   mem	__class__s      rE   r\   PandasObject.__sizeof__   sQ    
 t^T:D)Cinns<<#'')<< w!##rH    )returnstrN)rQ   z
str | Nonera   Nonera   rY   )__name__
__module____qualname____firstlineno____doc____annotations__propertyrF   rK   rR   r\   __static_attributes____classcell__)r^   s   @rE   r>   r>   e   s6    
  %	'$ $rH   r>   c                  ,    \ rS rSrSrSS jrSS jrSrg)	NoNewAttributesMixin   ah  
Mixin which prevents adding new attributes.

Prevents additional attributes via xxx.attribute = "something" after a
call to `self.__freeze()`. Mainly used to prevent the user from using
wrong attributes on an accessor (`Series.cat/.str/.dt`).

If you really want to add a new attribute at a later time, you need to use
`object.__setattr__(self, key, value)`.
c                2    [         R                  U SS5        g)z)
Prevents setting additional attributes.
__frozenTN)rJ   __setattr__rC   s    rE   _freezeNoNewAttributesMixin._freeze   s     	4T2rH   c                    [        U SS5      (       a;  US:X  d5  U[        U 5      R                  ;   d  [        XS 5      c  [        SU S35      e[        R                  XU5        g )Nrs   Fr@   z"You cannot add any new attribute '')rX   rB   __dict__AttributeErrorrJ   rt   )rD   rQ   values      rE   rt    NoNewAttributesMixin.__setattr__   s^     4U++8Od4j)))t$'3 #EcU!!LMM4e,rH   r`   N)ra   rd   )rQ   rb   ra   rd   )rf   rg   rh   ri   rj   ru   rt   rm   r`   rH   rE   rp   rp      s    	3-rH   rp   c                      \ rS rSr% SrS\S'   SrS\S'   S\S	'   S
S/r\" \5      r	\
\S 5       5       r\S 5       r\
\SS j5       5       r\
\S 5       5       rS rSSS jjr\
SS j5       rS r\rSrg)SelectionMixin   z}
mixin implementing the selection & aggregation interface on a group-like
object sub-classes need to define: obj, exclusions
r   objNzIndexLabel | None
_selectionzfrozenset[Hashable]
exclusionsr@   __setstate__c                    [        U R                  [        [        [        [
        [        R                  45      (       d  U R                  /$ U R                  $ rc   )
isinstancer   listtupler"   r    npndarrayrC   s    rE   _selection_listSelectionMixin._selection_list   sB     OOdE9h

K
 
 OO$$rH   c                    U R                   b  [        U R                  [        5      (       a  U R                  $ U R                  U R                      $ rc   )r   r   r   r"   rC   s    rE   _selected_objSelectionMixin._selected_obj   s8    ??"j9&E&E88O88DOO,,rH   c                .    U R                   R                  $ rc   )r   ndimrC   s    rE   r   SelectionMixin.ndim   s     !!&&&rH   c                P   [        U R                  [        5      (       a  U R                  $ U R                  b%  U R                  R	                  U R
                  5      $ [        U R                  5      S:  a%  U R                  R                  U R                  SSS9$ U R                  $ )Nr      T)axis
only_slice)	r   r   r"   r   _getitem_nocopyr   lenr   
_drop_axisrC   s    rE   _obj_with_exclusions#SelectionMixin._obj_with_exclusions   s     dhh	**88O??&88++D,@,@AAt!#
 88&&tQ4&PP88OrH   c                   U R                   b  [        SU R                    S35      e[        U[        [        [
        [        [        R                  45      (       a  [        U R                  R                  R                  U5      5      [        [        U5      5      :w  aQ  [        [        U5      R                  U R                  R                  5      5      n[        S[!        U5      SS  35      eU R#                  [        U5      SS9$ XR                  ;  a  [        SU 35      eU R                  U   R$                  nU R#                  XS9$ )	Nz
Column(s) z already selectedzColumns not found: r      )r   zColumn not found: )r   
IndexErrorr   r   r   r"   r    r   r   r   r   columnsintersectionset
differenceKeyErrorrb   _gotitemr   )rD   rQ   bad_keysr   s       rE   __getitem__SelectionMixin.__getitem__   s   ??&z$//)::KLMMcD%HbjjIJJ488##0056#c#h-GC 3 3DHH4D4D EF!4S]1R5H4IJKK==c=33 (("!3C59::88C=%%D===00rH   c                    [        U 5      e)z
sub-classes to define
return a sliced object

Parameters
----------
key : str / list of selections
ndim : {1, 2}
    requested ndim of result
subset : object, default None
    subset to act on
r   )rD   rQ   r   subsets       rE   r   SelectionMixin._gotitem   s     "$''rH   c                    SnUR                   S:X  a?  [        R                  " U5      (       a  X;   d  [        R                  " U5      (       a  UnU$ UR                   S:X  a,  [        R                  " U5      (       a  XR                  :X  a  UnU$ )z?
Infer the `selection` to pass to our constructor in _gotitem.
Nr   r   )r   r   r   is_list_likename)rD   rQ   r   	selections       rE   _infer_selectionSelectionMixin._infer_selection  su     	;;!]]3CMc6F6Fs6K6KI  [[A#--"4"49KIrH   c                    [        U 5      erc   r   )rD   funcargskwargss       rE   	aggregateSelectionMixin.aggregate  s    !$''rH   r`   re   rc   )r   rY   )r   zSeries | DataFrame)rf   rg   rh   ri   rj   rk   r   _internal_namesr   _internal_names_setr	   rl   r   r   r   r   r   r   r   r   r   aggrm   r`   rH   rE   r~   r~      s    
 
M$(J!(##0Oo.
   - - '  '    1 (  ( CrH   r~   c            	         \ rS rSr% SrSr\" S/5      rS\S'   \	S;S j5       r
\	S<S j5       r\S=S	 j5       r\	" \S
S9r\	S>S j5       rS?S jr\	S?S j5       r\S 5       r\	S?S j5       r\	S?S j5       r\	S@S j5       r\SS\R.                  4       SAS jj5       r\\	SBS j5       5       r\" SSSS9 SC     SDS jj5       r\" \SSSS9 SC     SDS jj5       rS r\rSES jr\ SBS  j5       r!\SCSFS! jj5       r"\     SG         SHS" jj5       r#S# r$\SISJS$ jj5       r%\	SBS% j5       r&\	SBS& j5       r'\	SBS' j5       r(\SKSLS( jj5       r)\" \*RV                  S)S)S)\,RZ                  " S*5      S+9  SM     SNS, jj5       r+S-\.S.'   \/  SO       SPS/ jj5       r0\/  SO       SQS0 jj5       r0\" \.S.   S1S29  SR       SSS3 jj5       r0S4S5.STS6 jjr1\SUSVS7 jj5       r2S8 r3S9 r4S:r5g)Wr7   i  zK
Common ops mixin to support a unified interface / docs for Series / Index
i  tolistzfrozenset[str]_hidden_attrsc                    [        U 5      erc   r   rC   s    rE   dtypeIndexOpsMixin.dtype(       "$''rH   c                    [        U 5      erc   r   rC   s    rE   _valuesIndexOpsMixin._values-  r   rH   c                2    [         R                  " X5        U $ )zO
Return the transpose, which is by definition self.

Returns
-------
%(klass)s
)nvvalidate_transpose)rD   r   r   s      rE   	transposeIndexOpsMixin.transpose2  s     	d+rH   a  
        Return the transpose, which is by definition self.

        Examples
        --------
        For Series:

        >>> s = pd.Series(['Ant', 'Bear', 'Cow'])
        >>> s
        0     Ant
        1    Bear
        2     Cow
        dtype: object
        >>> s.T
        0     Ant
        1    Bear
        2     Cow
        dtype: object

        For Index:

        >>> idx = pd.Index([1, 2, 3])
        >>> idx.T
        Index([1, 2, 3], dtype='int64')
        )r   c                .    U R                   R                  $ )zv
Return a tuple of the shape of the underlying data.

Examples
--------
>>> s = pd.Series([1, 2, 3])
>>> s.shape
(3,)
)r   shaperC   s    rE   r   IndexOpsMixin.shape[  s     ||!!!rH   c                    [        U 5      erc   r   rC   s    rE   __len__IndexOpsMixin.__len__h  s    !$''rH   c                    g)a  
Number of dimensions of the underlying data, by definition 1.

Examples
--------
>>> s = pd.Series(['Ant', 'Bear', 'Cow'])
>>> s
0     Ant
1    Bear
2     Cow
dtype: object
>>> s.ndim
1

For Index:

>>> idx = pd.Index([1, 2, 3])
>>> idx
Index([1, 2, 3], dtype='int64')
>>> idx.ndim
1
r   r`   rC   s    rE   r   IndexOpsMixin.ndimo  s    0 rH   c                ^    [        U 5      S:X  a  [        [        U 5      5      $ [        S5      e)aH  
Return the first element of the underlying data as a Python scalar.

Returns
-------
scalar
    The first element of Series or Index.

Raises
------
ValueError
    If the data is not length = 1.

Examples
--------
>>> s = pd.Series([1])
>>> s.item()
1

For an index:

>>> s = pd.Series([1], index=['a'])
>>> s.index.item()
'a'
r   z6can only convert an array of size 1 to a Python scalar)r   nextiter
ValueErrorrC   s    rE   itemIndexOpsMixin.item  s*    6 t9>T
##QRRrH   c                .    U R                   R                  $ )a%  
Return the number of bytes in the underlying data.

Examples
--------
For Series:

>>> s = pd.Series(['Ant', 'Bear', 'Cow'])
>>> s
0     Ant
1    Bear
2     Cow
dtype: object
>>> s.nbytes
24

For Index:

>>> idx = pd.Index([1, 2, 3])
>>> idx
Index([1, 2, 3], dtype='int64')
>>> idx.nbytes
24
)r   nbytesrC   s    rE   r   IndexOpsMixin.nbytes  s    4 ||"""rH   c                ,    [        U R                  5      $ )a"  
Return the number of elements in the underlying data.

Examples
--------
For Series:

>>> s = pd.Series(['Ant', 'Bear', 'Cow'])
>>> s
0     Ant
1    Bear
2     Cow
dtype: object
>>> s.size
3

For Index:

>>> idx = pd.Index([1, 2, 3])
>>> idx
Index([1, 2, 3], dtype='int64')
>>> idx.size
3
)r   r   rC   s    rE   sizeIndexOpsMixin.size  s    4 4<<  rH   c                    [        U 5      e)a  
The ExtensionArray of the data backing this Series or Index.

Returns
-------
ExtensionArray
    An ExtensionArray of the values stored within. For extension
    types, this is the actual array. For NumPy native types, this
    is a thin (no copy) wrapper around :class:`numpy.ndarray`.

    ``.array`` differs from ``.values``, which may require converting
    the data to a different form.

See Also
--------
Index.to_numpy : Similar method that always returns a NumPy array.
Series.to_numpy : Similar method that always returns a NumPy array.

Notes
-----
This table lays out the different array types for each extension
dtype within pandas.

================== =============================
dtype              array type
================== =============================
category           Categorical
period             PeriodArray
interval           IntervalArray
IntegerNA          IntegerArray
string             StringArray
boolean            BooleanArray
datetime64[ns, tz] DatetimeArray
================== =============================

For any 3rd-party extension types, the array type will be an
ExtensionArray.

For all remaining dtypes ``.array`` will be a
:class:`arrays.NumpyExtensionArray` wrapping the actual ndarray
stored within. If you absolutely need a NumPy array (possibly with
copying / coercing data), then use :meth:`Series.to_numpy` instead.

Examples
--------
For regular NumPy types like int, and float, a NumpyExtensionArray
is returned.

>>> pd.Series([1, 2, 3]).array
<NumpyExtensionArray>
[1, 2, 3]
Length: 3, dtype: int64

For extension types, like Categorical, the actual ExtensionArray
is returned

>>> ser = pd.Series(pd.Categorical(['a', 'b', 'a']))
>>> ser.array
['a', 'b', 'a']
Categories (2, object): ['a', 'b']
r   rC   s    rE   arrayIndexOpsMixin.array  s    ~ "$''rH   NFc                   [        U R                  [        5      (       a  U R                  R                  " U4X#S.UD6$ U(       a1  [        [        UR                  5       5      5      n[        SU S35      eU[        R                  L=(       aM    U[        R                  L =(       a/    [        R                  " U R                  [        R                  5      (       + nU R                  nU(       aV  [!        Xs5      (       d  [        R"                  " XqS9nOUR%                  5       nX7[        R&                  " [)        U 5      5      '   [        R"                  " XqS9nU(       a  U(       a  U(       d  [+        5       (       au  [        R,                  " U R                  SS USS 5      (       aI  [+        5       (       a*  U(       d#  UR/                  5       nSUR0                  l        U$ UR%                  5       nU$ )ac  
A NumPy ndarray representing the values in this Series or Index.

Parameters
----------
dtype : str or numpy.dtype, optional
    The dtype to pass to :meth:`numpy.asarray`.
copy : bool, default False
    Whether to ensure that the returned value is not a view on
    another array. Note that ``copy=False`` does not *ensure* that
    ``to_numpy()`` is no-copy. Rather, ``copy=True`` ensure that
    a copy is made, even if not strictly necessary.
na_value : Any, optional
    The value to use for missing values. The default value depends
    on `dtype` and the type of the array.
**kwargs
    Additional keywords passed through to the ``to_numpy`` method
    of the underlying array (for extension arrays).

Returns
-------
numpy.ndarray

See Also
--------
Series.array : Get the actual data stored within.
Index.array : Get the actual data stored within.
DataFrame.to_numpy : Similar method for DataFrame.

Notes
-----
The returned array will be the same up to equality (values equal
in `self` will be equal in the returned array; likewise for values
that are not equal). When `self` contains an ExtensionArray, the
dtype may be different. For example, for a category-dtype Series,
``to_numpy()`` will return a NumPy array and the categorical dtype
will be lost.

For NumPy dtypes, this will be a reference to the actual data stored
in this Series or Index (assuming ``copy=False``). Modifying the result
in place will modify the data stored in the Series or Index (not that
we recommend doing that).

For extension types, ``to_numpy()`` *may* require copying data and
coercing the result to a NumPy type (possibly object), which may be
expensive. When you need a no-copy reference to the underlying data,
:attr:`Series.array` should be used instead.

This table lays out the different dtypes and default return types of
``to_numpy()`` for various dtypes within pandas.

================== ================================
dtype              array type
================== ================================
category[T]        ndarray[T] (same dtype as input)
period             ndarray[object] (Periods)
interval           ndarray[object] (Intervals)
IntegerNA          ndarray[object]
datetime64[ns]     datetime64[ns]
datetime64[ns, tz] ndarray[object] (Timestamps)
================== ================================

Examples
--------
>>> ser = pd.Series(pd.Categorical(['a', 'b', 'a']))
>>> ser.to_numpy()
array(['a', 'b', 'a'], dtype=object)

Specify the `dtype` to control how datetime-aware data is represented.
Use ``dtype=object`` to return an ndarray of pandas :class:`Timestamp`
objects, each with the correct ``tz``.

>>> ser = pd.Series(pd.date_range('2000', periods=2, tz="CET"))
>>> ser.to_numpy(dtype=object)
array([Timestamp('2000-01-01 00:00:00+0100', tz='CET'),
       Timestamp('2000-01-02 00:00:00+0100', tz='CET')],
      dtype=object)

Or ``dtype='datetime64[ns]'`` to return an ndarray of native
datetime64 values. The values are converted to UTC and the timezone
info is dropped.

>>> ser.to_numpy(dtype="datetime64[ns]")
... # doctest: +ELLIPSIS
array(['1999-12-31T23:00:00.000000000', '2000-01-01T23:00:00...'],
      dtype='datetime64[ns]')
)copyna_valuez/to_numpy() got an unexpected keyword argument 'rx   r   Nr   F)r   r   r   r   to_numpyr   r   keys	TypeErrorr   
no_defaultr   nan
issubdtypefloatingr   r   asarrayr   
asanyarrayr#   r   shares_memoryviewflags	writeable)	rD   r   r   r   r   r   fillnavaluesresults	            rE   r   IndexOpsMixin.to_numpy!  sl   ~ djj.11::&&uU4UfUUD/0HA(1M 
 CNN* T'RBMM$**bkk,RS 	 #F55 F8082==d,-F02E2G2GRa 0&!*==&((#[[]F-2FLL*  $[[]FrH   c                $    U R                   (       + $ rc   )r   rC   s    rE   emptyIndexOpsMixin.empty  s     99}rH   maxminlargest)opopposer{   c                0   U R                   n[        R                  " U5        [        R                  " X#U5      n[	        U[
        5      (       at  U(       d]  UR                  5       R                  5       (       a:  [        R                  " S[        U 5      R                   S3[        [        5       S9  gUR                  5       $ [        R                   " XRS9nUS:X  a9  [        R                  " S[        U 5      R                   S3[        [        5       S9  U$ )a  
Return int position of the {value} value in the Series.

If the {op}imum is achieved in multiple locations,
the first row position is returned.

Parameters
----------
axis : {{None}}
    Unused. Parameter needed for compatibility with DataFrame.
skipna : bool, default True
    Exclude NA/null values when showing the result.
*args, **kwargs
    Additional arguments and keywords for compatibility with NumPy.

Returns
-------
int
    Row position of the {op}imum value.

See Also
--------
Series.arg{op} : Return position of the {op}imum value.
Series.arg{oppose} : Return position of the {oppose}imum value.
numpy.ndarray.arg{op} : Equivalent method for numpy arrays.
Series.idxmax : Return index label of the maximum values.
Series.idxmin : Return index label of the minimum values.

Examples
--------
Consider dataset containing cereal calories

>>> s = pd.Series({{'Corn Flakes': 100.0, 'Almond Delight': 110.0,
...                'Cinnamon Toast Crunch': 120.0, 'Cocoa Puff': 110.0}})
>>> s
Corn Flakes              100.0
Almond Delight           110.0
Cinnamon Toast Crunch    120.0
Cocoa Puff               110.0
dtype: float64

>>> s.argmax()
2
>>> s.argmin()
0

The maximum cereal calories is the third element and
the minimum cereal calories is the first element,
since series is zero-indexed.
The behavior of x.argmax/argmin with skipna=False and NAs, or with all-NAs is deprecated. In a future version this will raise ValueError.
stacklevelr   skipna)r   r   validate_minmax_axisvalidate_argmax_with_skipnar   r*   r#   anywarningswarnrB   rf   FutureWarningr   argmaxr&   	nanargmaxrD   r   r  r   r   delegater   s          rE   r
  IndexOpsMixin.argmax  s    l <<
%//fEh//hmmo1133&tDz':':&; <F F "/1 ((%%h>F|&tDz':':&; <F F "/1 MrH   smallestc                0   U R                   n[        R                  " U5        [        R                  " X#U5      n[	        U[
        5      (       at  U(       d]  UR                  5       R                  5       (       a:  [        R                  " S[        U 5      R                   S3[        [        5       S9  gUR                  5       $ [        R                   " XRS9nUS:X  a9  [        R                  " S[        U 5      R                   S3[        [        5       S9  U$ )Nr   r   r   r   r  )r   r   r  validate_argmin_with_skipnar   r*   r#   r  r  r  rB   rf   r	  r   argminr&   	nanargminr  s          rE   r  IndexOpsMixin.argmin   s     <<
%//fEh//hmmo1133&tDz':':&; <F F "/1 ((%%h>F|&tDz':':&; <F F "/1 MrH   c                6    U R                   R                  5       $ )a  
Return a list of the values.

These are each a scalar type, which is a Python scalar
(for str, int, float) or a pandas scalar
(for Timestamp/Timedelta/Interval/Period)

Returns
-------
list

See Also
--------
numpy.ndarray.tolist : Return the array as an a.ndim-levels deep
    nested list of Python scalars.

Examples
--------
For Series

>>> s = pd.Series([1, 2, 3])
>>> s.to_list()
[1, 2, 3]

For Index:

>>> idx = pd.Index([1, 2, 3])
>>> idx
Index([1, 2, 3], dtype='int64')

>>> idx.to_list()
[1, 2, 3]
)r   r   rC   s    rE   r   IndexOpsMixin.tolist"  s    D ||""$$rH   c                    [        U R                  [        R                  5      (       d  [	        U R                  5      $ [        U R                  R                  [        U R                  R                  5      5      $ )a  
Return an iterator of the values.

These are each a scalar type, which is a Python scalar
(for str, int, float) or a pandas scalar
(for Timestamp/Timedelta/Interval/Period)

Returns
-------
iterator

Examples
--------
>>> s = pd.Series([1, 2, 3])
>>> for x in s:
...     print(x)
1
2
3
)	r   r   r   r   r   mapr   ranger   rC   s    rE   __iter__IndexOpsMixin.__iter__H  sN    , $,,

33%%t||((%0A0A*BCCrH   c                F    [        [        U 5      R                  5       5      $ )z
Return True if there are any NaNs.

Enables various performance speedups.

Returns
-------
bool

Examples
--------
>>> s = pd.Series([1, 2, 3, None])
>>> s
0    1.0
1    2.0
2    3.0
3    NaN
dtype: float64
>>> s.hasnans
True
)boolr#   r  rC   s    rE   hasnansIndexOpsMixin.hasnansd  s    2 DJNN$%%rH   c                    U R                   n[        U[        5      (       a  UR                  XS9$ [        R
                  " XAX#S9$ )a  
An internal function that maps values using the input
correspondence (which can be a dict, Series, or function).

Parameters
----------
mapper : function, dict, or Series
    The input correspondence object
na_action : {None, 'ignore'}
    If 'ignore', propagate NA values, without passing them to the
    mapping function
convert : bool, default True
    Try to find better dtype for elementwise function results. If
    False, leave as dtype=object. Note that the dtype is always
    preserved for some extension array dtypes, such as Categorical.

Returns
-------
Union[Index, MultiIndex], inferred
    The output of the mapping function applied to the index.
    If the function returns a tuple with more than one element
    a MultiIndex will be returned.
)	na_action)r!  convert)r   r   r*   r  r%   	map_array)rD   mapperr!  r"  arrs        rE   _map_valuesIndexOpsMixin._map_values  s>    2 llc>**776777##C9VVrH   c           	     4    [         R                  " U UUUUUS9$ )a=  
Return a Series containing counts of unique values.

The resulting object will be in descending order so that the
first element is the most frequently-occurring element.
Excludes NA values by default.

Parameters
----------
normalize : bool, default False
    If True then the object returned will contain the relative
    frequencies of the unique values.
sort : bool, default True
    Sort by frequencies when True. Preserve the order of the data when False.
ascending : bool, default False
    Sort in ascending order.
bins : int, optional
    Rather than count values, group them into half-open bins,
    a convenience for ``pd.cut``, only works with numeric data.
dropna : bool, default True
    Don't include counts of NaN.

Returns
-------
Series

See Also
--------
Series.count: Number of non-NA elements in a Series.
DataFrame.count: Number of non-NA elements in a DataFrame.
DataFrame.value_counts: Equivalent method on DataFrames.

Examples
--------
>>> index = pd.Index([3, 1, 2, 3, 4, np.nan])
>>> index.value_counts()
3.0    2
1.0    1
2.0    1
4.0    1
Name: count, dtype: int64

With `normalize` set to `True`, returns the relative frequency by
dividing all values by the sum of values.

>>> s = pd.Series([3, 1, 2, 3, 4, np.nan])
>>> s.value_counts(normalize=True)
3.0    0.4
1.0    0.2
2.0    0.2
4.0    0.2
Name: proportion, dtype: float64

**bins**

Bins can be useful for going from a continuous variable to a
categorical variable; instead of counting unique
apparitions of values, divide the index in the specified
number of half-open bins.

>>> s.value_counts(bins=3)
(0.996, 2.0]    2
(2.0, 3.0]      2
(3.0, 4.0]      1
Name: count, dtype: int64

**dropna**

With `dropna` set to `False` we can also see NaN index values.

>>> s.value_counts(dropna=False)
3.0    2
1.0    1
2.0    1
4.0    1
NaN    1
Name: count, dtype: int64
)sort	ascending	normalizebinsdropna)r%   value_counts_internal)rD   r+  r)  r*  r,  r-  s         rE   value_countsIndexOpsMixin.value_counts  s*    n //
 	
rH   c                    U R                   n[        U[        R                  5      (       d  UR	                  5       nU$ [
        R                  " U5      nU$ rc   )r   r   r   r   r;   r%   unique1d)rD   r   r   s      rE   r;   IndexOpsMixin.unique  sE    &"**--]]_F   ((0FrH   c                \    U R                  5       nU(       a  [        U5      n[        U5      $ )a  
Return number of unique elements in the object.

Excludes NA values by default.

Parameters
----------
dropna : bool, default True
    Don't include NaN in the count.

Returns
-------
int

See Also
--------
DataFrame.nunique: Method nunique for DataFrame.
Series.count: Count non-NA/null observations in the Series.

Examples
--------
>>> s = pd.Series([1, 3, 5, 7, 7])
>>> s
0    1
1    3
2    5
3    7
4    7
dtype: int64

>>> s.nunique()
4
)r;   r$   r   )rD   r-  uniqss      rE   nuniqueIndexOpsMixin.nunique  s'    F '.E5zrH   c                8    U R                  SS9[        U 5      :H  $ )z
Return boolean if values in the object are unique.

Returns
-------
bool

Examples
--------
>>> s = pd.Series([1, 2, 3])
>>> s.is_unique
True

>>> s = pd.Series([1, 2, 3, 1])
>>> s.is_unique
False
F)r-  )r6  r   rC   s    rE   	is_uniqueIndexOpsMixin.is_unique0  s    & ||5|)SY66rH   c                2    SSK Jn  U" U 5      R                  $ )z
Return boolean if values in the object are monotonically increasing.

Returns
-------
bool

Examples
--------
>>> s = pd.Series([1, 2, 2])
>>> s.is_monotonic_increasing
True

>>> s = pd.Series([3, 2, 1])
>>> s.is_monotonic_increasing
False
r   r4   )pandasr4   is_monotonic_increasingrD   r4   s     rE   r>  %IndexOpsMixin.is_monotonic_increasingE      & 	!T{222rH   c                2    SSK Jn  U" U 5      R                  $ )z
Return boolean if values in the object are monotonically decreasing.

Returns
-------
bool

Examples
--------
>>> s = pd.Series([3, 2, 2, 1])
>>> s.is_monotonic_decreasing
True

>>> s = pd.Series([1, 2, 3])
>>> s.is_monotonic_decreasing
False
r   r<  )r=  r4   is_monotonic_decreasingr?  s     rE   rC  %IndexOpsMixin.is_monotonic_decreasing\  rA  rH   c                l   [        U R                  S5      (       a  U R                  R                  US9$ U R                  R                  nU(       ab  [	        U R
                  5      (       aH  [        (       d=  [        [        R                  U R                  5      nU[        R                  " U5      -  nU$ )a	  
Memory usage of the values.

Parameters
----------
deep : bool, default False
    Introspect the data deeply, interrogate
    `object` dtypes for system-level memory consumption.

Returns
-------
bytes used

See Also
--------
numpy.ndarray.nbytes : Total bytes consumed by the elements of the
    array.

Notes
-----
Memory usage does not include memory consumed by elements that
are not components of the array if deep=False or if used on PyPy

Examples
--------
>>> idx = pd.Index([1, 2, 3])
>>> idx.memory_usage()
24
rU   rV   )rN   r   rU   r   r   r   r   r   r   r   r   r   memory_usage_of_objects)rD   rW   vr   s       rE   _memory_usageIndexOpsMixin._memory_usages  s    > 4::~..::** +   JJODJJ//"**dll3F,,V44ArH   r8   z            sort : bool, default False
                Sort `uniques` and shuffle `codes` to maintain the
                relationship.
            )r   order	size_hintr)  c                x   [         R                  " U R                  XS9u  p4UR                  [        R
                  :X  a  UR                  [        R                  5      n[        U [        5      (       a  U R                  U5      nX44$ SSKJn   U" X@R                  S9nX44$ ! [         a    U" U5      n X44$ f = f)N)r)  use_na_sentinelr   r<  r   )r%   	factorizer   r   r   float16astypefloat32r   r!   rF   r=  r4   NotImplementedError)rD   r)  rM  codesuniquesr4   s         rE   rN  IndexOpsMixin.factorize  s    $ $--LLt
 ==BJJ&nnRZZ0GdM**''0G ~ %)zz:
 ~	 ' )  .~	)s   B" "B98B9a  
        Find indices where elements should be inserted to maintain order.

        Find the indices into a sorted {klass} `self` such that, if the
        corresponding elements in `value` were inserted before the indices,
        the order of `self` would be preserved.

        .. note::

            The {klass} *must* be monotonically sorted, otherwise
            wrong locations will likely be returned. Pandas does *not*
            check this for you.

        Parameters
        ----------
        value : array-like or scalar
            Values to insert into `self`.
        side : {{'left', 'right'}}, optional
            If 'left', the index of the first suitable location found is given.
            If 'right', return the last such index.  If there is no suitable
            index, return either 0 or N (where N is the length of `self`).
        sorter : 1-D array-like, optional
            Optional array of integer indices that sort `self` into ascending
            order. They are typically the result of ``np.argsort``.

        Returns
        -------
        int or array of int
            A scalar or array of insertion points with the
            same shape as `value`.

        See Also
        --------
        sort_values : Sort by the values along either axis.
        numpy.searchsorted : Similar method from NumPy.

        Notes
        -----
        Binary search is used to find the required insertion points.

        Examples
        --------
        >>> ser = pd.Series([1, 2, 3])
        >>> ser
        0    1
        1    2
        2    3
        dtype: int64

        >>> ser.searchsorted(4)
        3

        >>> ser.searchsorted([0, 4])
        array([0, 3])

        >>> ser.searchsorted([1, 3], side='left')
        array([0, 2])

        >>> ser.searchsorted([1, 3], side='right')
        array([1, 3])

        >>> ser = pd.Series(pd.to_datetime(['3/11/2000', '3/12/2000', '3/13/2000']))
        >>> ser
        0   2000-03-11
        1   2000-03-12
        2   2000-03-13
        dtype: datetime64[ns]

        >>> ser.searchsorted('3/14/2000')
        3

        >>> ser = pd.Categorical(
        ...     ['apple', 'bread', 'bread', 'cheese', 'milk'], ordered=True
        ... )
        >>> ser
        ['apple', 'bread', 'bread', 'cheese', 'milk']
        Categories (4, object): ['apple' < 'bread' < 'cheese' < 'milk']

        >>> ser.searchsorted('bread')
        1

        >>> ser.searchsorted(['bread'], side='right')
        array([3])

        If the values are not monotonically sorted, wrong locations
        may be returned:

        >>> ser = pd.Series([2, 1, 3])
        >>> ser
        0    2
        1    1
        2    3
        dtype: int64

        >>> ser.searchsorted(1)  # doctest: +SKIP
        0  # wrong result, correct would be 1
        searchsortedc                    g rc   r`   rD   r{   sidesorters       rE   rV  IndexOpsMixin.searchsorted,       	rH   c                    g rc   r`   rX  s       rE   rV  r[  5  r\  rH   r4   )r9   c                   [        U[        5      (       a$  S[        U5      R                   S3n[	        U5      eU R
                  n[        U[        R                  5      (       d  UR                  XUS9$ [        R                  " UUUUS9$ )Nz(Value must be 1-D array-like or scalar, z is not supported)rY  rZ  )
r   r   rB   rf   r   r   r   r   rV  r%   )rD   r{   rY  rZ  msgr   s         rE   rV  r[  >  s     e\**:;''((9;  S/!&"**--&&u&GG&&	
 	
rH   firstkeepc               *    U R                  US9nX)    $ Nra  )_duplicated)rD   rb  r<   s      rE   drop_duplicatesIndexOpsMixin.drop_duplicatesX  s     %%4%0
K  rH   c                    U R                   n[        U[        5      (       a  UR                  US9$ [        R                  " X!S9$ rd  )r   r   r*   r<   r%   )rD   rb  r%  s      rE   re  IndexOpsMixin._duplicated]  s:    llc>**>>t>,,$$S44rH   c                   [         R                  " X5      nU R                  n[        USSS9n[         R                  " XTR
                  5      n[        U5      n[        U[        5      (       a6  [        R                  " UR                  UR                  UR                  5      n[        R                  " SS9   [         R                  " XEU5      nS S S 5        U R!                  WUS9$ ! , (       d  f       N= f)NT)extract_numpyextract_rangeignore)all)r   )r'   get_op_result_namer   r,   maybe_prepare_scalar_for_opr   r+   r   r  r   arangestartstopsteperrstatearithmetic_op_construct_result)rD   otherr   res_namelvaluesrvaluesr   s          rE   _arith_methodIndexOpsMixin._arith_methodd  s    ))$6,,TN11'==I09gu%%iiw||W\\JG[[X&&&w<F ' %%f8%<< '&s   8C((
C6c                    [        U 5      e)zf
Construct an appropriately-wrapped result from the ArrayLike result
of an arithmetic-like operation.
r   )rD   r   r   s      rE   rw  IndexOpsMixin._construct_results  s    
 "$''rH   r`   )ra   r   )ra   zExtensionArray | np.ndarray)ra   r   )ra   r   re   )ra   r*   )r   znpt.DTypeLike | Noner   r  r   rJ   ra   z
np.ndarray)ra   r  )NT)r   zAxisInt | Noner  r  ra   rY   )ra   r.   )r"  r  )FTFNT)
r+  r  r)  r  r*  r  r-  r  ra   r5   )T)r-  r  ra   rY   )F)rW   r  ra   rY   )FT)r)  r  rM  r  ra   z"tuple[npt.NDArray[np.intp], Index])..)r{   r2   rY  Literal['left', 'right']rZ  r0   ra   znp.intp)r{   znpt.ArrayLike | ExtensionArrayrY  r  rZ  r0   ra   znpt.NDArray[np.intp])leftN)r{   z$NumpyValueArrayLike | ExtensionArrayrY  r  rZ  zNumpySorter | Nonera   znpt.NDArray[np.intp] | np.intp)rb  r/   )r`  )rb  r/   ra   znpt.NDArray[np.bool_])6rf   rg   rh   ri   rj   __array_priority__	frozensetr   rk   rl   r   r   r	   r   Tr   r   r   r   r   r   r   r   r   r   r   r   r
  r  r   to_listr  r   r  r&  r/  r;   r6  r9  r>  rC  rH  r%   rN  textwrapdedentr6   r
   rV  rf  re  r|  rw  rm   r`   rH   rE   r7   r7     sM   
 $-	
%M>  ( ( ( ( 	 	 		A: 
" 
"(  2 S S< # #6 ! !6 >( >(@  '+>>	C#C C 	C 
C CJ    	E%y1:>Q"Q37Q	Q 2Qf 	E%z::>"37	 ;B"%H GD8 & &4 W W>   ]
]
 ]
 	]
 ]
 
]
 ]
~ % %N 7 7( 3 3, 3 3, ' 'R 	__
  $  
,	6`	 R  *-!	 ' 	
 
   *-!	- ' 	
 
  	n	%W5 *0%)	
3
 '
 #	

 
(
 6
2 3: !
 5 5=(rH   )Urj   
__future__r   r  typingr   r   r   r   r   r	   r
   r  numpyr   pandas._configr   pandas._libsr   pandas._typingr   r   r   r   r   r   r   pandas.compatr   pandas.compat.numpyr   r   pandas.errorsr   pandas.util._decoratorsr   r   pandas.util._exceptionsr   pandas.core.dtypes.castr   pandas.core.dtypes.commonr   r   pandas.core.dtypes.dtypesr   pandas.core.dtypes.genericr   r    r!   r"   pandas.core.dtypes.missingr#   r$   pandas.corer%   r&   r'   pandas.core.accessorr(   pandas.core.arrayliker)   pandas.core.arraysr*   pandas.core.constructionr+   r,   collections.abcr-   r.   r/   r0   r1   r2   r=  r3   r4   r5   r6   rk   _indexops_doc_kwargsr>   rp   r~   r7   r`   rH   rE   <module>r     s   #      .     . - 5 4 5 
 
 / * -
 
    "n !!	 ,$= ,$^- -DdWX& dN[(H [(rH   