
    Mh                    $   % 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/J0r0J1r1  SSK2J3r3J4r4  SSK5J6r6J7r7J8r8  SSK9J:r:  SSK;J<r<  SSK=J>r>  SSK?J@r@JArA  \(       a  SSKBJCrCJDrD  SSKJErEJFrFJGrGJHrH  SSKIJJrJJKrKJLrL  0 rMS\NS'   SSSSS.rO " S S \:5      rP " S! S"5      rQ " S# S$\\   5      rR " S% S\<5      rSg)&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	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$ )PandasObjectd   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    B/var/www/html/env/lib/python3.13/site-packages/pandas/core/base.py_constructorPandasObject._constructorl   s    
 Dz    c                ,    [         R                  U 5      $ )z9
Return a string representation for a particular object.
)object__repr__rB   s    rD   rJ   PandasObject.__repr__s   s    
 t$$rG   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)rC   keys     rD   _reset_cachePandasObject._reset_cachez   s;     tX&&;KKKKOOC&rG   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__)rC   rT   mem	__class__s      rD   r[   PandasObject.__sizeof__   sQ    
 t^T:D)Cinns<<#'')<< w!##rG    )returnstrN)rP   z
str | Noner`   Noner`   rX   )__name__
__module____qualname____firstlineno____doc____annotations__propertyrE   rJ   rQ   r[   __static_attributes____classcell__)r]   s   @rD   r=   r=   d   s6    
  %	'$ $rG   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)rI   __setattr__rB   s    rD   _freezeNoNewAttributesMixin._freeze   s     	4T2rG   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 )Nrr   Fr?   z"You cannot add any new attribute '')rW   rA   __dict__AttributeErrorrI   rs   )rC   rP   values      rD   rs    NoNewAttributesMixin.__setattr__   s^     4U++8Od4j)))t$'3 #EcU!!LMM4e,rG   r_   N)r`   rc   )rP   ra   r`   rc   )re   rf   rg   rh   ri   rt   rs   rl   r_   rG   rD   ro   ro      s    	3-rG   ro   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                  $ rb   )
isinstancer   listtupler!   r    npndarrayrB   s    rD   _selection_listSelectionMixin._selection_list   sB     OOdE9h

K
 
 OO$$rG   c                    U R                   b  [        U R                  [        5      (       a  U R                  $ U R                  U R                      $ rb   )r   r   r   r!   rB   s    rD   _selected_objSelectionMixin._selected_obj   s8    ??"j9&E&E88O88DOO,,rG   c                .    U R                   R                  $ rb   )r   ndimrB   s    rD   r   SelectionMixin.ndim   s     !!&&&rG   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_axisrB   s    rD   _obj_with_exclusions#SelectionMixin._obj_with_exclusions   s     dhh	**88O??&88++D,@,@AAt!#
 88&&tQ4&PP88OrG   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KeyErrorra   _gotitemr   )rC   rP   bad_keysr   s       rD   __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0rG   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   )rC   rP   r   subsets       rD   r   SelectionMixin._gotitem   s     "$''rG   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)rC   rP   r   	selections       rD   _infer_selectionSelectionMixin._infer_selection  su     	;;!]]3CMc6F6Fs6K6KI  [[A#--"4"49KIrG   c                    [        U 5      erb   r   )rC   funcargskwargss       rD   	aggregateSelectionMixin.aggregate  s    !$''rG   r_   rd   rb   )r   rX   )r   zSeries | DataFrame)re   rf   rg   rh   ri   rj   r   _internal_namesr   _internal_names_setr	   rk   r   r   r   r   r   r   r   r   r   aggrl   r_   rG   rD   r}   r}      s    
 
M$(J!(##0Oo.
   - - '  '    1 (  ( CrG   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\	SAS j5       r\SS\R.                  4       SBS jj5       r\\	SCS j5       5       r\" SSSS9 SD     SES jj5       r\" \SSSS9 SD     SES jj5       rS r\rSFS jr\ SCS  j5       r!\SDSGS! jj5       r"\     SH         SIS" jj5       r#S# r$\SJSKS$ jj5       r%\	SCS% j5       r&\	SCS& j5       r'\	SCS' j5       r(\SLSMS( jj5       r)\" \*RV                  S)S)S)\,RZ                  " S*5      S+9  SN     SOS, jj5       r+S-\.S.'   \/  SP       SQS/ jj5       r0\/  SP       SRS0 jj5       r0\" \.S.   S1S29  SS       STS3 jj5       r0S4S5.SUS6 jjr1\SVSWS7 jj5       r2S8 r3S9 r4S:r5g)Xr6   i  zK
Common ops mixin to support a unified interface / docs for Series / Index
i  tolistzfrozenset[str]_hidden_attrsc                    [        U 5      erb   r   rB   s    rD   dtypeIndexOpsMixin.dtype'       "$''rG   c                    [        U 5      erb   r   rB   s    rD   _valuesIndexOpsMixin._values,  r   rG   c                2    [         R                  " X5        U $ )zO
Return the transpose, which is by definition self.

Returns
-------
%(klass)s
)nvvalidate_transpose)rC   r   r   s      rD   	transposeIndexOpsMixin.transpose1  s     	d+rG   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   shaperB   s    rD   r   IndexOpsMixin.shapeZ  s     ||!!!rG   c                    [        U 5      erb   r   rB   s    rD   __len__IndexOpsMixin.__len__g  s    !$''rG   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_   rB   s    rD   r   IndexOpsMixin.ndimk  s    0 rG   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
ValueErrorrB   s    rD   itemIndexOpsMixin.item  s*    6 t9>T
##QRRrG   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   nbytesrB   s    rD   r   IndexOpsMixin.nbytes  s    4 ||"""rG   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   rB   s    rD   sizeIndexOpsMixin.size  s    4 4<<  rG   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   rB   s    rD   arrayIndexOpsMixin.array  s    ~ "$''rG   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 'rw   )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)	rC   r   r   r   r   r   fillnavaluesresults	            rD   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rG   c                $    U R                   (       + $ rb   )r   rB   s    rD   emptyIndexOpsMixin.empty  s     99}rG   maxminlargest)opopposerz   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warnrA   re   FutureWarningr   argmaxr%   	nanargmaxrC   r   r  r   r   delegater   s          rD   r  IndexOpsMixin.argmax  s    l <<
%//fEh//hmmo1133&tDz':':&; <F F "/1 ((%%h>F|&tDz':':&; <F F "/1 MrG   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  rA   re   r  r   argminr%   	nanargminr
  s          rD   r  IndexOpsMixin.argmin  s     <<
%//fEh//hmmo1133&tDz':':&; <F F "/1 ((%%h>F|&tDz':':&; <F F "/1 MrG   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   rB   s    rD   r   IndexOpsMixin.tolist  s    D ||""$$rG   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   rB   s    rD   __iter__IndexOpsMixin.__iter__D  sN    , $,,

33%%t||((%0A0A*BCCrG   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  rB   s    rD   hasnansIndexOpsMixin.hasnans`  s    2 DJNN$%%rG   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)rC   mapperr  r   arrs        rD   _map_valuesIndexOpsMixin._map_values{  s>    2 llc>**776777##C9VVrG   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)rC   r)  r'  r(  r*  r+  s         rD   value_countsIndexOpsMixin.value_counts  s*    n //
 	
rG   c                    U R                   n[        U[        R                  5      (       d  UR	                  5       nU$ [
        R                  " U5      nU$ rb   )r   r   r   r   r:   r$   unique1d)rC   r   r   s      rD   r:   IndexOpsMixin.unique  sE    &"**--]]_F   ((0FrG   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   )rC   r+  uniqss      rD   nuniqueIndexOpsMixin.nunique  s'    F '.E5zrG   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+  )r4  r   rB   s    rD   	is_uniqueIndexOpsMixin.is_unique,  s    & ||5|)SY66rG   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   r3   )pandasr3   is_monotonic_increasingrC   r3   s     rD   r<  %IndexOpsMixin.is_monotonic_increasingA      & 	!T{222rG   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;  r3   is_monotonic_decreasingr=  s     rD   rA  %IndexOpsMixin.is_monotonic_decreasingX  r?  rG   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
rT   rU   )rM   r   rT   r   r   r   r   r   r   r   r   r   memory_usage_of_objects)rC   rV   vr   s       rD   _memory_usageIndexOpsMixin._memory_usageo  s    > 4::~..::** +   JJODJJ//"**dll3F,,V44ArG   r7   z            sort : bool, default False
                Sort `uniques` and shuffle `codes` to maintain the
                relationship.
            )r   order	size_hintr'  c                2   [         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" U5      nX44$ )N)r'  use_na_sentinelr   r:  )r$   	factorizer   r   r   float16astypefloat32r   r    rE   r;  r3   )rC   r'  rK  codesuniquesr3   s         rD   rL  IndexOpsMixin.factorize  s    $ $--LLt
 ==BJJ&nnRZZ0GdH%%''0G
 ~ %GnG~rG   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 rb   r_   rC   rz   sidesorters       rD   rS  IndexOpsMixin.searchsorted#       	rG   c                    g rb   r_   rU  s       rD   rS  rX  ,  rY  rG   r3   )r8   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)rV  rW  )
r   r   rA   re   r   r   r   r   rS  r$   )rC   rz   rV  rW  msgr   s         rD   rS  rX  5  s     e\**:;''((9;  S/!&"**--&&u&GG&&	
 	
rG   firstkeepc               *    U R                  US9nX)    $ Nr^  )_duplicated)rC   r_  r;   s      rD   drop_duplicatesIndexOpsMixin.drop_duplicatesO  s     %%4%0
K  rG   c                    U R                   n[        U[        5      (       a  UR                  US9$ [        R                  " X!S9$ ra  )r   r   r)   r;   r$   )rC   r_  r#  s      rD   rb  IndexOpsMixin._duplicatedT  s:    llc>**>>t>,,$$S44rG   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)rC   otherr   res_namelvaluesrvaluesr   s          rD   _arith_methodIndexOpsMixin._arith_method[  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   )rC   r   r   s      rD   rt  IndexOpsMixin._construct_resultj  s    
 "$''rG   r_   )r`   r   )r`   zExtensionArray | np.ndarray)r`   r   )r`   r   rd   )r`   z
Literal[1])r`   r)   )r   znpt.DTypeLike | Noner   r  r   rI   r`   z
np.ndarray)r`   r  )NT)r   zAxisInt | Noner  r  r`   rX   )r`   r-   )r   r  )FTFNT)
r)  r  r'  r  r(  r  r+  r  r`   r4   )T)r+  r  r`   rX   )F)rV   r  r`   rX   )FT)r'  r  rK  r  r`   z"tuple[npt.NDArray[np.intp], Index])..)rz   r1   rV  Literal['left', 'right']rW  r/   r`   znp.intp)rz   znpt.ArrayLike | ExtensionArrayrV  r}  rW  r/   r`   znpt.NDArray[np.intp])leftN)rz   z$NumpyValueArrayLike | ExtensionArrayrV  r}  rW  zNumpySorter | Noner`   znpt.NDArray[np.intp] | np.intp)r_  r.   )r]  )r_  r.   r`   znpt.NDArray[np.bool_])6re   rf   rg   rh   ri   __array_priority__	frozensetr   rj   rk   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:   r4  r7  r<  rA  rF  r$   rL  textwrapdedentr5   r
   rS  rc  rb  ry  rt  rl   r_   rG   rD   r6   r6     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 	__
  $  
,	,`	 R  *-!	 ' 	
 
   *-!	- ' 	
 
  	n	%W5 *0%)	
3
 '
 #	

 
(
 6
2 3: !
 5 5=(rG   )Tri   
__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!   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.   r/   r0   r1   r;  r2   r3   r4   r5   rj   _indexops_doc_kwargsr=   ro   r}   r6   r_   rG   rD   <module>r     s   #      .     . - 5 4 5 

 
 / * -
 
    "n !!	 ,$= ,$^- -DdWX& dNS(H S(rG   