ó
    Ñ]jßC  ã                  ót  • S r SSKJr  SSKrSSKJrJr  SSKrSSKJ	r	  SSK
Jr  \(       a  SSKJr  SSKJr  SS	KJr  SS
KJr   " S S5      r " S S5      rSS S4         SS jjr " S S5      r\r      SS jrSr\	" S5      SS j5       rSr\	" S5      SS j5       rSr\	" S5      SS j5       rg) z†

accessor.py contains base classes for implementing accessor properties
that can be mixed into or pinned onto other pandas classes.

é    )ÚannotationsN)ÚTYPE_CHECKINGÚfinal)Ú
set_module)Úfind_stack_level)ÚCallable)ÚTypeT©ÚIndex)ÚNDFramec                  ó|   ^ • \ rS rSr% \" 5       rS\S'   \" 5       rS\S'   \	S
S j5       r
S
S jrSU 4S jjrS	rU =r$ )ÚDirNamesMixiné   úset[str]Ú
_accessorszfrozenset[str]Ú_hidden_attrsc                ó4   • U R                   U R                  -  $ )z*
Delete unwanted __dir__ for this object.
)r   r   )Úselfs    ÚQ/home/mande/repo/quber/.venv/lib/python3.13/site-packages/pandas/core/accessor.pyÚ_dir_deletionsÚDirNamesMixin._dir_deletions#   s   € ð
 �‰ ×!3Ñ!3Ñ3Ð3ó    c                ój   • U R                    Vs1 s H  n[        X5      (       d  M  UiM     sn$ s  snf )z)
Add additional __dir__ for this object.
)r   Úhasattr)r   Úaccessors     r   Ú_dir_additionsÚDirNamesMixin._dir_additions*   s'   € ð *.¯ªÓTª˜X¼GÀD×<S—©ÑTÐTùÒTs   �0§0c                óŽ   >• [        [        TU ]	  5       5      nXR                  5       -
  U R	                  5       -  n[        U5      $ )zX
Provide method name lookup and completion.

Notes
-----
Only provide 'public' methods.
)ÚsetÚsuperÚ__dir__r   r   Úsorted)r   ÚrvÚ	__class__s     €r   r!   ÚDirNamesMixin.__dir__0   s?   ø€ ô ”‘‘Ó"Ó#ˆØ×&Ñ&Ó(Ñ(¨D×,?Ñ,?Ó,AÑAˆÜ�b‹zÐr   © )Úreturnr   )r'   ú	list[str])Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   r   Ú__annotations__Ú	frozensetr   r   r   r   r!   Ú__static_attributes__Ú__classcell__)r$   s   @r   r   r      s=   ø‡ Ù›5€J�Ó Ù$-£K€M�>Ó/à
ó4ó ð4ôU÷
õ 
r   r   c                  ól   • \ rS rSrSrSS jrSS jrSS jr\SS S4           SS	 jj5       r	S
r
g)ÚPandasDelegateé=   z8
Abstract base class for delegating methods/properties.
c                ó   • [        SU 35      e)NzYou cannot access the property ©Ú	TypeError©r   ÚnameÚargsÚkwargss       r   Ú_delegate_property_getÚ%PandasDelegate._delegate_property_getB   s   € ÜÐ9¸$¸Ð@ÓAÐAr   c                ó    • [        SU S35      e)NzThe property z cannot be setr5   )r   r8   Úvaluer9   r:   s        r   Ú_delegate_property_setÚ%PandasDelegate._delegate_property_setE   s   € Ü˜-¨ v¨^Ð<Ó=Ð=r   c                ó   • [        SU 35      e)NzYou cannot call method r5   r7   s       r   Ú_delegate_methodÚPandasDelegate._delegate_methodH   s   € ÜÐ1°$°Ð8Ó9Ð9r   Fc                ó   • U $ ©Nr&   ©Úxs    r   Ú<lambda>ÚPandasDelegate.<lambda>R   s   € ¹1r   Tc                óð   ^^• SUU4S jjnSUU4S jjnU H\  n	U(       d  [        TT" U	5      S5      c  M   US:X  a	  U" U	5      n
OU" U	5      n
U(       d  [        X	5      (       a  MP  [        X	U
5        M^     g)a\  
Add accessors to cls from the delegate class.

Parameters
----------
cls
    Class to add the methods/properties to.
delegate
    Class to get methods/properties and docstrings.
accessors : list of str
    List of accessors to add.
typ : {'property', 'method'}
overwrite : bool, default False
    Overwrite the method/property in the target class if it exists.
accessor_mapping: Callable, default lambda x: x
    Callable to map the delegate's function to the cls' function.
raise_on_missing: bool, default True
    Raise if an accessor does not exist on delegate.
    False skips the missing accessor.
c           
     ó„   >^ • U 4S jnU 4S jnT Ul         T Ul         [        UU[        TT" T 5      5      R                  S9$ )Nc                ó&   >• U R                  T5      $ rE   )r;   )r   r8   s    €r   Ú_getterÚ[PandasDelegate._add_delegate_accessors.<locals>._create_delegator_property.<locals>._getterk   s   ø€ Ø×2Ñ2°4Ó8Ð8r   c                ó(   >• U R                  TU5      $ rE   )r?   )r   Ú
new_valuesr8   s     €r   Ú_setterÚ[PandasDelegate._add_delegate_accessors.<locals>._create_delegator_property.<locals>._settern   s   ø€ Ø×2Ñ2°4¸ÓDÐDr   )ÚfgetÚfsetÚdoc)r)   ÚpropertyÚgetattrÚ__doc__)r8   rM   rQ   Úaccessor_mappingÚdelegates   `  €€r   Ú_create_delegator_propertyÚJPandasDelegate._add_delegate_accessors.<locals>._create_delegator_propertyj   sI   ù€ õ9õEð  $ˆGÔØ#ˆGÔäØØÜ˜HÑ&6°tÓ&<Ó=×EÑEñð r   c                ól   >^ • [        TT" T 5      5      n[        R                  " U5      U 4S j5       nU$ )Nc                ó0   >• U R                   " T/UQ70 UD6$ rE   )rB   )r   r9   r:   r8   s      €r   ÚfÚSPandasDelegate._add_delegate_accessors.<locals>._create_delegator_method.<locals>.f}   s   ø€ à×,Ò,¨TÐC°DÒC¸FÑCÐCr   )rW   Ú	functoolsÚwraps)r8   Úmethodr_   rY   rZ   s   `  €€r   Ú_create_delegator_methodÚHPandasDelegate._add_delegate_accessors.<locals>._create_delegator_methodz   s9   ù€ Ü˜XÑ'7¸Ó'=Ó>ˆFä�_Š_˜VÓ$ôDó %ðDð ˆHr   NrV   ©r8   Ústr)rW   r   Úsetattr)ÚclsrZ   Ú	accessorsÚtypÚ	overwriterY   Úraise_on_missingr[   rd   r8   r_   s    `   `     r   Ú_add_delegate_accessorsÚ&PandasDelegate._add_delegate_accessorsK   ss   ù€ ÷>	ð 	÷ 	ð 	ó ˆDæ$Ü˜HÑ&6°tÓ&<¸dÓCÑKáà�jÓ Ù.¨tÓ4‘á,¨TÓ2�ö ¤¨× 2Ó 2Ü˜ 1Ö%ò r   r&   Nrf   ©r8   rg   r'   ÚNone)rj   r(   rk   rg   rl   ÚboolrY   úCallable[[str], str]rm   rr   r'   rq   )r)   r*   r+   r,   rX   r;   r?   rB   Úclassmethodrn   r/   r&   r   r   r2   r2   =   sz   † ñôBô>ô:ð ð  Ù1<Ø!%ðE&ð ðE&ð ð	E&ð
 ðE&ð /ðE&ð ðE&ð 
ôE&ó óE&r   r2   Fc                ó   • U $ rE   r&   rF   s    r   rH   rH   ™   s   € ±qr   Tc                ó(   ^ ^^^^^• UUU UUU4S jnU$ )aj  
Add delegated names to a class using a class decorator.  This provides
an alternative usage to directly calling `_add_delegate_accessors`
below a class definition.

Parameters
----------
delegate : object
    The class to get methods/properties & docstrings.
accessors : Sequence[str]
    List of accessor to add.
typ : {'property', 'method'}
overwrite : bool, default False
   Overwrite the method/property in the target class if it exists.
accessor_mapping: Callable, default lambda x: x
    Callable to map the delegate's function to the cls' function.
raise_on_missing: bool, default True
    Raise if an accessor does not exist on delegate.
    False skips the missing accessor.

Returns
-------
callable
    A class decorator.

Examples
--------
@delegate_names(Categorical, ["categories", "ordered"], "property")
class CategoricalAccessor(PandasDelegate):
    [...]
c           	     ó0   >• U R                  TTTTTTS9  U $ )N)rl   rY   rm   )rn   )ri   rY   rj   rZ   rl   rm   rk   s    €€€€€€r   Úadd_delegate_accessorsÚ.delegate_names.<locals>.add_delegate_accessors¼   s/   ø€ Ø×#Ñ#ØØØØØ-Ø-ð 	$ñ 	
ð ˆ
r   r&   )rZ   rj   rk   rl   rY   rm   rx   s   `````` r   Údelegate_namesrz   ”   s   ý€ ÷P	ò 	ð "Ð!r   c                  ó(   • \ rS rSrSrSS jrS rSrg)ÚAccessoréÊ   aa  
Custom property-like object.

A descriptor for accessors.

Parameters
----------
name : str
    Namespace that will be accessed under, e.g. ``df.foo``.
accessor : cls
    Class with the extension methods.

Notes
-----
For accessor, The class's __init__ method assumes that one of
``Series``, ``DataFrame`` or ``Index`` as the
single argument ``data``.
c                ó   • Xl         X l        g rE   )Ú_nameÚ	_accessor)r   r8   r   s      r   Ú__init__ÚAccessor.__init__Þ   s   € ØŒ
Ø!�r   c                óB   • Uc  U R                   $ U R                  U5      $ rE   )r€   )r   Úobjri   s      r   Ú__get__ÚAccessor.__get__â   s    € Ø‰;à—>‘>Ð!Ø�~‰~˜cÓ"Ð"r   )r€   r   Nrp   )r)   r*   r+   r,   rX   r�   r…   r/   r&   r   r   r|   r|   Ê   s   † ñô&"õ#r   r|   c                ó   ^ ^• SUU 4S jjnU$ )a%  
Register a custom accessor on objects.

Parameters
----------
name : str
    Name under which the accessor should be registered. A warning is issued
    if this name conflicts with a preexisting attribute.

Returns
-------
callable
    A class decorator.

See Also
--------
register_dataframe_accessor : Register a custom accessor on DataFrame objects.
register_series_accessor : Register a custom accessor on Series objects.
register_index_accessor : Register a custom accessor on Index objects.

Notes
-----
This function allows you to register a custom-defined accessor class
for pandas objects (DataFrame, Series, or Index).
The requirements for the accessor class are as follows:

* Must contain an init method that:

  * accepts a single object

  * raises an AttributeError if the object does not have correctly
    matching inputs for the accessor

* Must contain a method for each access pattern.

  * The methods should be able to take any argument signature.

  * Accessible using the @property decorator if no additional arguments are
    needed.

c           	     óì   >• [        TT5      (       a/  [        R                  " SU < ST< ST< S3[        [	        5       S9  [        TT[        TU 5      5        TR                  R                  T5        U $ )Nzregistration of accessor z under name z
 for type z: is overriding a preexisting attribute with the same name.)Ú
stacklevel)	r   ÚwarningsÚwarnÚUserWarningr   rh   r|   r   Úadd)r   ri   r8   s    €€r   Ú	decoratorÚ%_register_accessor.<locals>.decorator  sq   ø€ Ü�3˜×ÑÜ�MŠMØ+¨H©<°|Ø‘(˜* S¡Gð ,0ð1ô Ü+Ó-òô 	��Tœ8 D¨(Ó3Ô4Ø�‰×Ñ˜4Ô Øˆr   )r   r	   r'   r	   r&   )r8   ri   rŽ   s   `` r   Ú_register_accessorr�   î   s   ù€ ÷Zð ð Ðr   aä  
An accessor that only accepts integers could
have a class defined like this:

>>> @pd.api.extensions.register_dataframe_accessor("int_accessor")
... class IntAccessor:
...     def __init__(self, pandas_obj):
...         if not all(pandas_obj[col].dtype == 'int64' for col in pandas_obj.columns):
...             raise AttributeError("All columns must contain integer values only")
...         self._obj = pandas_obj
...
...     def sum(self):
...         return self._obj.sum()
...
>>> df = pd.DataFrame([[1, 2], ['x', 'y']])
>>> df.int_accessor
Traceback (most recent call last):
...
AttributeError: All columns must contain integer values only.
>>> df = pd.DataFrame([[1, 2], [3, 4]])
>>> df.int_accessor.sum()
0    4
1    6
dtype: int64zpandas.api.extensionsc                ó$   • SSK Jn  [        X5      $ )a0  
Register a custom accessor on DataFrame objects.

Parameters
----------
name : str
    Name under which the accessor should be registered. A warning is issued
    if this name conflicts with a preexisting attribute.

Returns
-------
callable
    A class decorator.

See Also
--------
register_dataframe_accessor : Register a custom accessor on DataFrame objects.
register_series_accessor : Register a custom accessor on Series objects.
register_index_accessor : Register a custom accessor on Index objects.

Notes
-----
This function allows you to register a custom-defined accessor class for DataFrame.
The requirements for the accessor class are as follows:

* Must contain an init method that:

  * accepts a single DataFrame object

  * raises an AttributeError if the DataFrame object does not have correctly
    matching inputs for the accessor

* Must contain a method for each access pattern.

  * The methods should be able to take any argument signature.

  * Accessible using the @property decorator if no additional arguments are
    needed.

Examples
--------
An accessor that only accepts integers could
have a class defined like this:

>>> @pd.api.extensions.register_dataframe_accessor("int_accessor")
... class IntAccessor:
...     def __init__(self, pandas_obj):
...         if not all(
...             pandas_obj[col].dtype == "int64" for col in pandas_obj.columns
...         ):
...             raise AttributeError("All columns must contain integer values only")
...         self._obj = pandas_obj
...
...     def sum(self):
...         return self._obj.sum()
>>> df = pd.DataFrame([[1, 2], ["x", "y"]])
>>> df.int_accessor
Traceback (most recent call last):
...
AttributeError: All columns must contain integer values only.
>>> df = pd.DataFrame([[1, 2], [3, 4]])
>>> df.int_accessor.sum()
0    4
1    6
dtype: int64
r   )Ú	DataFrame)Úpandasr’   r�   )r8   r’   s     r   Úregister_dataframe_accessorr”   E  s   € õH !ä˜dÓ.Ð.r   a„  
An accessor that only accepts integers could
have a class defined like this:

>>> @pd.api.extensions.register_series_accessor("int_accessor")
... class IntAccessor:
...     def __init__(self, pandas_obj):
...         if not pandas_obj.dtype == 'int64':
...             raise AttributeError("The series must contain integer data only")
...         self._obj = pandas_obj
...
...     def sum(self):
...         return self._obj.sum()
...
>>> df = pd.Series([1, 2, 'x'])
>>> df.int_accessor
Traceback (most recent call last):
...
AttributeError: The series must contain integer data only.
>>> df = pd.Series([1, 2, 3])
>>> df.int_accessor.sum()
6c                ó$   • SSK Jn  [        X5      $ )a¦  
Register a custom accessor on Series objects.

Parameters
----------
name : str
    Name under which the accessor should be registered. A warning is issued
    if this name conflicts with a preexisting attribute.

Returns
-------
callable
    A class decorator.

See Also
--------
register_dataframe_accessor : Register a custom accessor on DataFrame objects.
register_series_accessor : Register a custom accessor on Series objects.
register_index_accessor : Register a custom accessor on Index objects.

Notes
-----
This function allows you to register a custom-defined accessor class for Series.
The requirements for the accessor class are as follows:

* Must contain an init method that:

  * accepts a single Series object

  * raises an AttributeError if the Series object does not have correctly
    matching inputs for the accessor

* Must contain a method for each access pattern.

  * The methods should be able to take any argument signature.

  * Accessible using the @property decorator if no additional arguments are
    needed.

Examples
--------
An accessor that only accepts integers could
have a class defined like this:

>>> @pd.api.extensions.register_series_accessor("int_accessor")
... class IntAccessor:
...     def __init__(self, pandas_obj):
...         if not pandas_obj.dtype == "int64":
...             raise AttributeError("The series must contain integer data only")
...         self._obj = pandas_obj
...
...     def sum(self):
...         return self._obj.sum()
>>> df = pd.Series([1, 2, "x"])
>>> df.int_accessor
Traceback (most recent call last):
...
AttributeError: The series must contain integer data only.
>>> df = pd.Series([1, 2, 3])
>>> df.int_accessor.sum()
6
r   )ÚSeries)r“   r–   r�   )r8   r–   s     r   Úregister_series_accessorr—   ¦  s   € õ@ ä˜dÓ+Ð+r   a[  
An accessor that only accepts integers could
have a class defined like this:

>>> @pd.api.extensions.register_index_accessor("int_accessor")
... class IntAccessor:
...     def __init__(self, pandas_obj):
...         if not all(isinstance(x, int) for x in pandas_obj):
...             raise AttributeError("The index must only be an integer value")
...         self._obj = pandas_obj
...
...     def even(self):
...         return [x for x in self._obj if x % 2 == 0]
>>> df = pd.DataFrame.from_dict(
...     {"row1": {"1": 1, "2": "a"}, "row2": {"1": 2, "2": "b"}}, orient="index"
... )
>>> df.index.int_accessor
Traceback (most recent call last):
...
AttributeError: The index must only be an integer value.
>>> df = pd.DataFrame(
...     {"col1": [1, 2, 3, 4], "col2": ["a", "b", "c", "d"]}, index=[1, 2, 5, 8]
... )
>>> df.index.int_accessor.even()
[2, 8]c                ó$   • SSK Jn  [        X5      $ )a}  
Register a custom accessor on Index objects.

Parameters
----------
name : str
    Name under which the accessor should be registered. A warning is issued
    if this name conflicts with a preexisting attribute.

Returns
-------
callable
    A class decorator.

See Also
--------
register_dataframe_accessor : Register a custom accessor on DataFrame objects.
register_series_accessor : Register a custom accessor on Series objects.
register_index_accessor : Register a custom accessor on Index objects.

Notes
-----
This function allows you to register a custom-defined accessor class for Index.
The requirements for the accessor class are as follows:

* Must contain an init method that:

  * accepts a single Index object

  * raises an AttributeError if the Index object does not have correctly
    matching inputs for the accessor

* Must contain a method for each access pattern.

  * The methods should be able to take any argument signature.

  * Accessible using the @property decorator if no additional arguments are
    needed.

Examples
--------
An accessor that only accepts integers could
have a class defined like this:

>>> @pd.api.extensions.register_index_accessor("int_accessor")
... class IntAccessor:
...     def __init__(self, pandas_obj):
...         if not all(isinstance(x, int) for x in pandas_obj):
...             raise AttributeError("The index must only be an integer value")
...         self._obj = pandas_obj
...
...     def even(self):
...         return [x for x in self._obj if x % 2 == 0]
>>> df = pd.DataFrame.from_dict(
...     {"row1": {"1": 1, "2": "a"}, "row2": {"1": 2, "2": "b"}}, orient="index"
... )
>>> df.index.int_accessor
Traceback (most recent call last):
...
AttributeError: The index must only be an integer value.
>>> df = pd.DataFrame(
...     {"col1": [1, 2, 3, 4], "col2": ["a", "b", "c", "d"]}, index=[1, 2, 5, 8]
... )
>>> df.index.int_accessor.even()
[2, 8]
r   r
   )r“   r   r�   )r8   r   s     r   Úregister_index_accessorr™     s   € õH ä˜dÓ*Ð*r   )
rj   r(   rk   rg   rl   rr   rY   rs   rm   rr   )r8   rg   ri   ztype[NDFrame | Index]r'   úCallable[[TypeT], TypeT])r8   rg   r'   rš   ) rX   Ú
__future__r   ra   Útypingr   r   rŠ   Úpandas.util._decoratorsr   Úpandas.util._exceptionsr   Úcollections.abcr   Úpandas._typingr	   r“   r   Úpandas.core.genericr   r   r2   rz   r|   ÚCachedAccessorr�   Ú_register_df_examplesr”   Ú_register_series_examplesr—   Ú_register_index_examplesr™   r&   r   r   Ú<module>r¦      s+  ðñõ #ã ÷ó õõ 5æÝ(å$åÝ+÷ñ ÷<T&ñ T&ðv Ù-8Ø!ð3"àð3"ð 
ð3"ð ð	3"ð
 +ð3"ð õ3"÷l#ñ #ðB €ð:Ø
ð:Ø)ð:àô:ðzÐ ñ4 Ð#Ó$óE/ó %ðE/ðPÐ ñ0 Ð#Ó$óA,ó %ðA,ðH
Ð ñ6 Ð#Ó$óE+ó %ñE+r   