
    I jC                    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    e/root/GenerationalWealth/GenerationalWealth/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XGD<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bz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=    5J $-KM>/
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24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24DDr   )fgetfsetdoc)r)   propertygetattr__doc__)r8   rM   rQ   accessor_mappingdelegates   `  r   _create_delegator_propertyJPandasDelegate._add_delegate_accessors.<locals>._create_delegator_propertyj   sI    9E  $G#GH&6t&<=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   fSPandasDelegate._add_delegate_accessors.<locals>._create_delegator_method.<locals>.f}   s    ,,TCDCFCCr   )rW   	functoolswraps)r8   methodr_   rY   rZ   s   `  r   _create_delegator_methodHPandasDelegate._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&6t&<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MM+H<|(*SG ,01 +- 	T8D(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   