
    I j"                       S SK Jr  S SKrS SKJr  S SKJrJr  S SKr	S SK
Jr  S SKJs  Js  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  S SKJr  S SKJr  S SK J!r!J"r"J#r#  S SK$J%r%J&r&  S SK'J(r(  S SK)J*r*J+r+  S SK,J-r-J.r.  S SK/J0r0J1r1  \(       a  S SK2J3r3J4r4J5r5  S SK6J7r7J8r8  S SK9J:r:            SS jr;      S S jr<\" S5       " S S\05      5       r=\" S5       " S S\1\=5      5       r> " S S\=5      r?g)!    )annotationsN)partial)TYPE_CHECKINGcast)	Timedelta)
set_module)is_datetime64_dtypeis_numeric_dtype)DatetimeTZDtype)	ABCSeries)isna)common)dtype_to_unit)BaseIndexerExponentialMovingWindowIndexerGroupbyIndexer)get_jit_argumentsmaybe_use_numba)zsqrt)generate_numba_ewm_funcgenerate_numba_ewm_table_func)EWMMeanStategenerate_online_numba_ewma_func)
BaseWindowBaseWindowGroupby)TimedeltaConvertibleTypesTimeUnitnpt)	DataFrameSeries)NDFramec                   [         R                  " XX#5      nUS:  a  [        S5      eU b  U S:  a  [        S5      eOUb  US:  a  [        S5      eUS-
  S-  n O{UbJ  US::  a  [        S5      eS[        R                  " [        R
                  " S5      U-  5      -
  nSU-  S-
  n O.Ub   US::  d  US:  a  [        S	5      eSU-
  U-  n O[        S
5      e[        U 5      $ )N   z8comass, span, halflife, and alpha are mutually exclusiver   z comass must satisfy: comass >= 0zspan must satisfy: span >= 1   z#halflife must satisfy: halflife > 0g      ?z"alpha must satisfy: 0 < alpha <= 1z1Must pass one of comass, span, halflife, or alpha)r   count_not_none
ValueErrornpexplogfloat)comassspanhalflifealphavalid_countdecays         g/root/GenerationalWealth/GenerationalWealth/venv/lib/python3.13/site-packages/pandas/core/window/ewm.pyget_center_of_massr2   ?   s     ''hFKQSTT A:?@@ 		!8;<<(a		q=BCCBFF266#;122UQ		A:ABBe)u$LMM=    c                   [        U R                  5      n[        SU5      n[        U [        5      (       a  U R
                  n [        R                  " U R                  [        R                  5      [        R                  S9n[        [        U5      R                  U5      R                  5      n[        R                  " U5      U-  $ )a  
Return the diff of the times divided by the half-life. These values are used in
the calculation of the ewm mean.

Parameters
----------
times : np.ndarray, Series
    Times corresponding to the observations. Must be monotonically increasing
    and ``datetime64[ns]`` dtype.
halflife : float, str, timedelta, optional
    Half-life specifying the decay

Returns
-------
np.ndarray
    Diff of the times divided by the half-life
r   dtype)r   r6   r   
isinstancer   _valuesr'   asarrayviewint64float64r*   r   as_unit_valuediff)timesr-   unit_times	_halflifes        r1   _calculate_deltasrD   `   s    * %D
D!D%##ZZ

288,BJJ?Fi)11$7>>?I776?Y&&r3   zpandas.api.typingc                  X  ^  \ rS rSrSr/ SQr         SSS.                     SU 4S jjjjr        SS jrSS jr S   SS	 jjr	SU 4S
 jjr
\
r   S SS jjr   S SS jjrSSS jjrSSS jjr    S       SS jjr   S     S S jjrSrU =r$ )!ExponentialMovingWindow~   a  
Provide exponentially weighted (EW) calculations.

Exactly one of ``com``, ``span``, ``halflife``, or ``alpha`` must be
provided if ``times`` is not provided. If ``times`` is provided and ``adjust=True``,
``halflife`` and one of ``com``, ``span`` or ``alpha`` may be provided.
If ``times`` is provided and ``adjust=False``, ``halflife`` must be the only
provided decay-specification parameter.

Parameters
----------
com : float, optional
    Specify decay in terms of center of mass

    :math:`\alpha = 1 / (1 + com)`, for :math:`com \geq 0`.

span : float, optional
    Specify decay in terms of span

    :math:`\alpha = 2 / (span + 1)`, for :math:`span \geq 1`.

halflife : float, str, timedelta, optional
    Specify decay in terms of half-life

    :math:`\alpha = 1 - \exp\left(-\ln(2) / halflife\right)`, for
    :math:`halflife > 0`.

    If ``times`` is specified, a timedelta convertible unit over which an
    observation decays to half its value. Only applicable to ``mean()``,
    and halflife value will not apply to the other functions.

alpha : float, optional
    Specify smoothing factor :math:`\alpha` directly

    :math:`0 < \alpha \leq 1`.

min_periods : int, default 0
    Minimum number of observations in window required to have a value;
    otherwise, result is ``np.nan``.

adjust : bool, default True
    Divide by decaying adjustment factor in beginning periods to account
    for imbalance in relative weightings (viewing EWMA as a moving average).

    - When ``adjust=True`` (default), the EW function is calculated using weights
      :math:`w_i = (1 - \alpha)^i`. For example, the EW moving average of the series
      [:math:`x_0, x_1, ..., x_t`] would be:

    .. math::
        y_t = \frac{x_t + (1 - \alpha)x_{t-1} + (1 - \alpha)^2 x_{t-2} + ... + (1 -
        \alpha)^t x_0}{1 + (1 - \alpha) + (1 - \alpha)^2 + ... + (1 - \alpha)^t}

    - When ``adjust=False``, the exponentially weighted function is calculated
      recursively:

    .. math::
        \begin{split}
            y_0 &= x_0\\
            y_t &= (1 - \alpha) y_{t-1} + \alpha x_t,
        \end{split}
ignore_na : bool, default False
    Ignore missing values when calculating weights.

    - When ``ignore_na=False`` (default), weights are based on absolute positions.
      For example, the weights of :math:`x_0` and :math:`x_2` used in calculating
      the final weighted average of [:math:`x_0`, None, :math:`x_2`] are
      :math:`(1-\alpha)^2` and :math:`1` if ``adjust=True``, and
      :math:`(1-\alpha)^2` and :math:`\alpha` if ``adjust=False``.

    - When ``ignore_na=True``, weights are based
      on relative positions. For example, the weights of :math:`x_0` and :math:`x_2`
      used in calculating the final weighted average of
      [:math:`x_0`, None, :math:`x_2`] are :math:`1-\alpha` and :math:`1` if
      ``adjust=True``, and :math:`1-\alpha` and :math:`\alpha` if ``adjust=False``.

times : np.ndarray, Series, default None

    Only applicable to ``mean()``.

    Times corresponding to the observations. Must be monotonically increasing and
    ``datetime64[ns]`` dtype.

    If 1-D array like, a sequence with the same shape as the observations.

method : str {'single', 'table'}, default 'single'
    Execute the rolling operation per single column or row (``'single'``)
    or over the entire object (``'table'``).

    This argument is only implemented when specifying ``engine='numba'``
    in the method call.

    Only applicable to ``mean()``

Returns
-------
pandas.api.typing.ExponentialMovingWindow
    An instance of ExponentialMovingWindow for further exponentially weighted (EW)
    calculations, e.g. using the ``mean`` method.

See Also
--------
rolling : Provides rolling window calculations.
expanding : Provides expanding transformations.

Notes
-----
See :ref:`Windowing Operations <window.exponentially_weighted>`
for further usage details and examples.

Examples
--------
>>> df = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]})
>>> df
     B
0  0.0
1  1.0
2  2.0
3  NaN
4  4.0

>>> df.ewm(com=0.5).mean()
          B
0  0.000000
1  0.750000
2  1.615385
3  1.615385
4  3.670213
>>> df.ewm(alpha=2 / 3).mean()
          B
0  0.000000
1  0.750000
2  1.615385
3  1.615385
4  3.670213

**adjust**

>>> df.ewm(com=0.5, adjust=True).mean()
          B
0  0.000000
1  0.750000
2  1.615385
3  1.615385
4  3.670213
>>> df.ewm(com=0.5, adjust=False).mean()
          B
0  0.000000
1  0.666667
2  1.555556
3  1.555556
4  3.650794

**ignore_na**

>>> df.ewm(com=0.5, ignore_na=True).mean()
          B
0  0.000000
1  0.750000
2  1.615385
3  1.615385
4  3.225000
>>> df.ewm(com=0.5, ignore_na=False).mean()
          B
0  0.000000
1  0.750000
2  1.615385
3  1.615385
4  3.670213

**times**

Exponentially weighted mean with weights calculated with a timedelta ``halflife``
relative to ``times``.

>>> times = ['2020-01-01', '2020-01-03', '2020-01-10', '2020-01-15', '2020-01-17']
>>> df.ewm(halflife='4 days', times=pd.DatetimeIndex(times)).mean()
          B
0  0.000000
1  0.585786
2  1.523889
3  1.523889
4  3.233686
)	comr,   r-   r.   min_periodsadjust	ignore_nar@   methodN	selectionc          
       > [         TU ]  UUc  SO[        [        U5      S5      S SS U
US9  X l        X0l        X@l        XPl        Xpl        Xl	        Xl
        U R                  Gb  [        U R                  SS 5      n[        U5      (       d   [        U[        5      (       d  [        S5      e[!        U R                  5      [!        U5      :w  a  [        S5      e[        U R                  ["        [$        R&                  [(        R*                  45      (       d  [        S5      e[-        U R                  5      R/                  5       (       a  [        S5      e[1        U R                  U R                  5      U l        [4        R6                  " U R                  U R
                  U R                  5      S	:  aN  U R                  (       d  [9        S
5      e[;        U R                  U R
                  S U R                  5      U l        g SU l        g U R                  bI  [        U R                  ["        [$        R&                  [(        R*                  45      (       a  [        S5      e[(        R>                  " [        U R@                  RB                  S	   S-
  S	5      [(        RD                  S9U l        [;        U R                  U R
                  U R                  U R                  5      U l        g )Nr#   F)objrI   oncenterclosedrL   rN   r6   ztimes must be datetime64 dtype.z,times must be the same length as the object.z/halflife must be a timedelta convertible objectz$Cannot convert NaT values to integerr   zRNone of com, span, or alpha can be specified if times is provided and adjust=Falseg      ?zKhalflife can only be a timedelta convertible argument if times is not None.r5   )#super__init__maxintrH   r,   r-   r.   rJ   rK   r@   getattrr	   r7   r   r&   lenstrdatetime	timedeltar'   timedelta64r   anyrD   _deltasr   r%   NotImplementedErrorr2   _comonesrP   shaper<   )selfrP   rH   r,   r-   r.   rI   rJ   rK   r@   rL   rN   times_dtype	__class__s                r1   rU    ExponentialMovingWindow.__init__D  s0    	(0c#k:JA6N 	 	
 	 
"
::!!$**gt<K#K00k?;; !BCC4::#c(* !OPPdmmc83E3Er~~-VWW !RSSDJJ##%% !GHH,TZZGDL $$TXXtyy$**EI{{-=  /txxD$**U		}}(ZX%7%7H. . !) 
 773txx~~a'81'<a#@

SDL* 		

DIr3   c                    g N )rd   startendnum_valss       r1   _check_window_bounds,ExponentialMovingWindow._check_window_bounds  s    
 	r3   c                    [        5       $ )zK
Return an indexer class that will compute the window start and end bounds
)r   rd   s    r1   _get_window_indexer+ExponentialMovingWindow._get_window_indexer  s     .//r3   c                    [        U R                  U R                  U R                  U R                  U R
                  U R                  U R                  U R                  U R                  UUU R                  S9$ )a  
Return an ``OnlineExponentialMovingWindow`` object to calculate
exponentially moving window aggregations in an online method.

Parameters
----------
engine: str, default ``'numba'``
    Execution engine to calculate online aggregations.
    Applies to all supported aggregation methods.

engine_kwargs : dict, default None
    Applies to all supported aggregation methods.

    * For ``'numba'`` engine, the engine can accept ``nopython``, ``nogil``
      and ``parallel`` dictionary keys. The values must either be ``True`` or
      ``False``. The default ``engine_kwargs`` for the ``'numba'`` engine is
      ``{'nopython': True, 'nogil': False, 'parallel': False}`` and will be
      applied to the function

Returns
-------
OnlineExponentialMovingWindow
)rP   rH   r,   r-   r.   rI   rJ   rK   r@   engineengine_kwargsrN   )OnlineExponentialMovingWindowrP   rH   r,   r-   r.   rI   rJ   rK   r@   
_selection)rd   ru   rv   s      r1   onlineExponentialMovingWindow.online  s_    4 -]]**((;;nn**'oo
 	
r3   c                ,   > [         TU ]  " U/UQ70 UD6$ )a  
Aggregate using one or more operations over the specified axis.

Parameters
----------
func : function, str, list or dict
    Function to use for aggregating the data. If a function, must either
    work when passed a Series/Dataframe or when passed to
    Series/Dataframe.apply.

    Accepted combinations are:

    - function
    - string function name
    - list of functions and/or function names, e.g. ``[np.sum, 'mean']``
    - dict of axis labels -> functions, function names or list of such.
*args
    Positional arguments to pass to `func`.
**kwargs
    Keyword arguments to pass to `func`.

Returns
-------
scalar, Series or DataFrame

    The return can be:

    * scalar : when Series.agg is called with single function
    * Series : when DataFrame.agg is called with a single function
    * DataFrame : when DataFrame.agg is called with several functions

See Also
--------
pandas.DataFrame.rolling.aggregate

Notes
-----
The aggregation operations are always performed over an axis, either the
index (default) or the column axis. This behavior is different from
`numpy` aggregation functions (`mean`, `median`, `prod`, `sum`, `std`,
`var`), where the default is to compute the aggregation of the flattened
array, e.g., ``numpy.mean(arr_2d)`` as opposed to
``numpy.mean(arr_2d, axis=0)``.

`agg` is an alias for `aggregate`. Use the alias.

Functions that mutate the passed object can produce unexpected
behavior or errors and are not supported. See :ref:`gotchas.udf-mutation`
for more details.

A passed user-defined-function will be passed a Series for evaluation.

If ``func`` defines an index relabeling, ``axis`` must be ``0`` or ``index``.

Examples
--------
>>> df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6], "C": [7, 8, 9]})
>>> df
   A  B  C
0  1  4  7
1  2  5  8
2  3  6  9

>>> df.ewm(alpha=0.5).mean()
          A         B         C
0  1.000000  4.000000  7.000000
1  1.666667  4.666667  7.666667
2  2.428571  5.428571  8.428571
)rT   	aggregate)rd   funcargskwargsrf   s       r1   r|   !ExponentialMovingWindow.aggregate  s     L w 7777r3   c           
        [        U5      (       aw  U R                  S:X  a  [        nO[        nU" S0 [	        U5      DU R
                  U R                  U R                  [        U R                  5      SS.D6nU R                  USS9$ US;   at  Ub  [        S5      eU R                  c  SOU R                  n[        [        R                  U R
                  U R                  U R                  USS9nU R                  USUS	9$ [        S
5      e)a  
Calculate the ewm (exponential weighted moment) mean.

Parameters
----------
numeric_only : bool, default False
    Include only float, int, boolean columns.

engine : str, default None
    * ``'cython'`` : Runs the operation through C-extensions from cython.
    * ``'numba'`` : Runs the operation through JIT compiled code from numba.
    * ``None`` : Defaults to ``'cython'`` or globally setting
      ``compute.use_numba``

engine_kwargs : dict, default None
    * For ``'cython'`` engine, there are no accepted ``engine_kwargs``
    * For ``'numba'`` engine, the engine can accept ``nopython``, ``nogil``
      and ``parallel`` dictionary keys. The values must either be ``True`` or
      ``False``. The default ``engine_kwargs`` for the ``'numba'`` engine is
      ``{'nopython': True, 'nogil': False, 'parallel': False}``

Returns
-------
Series or DataFrame
    Return type is the same as the original object with ``np.float64`` dtype.

See Also
--------
Series.ewm : Calling ewm with Series data.
DataFrame.ewm : Calling ewm with DataFrames.
Series.mean : Aggregating mean for Series.
DataFrame.mean : Aggregating mean for DataFrame.

Notes
-----
See :ref:`window.numba_engine` and :ref:`enhancingperf.numba` for
extended documentation and performance considerations for the Numba engine.

Examples
--------
>>> ser = pd.Series([1, 2, 3, 4])
>>> ser.ewm(alpha=0.2).mean()
0    1.000000
1    1.555556
2    2.147541
3    2.775068
dtype: float64
singleTrH   rJ   rK   deltas	normalizemeannamecythonNN+cython engine does not accept engine_kwargsr   numeric_only)engine must be either 'numba' or 'cython'rj   )r   rL   r   r   r   ra   rJ   rK   tupler_   _applyr&   r@   r   window_aggregationsewmrd   r   ru   rv   r}   ewm_funcr   window_funcs           r1   r   ExponentialMovingWindow.mean  s    l 6""{{h&.4 #M2II{{..T\\*H ;;xf;55''( !NOO!ZZ/TT\\F!#''II{{..K ;;{l;SSHIIr3   c           
        U R                   (       d  [        S5      eU R                  b  [        S5      e[        U5      (       aw  U R                  S:X  a  [
        nO[        nU" S0 [        U5      DU R                  U R                   U R                  [        U R                  5      SS.D6nU R                  USS9$ US	;   at  Ub  [        S
5      eU R                  c  SOU R                  n[        [        R                   U R                  U R                   U R                  USS9nU R                  USUS9$ [        S5      e)a  
Calculate the ewm (exponential weighted moment) sum.

Parameters
----------
numeric_only : bool, default False
    Include only float, int, boolean columns.
engine : str, default None
    * ``'cython'`` : Runs the operation through C-extensions from cython.
    * ``'numba'`` : Runs the operation through JIT compiled code from numba.
    * ``None`` : Defaults to ``'cython'`` or globally setting
      ``compute.use_numba``
engine_kwargs : dict, default None
    * For ``'cython'`` engine, there are no accepted ``engine_kwargs``
    * For ``'numba'`` engine, the engine can accept ``nopython``, ``nogil``
      and ``parallel`` dictionary keys. The values must either be ``True`` or
      ``False``. The default ``engine_kwargs`` for the ``'numba'`` engine is
      ``{'nopython': True, 'nogil': False, 'parallel': False}``

Returns
-------
Series or DataFrame
    Return type is the same as the original object with ``np.float64`` dtype.

See Also
--------
Series.ewm : Calling ewm with Series data.
DataFrame.ewm : Calling ewm with DataFrames.
Series.sum : Aggregating sum for Series.
DataFrame.sum : Aggregating sum for DataFrame.

Notes
-----
See :ref:`window.numba_engine` and :ref:`enhancingperf.numba` for extended
documentation and performance considerations for the Numba engine.

Examples
--------
>>> ser = pd.Series([1, 2, 3, 4])
>>> ser.ewm(alpha=0.2).sum()
0    1.000
1    2.800
2    5.240
3    8.192
dtype: float64
z(sum is not implemented with adjust=FalseNz!sum is not implemented with timesr   Fr   sumr   r   r   r   r   rj   )rJ   r`   r@   r   rL   r   r   r   ra   rK   r   r_   r   r&   r   r   r   r   s           r1   r   ExponentialMovingWindow.sume  s$   h {{%&PQQ::!%&IJJ6""{{h&.4 #M2II{{..T\\*H ;;xe;44''( !NOO!ZZ/TT\\F!#''II{{..K ;;{\;RRHIIr3   c                .   U(       a_  U R                   R                  S:X  aE  [        U R                   R                  5      (       d!  [	        [        U 5      R                   S35      eU R                  b  [	        S5      e[        U R                  XS95      $ )a  
Calculate the ewm (exponential weighted moment) standard deviation.

Parameters
----------
bias : bool, default False
    Use a standard estimation bias correction.
numeric_only : bool, default False
    Include only float, int, boolean columns.

Returns
-------
Series or DataFrame
    Return type is the same as the original object with ``np.float64`` dtype.

See Also
--------
Series.ewm : Calling ewm with Series data.
DataFrame.ewm : Calling ewm with DataFrames.
Series.std : Aggregating std for Series.
DataFrame.std : Aggregating std for DataFrame.

Examples
--------
>>> ser = pd.Series([1, 2, 3, 4])
>>> ser.ewm(alpha=0.2).std()
0         NaN
1    0.707107
2    0.995893
3    1.277320
dtype: float64
r#   z$.std does not implement numeric_onlyz!std is not implemented with times)biasr   )
_selected_objndimr
   r6   r`   type__name__r@   r   varrd   r   r   s      r1   stdExponentialMovingWindow.std  s    D ""''1,$T%7%7%=%=>> &:&&''KL  ::!%&IJJTXX4XCDDr3   c                   ^ U R                   b  [        S5      e[        R                  n[	        UU R
                  U R                  U R                  US9mU4S jnU R                  USUS9$ )a  
Calculate the ewm (exponential weighted moment) variance.

Parameters
----------
bias : bool, default False
    Use a standard estimation bias correction.
numeric_only : bool, default False
    Include only float, int, boolean columns.

Returns
-------
Series or DataFrame
    Return type is the same as the original object with ``np.float64`` dtype.

See Also
--------
Series.ewm : Calling ewm with Series data.
DataFrame.ewm : Calling ewm with DataFrames.
Series.var : Aggregating var for Series.
DataFrame.var : Aggregating var for DataFrame.

Examples
--------
>>> ser = pd.Series([1, 2, 3, 4])
>>> ser.ewm(alpha=0.2).var()
0         NaN
1    0.500000
2    0.991803
3    1.631547
dtype: float64
z!var is not implemented with times)rH   rJ   rK   r   c                   > T" XX#U 5      $ ri   rj   )valuesbeginrl   rI   wfuncs       r1   var_func-ExponentialMovingWindow.var.<locals>.var_func  s    &AAr3   r   r   )	r@   r`   r   ewmcovr   ra   rJ   rK   r   )rd   r   r   r   r   r   s        @r1   r   ExponentialMovingWindow.var  si    B ::!%&IJJ)00		;;nn
	B {{8%l{KKr3   c                   ^ ^^ T R                   b  [        S5      eSSKJm  T R	                  SU5        UUU 4S jnT R                  T R                  XXT5      $ )a  
Calculate the ewm (exponential weighted moment) sample covariance.

Parameters
----------
other : Series or DataFrame , optional
    If not supplied then will default to self and produce pairwise
    output.
pairwise : bool, default None
    If False then only matching columns between self and other will be
    used and the output will be a DataFrame.
    If True then all pairwise combinations will be calculated and the
    output will be a MultiIndex DataFrame in the case of DataFrame
    inputs. In the case of missing elements, only complete pairwise
    observations will be used.
bias : bool, default False
    Use a standard estimation bias correction.
numeric_only : bool, default False
    Include only float, int, boolean columns.

Returns
-------
Series or DataFrame
    Return type is the same as the original object with ``np.float64`` dtype.

See Also
--------
Series.ewm : Calling ewm with Series data.
DataFrame.ewm : Calling ewm with DataFrames.
Series.cov : Aggregating cov for Series.
DataFrame.cov : Aggregating cov for DataFrame.

Examples
--------
>>> ser1 = pd.Series([1, 2, 3, 4])
>>> ser2 = pd.Series([10, 11, 13, 16])
>>> ser1.ewm(alpha=0.2).cov(ser2)
0         NaN
1    0.500000
2    1.524590
3    3.408836
dtype: float64
z!cov is not implemented with timesr   r    covc                  > TR                  U 5      nTR                  U5      nTR                  5       nTR                  b  TR                  OUR                  nUR	                  [        U5      UTR                  TR                  TR                  S9u  pg[        R                  " UUUTR                  UTR                  TR                  TR                  T
5	      nT	" XR                  U R                  SS9$ )N
num_valuesrI   rR   rS   stepFindexr   copy)_prep_valuesrr   rI   window_sizeget_window_boundsrY   rR   rS   r   r   r   ra   rJ   rK   r   r   )xyx_arrayy_arraywindow_indexerrI   rk   rl   resultr    r   rd   s            r1   cov_func-ExponentialMovingWindow.cov.<locals>.cov_funcT  s    ''*G''*G!557N ##/   #// 
 (99w<'{{{{YY : JE )//   		F &aff5IIr3   r@   r`   pandasr    _validate_numeric_only_apply_pairwiser   )rd   otherpairwiser   r   r   r    s   `  `  @r1   r   ExponentialMovingWindow.cov  sW    d ::!%&IJJ!##E<8	J> ##
 	
r3   c                   ^ ^ T R                   b  [        S5      eSSKJm  T R	                  SU5        UU 4S jnT R                  T R                  XXC5      $ )a  
Calculate the ewm (exponential weighted moment) sample correlation.

Parameters
----------
other : Series or DataFrame, optional
    If not supplied then will default to self and produce pairwise
    output.
pairwise : bool, default None
    If False then only matching columns between self and other will be
    used and the output will be a DataFrame.
    If True then all pairwise combinations will be calculated and the
    output will be a MultiIndex DataFrame in the case of DataFrame
    inputs. In the case of missing elements, only complete pairwise
    observations will be used.
numeric_only : bool, default False
    Include only float, int, boolean columns.

Returns
-------
Series or DataFrame
    Return type is the same as the original object with ``np.float64`` dtype.

See Also
--------
Series.ewm : Calling ewm with Series data.
DataFrame.ewm : Calling ewm with DataFrames.
Series.corr : Aggregating corr for Series.
DataFrame.corr : Aggregating corr for DataFrame.

Examples
--------
>>> ser1 = pd.Series([1, 2, 3, 4])
>>> ser2 = pd.Series([10, 11, 13, 16])
>>> ser1.ewm(alpha=0.2).corr(ser2)
0         NaN
1    1.000000
2    0.982821
3    0.977802
dtype: float64
z"corr is not implemented with timesr   r   corrc                *  >^
^^ TR                  U 5      nTR                  U5      nTR                  5       nTR                  b  TR                  OUR                  mUR	                  [        U5      TTR                  TR                  TR                  S9u  mm
U
UUU4S jn[        R                  " SS9   U" X#5      nU" X"5      nU" X35      nU[        Xx-  5      -  n	S S S 5        T" W	U R                  U R                  SS9$ ! , (       d  f       N+= f)Nr   c                |   > [         R                  " U TTTUTR                  TR                  TR                  S5	      $ )NT)r   r   ra   rJ   rK   )XYrl   rI   rd   rk   s     r1   _cov<ExponentialMovingWindow.corr.<locals>.cov_func.<locals>._cov  s=    *11IIKKNN
 
r3   ignore)allFr   )r   rr   rI   r   r   rY   rR   rS   r   r'   errstater   r   r   )r   r   r   r   r   r   r   x_vary_varr   rl   rI   rk   r    rd   s             @@@r1   r   .ExponentialMovingWindow.corr.<locals>.cov_func  s   ''*G''*G!557N ##/   #// 
 (99w<'{{{{YY : JE3  *7,W.W.uU]33	 +
 &aff5II +*s   6)D
Dr   )rd   r   r   r   r   r    s   `    @r1   r   ExponentialMovingWindow.corrw  sX    ^ ::!%&JKK!##FL9#	JJ ##
 	
r3   )	ra   r_   rJ   r.   rH   r-   rK   r,   r@   )	NNNNr   TFNr   )rP   r!   rH   float | Noner,   r   r-   (float | TimedeltaConvertibleTypes | Noner.   r   rI   
int | NonerJ   boolrK   r   r@   np.ndarray | NDFrame | NonerL   rZ   returnNone)rk   
np.ndarrayrl   r   rm   rW   r   r   )r   r   )numbaN)ru   rZ   r   rw   ri   )FNN)r   r   FFr   r   r   r   NNFFr   DataFrame | Series | Noner   bool | Noner   r   r   r   NNFr   r   r   r   r   r   )r   
__module____qualname____firstlineno____doc___attributesrU   rn   rr   ry   r|   aggr   r   r   r   r   r   __static_attributes____classcell__rf   s   @r1   rF   rF   ~   s   vp
K !!=A""#-1J JJ J 	J
 ;J J  J J J +J J 
J JX&0<?	0 48'
'
	&'
RF8P C #	SJSJn #	UJUJn,E\/Lf ,0 $"Z
(Z
 Z
 	Z

 Z
| ,0 $"	]
(]
 ]
 	]
 ]
r3   rF   c                  t   ^  \ rS rSrSr\R                  \R                  -   rSS.SU 4S jjjrS	S jr	Sr
U =r$ )
ExponentialMovingWindowGroupbyi  z>
Provide an exponential moving window groupby implementation.
N)_grouperc               \  > [         TU ]  " U/UQ7SU0UD6  UR                  (       d  U R                  bv  [        R
                  " [        U R                  R                  R                  5       5      5      n[        U R                  R                  U5      U R                  5      U l        g g g )Nr   )rT   rU   emptyr@   r'   concatenatelistr   indicesr   rD   taker-   r_   )rd   rP   r   r~   r   groupby_orderrf   s         r1   rU   'ExponentialMovingWindowGroupby.__init__  s    AtAhA&AyyTZZ3NN40E0E0L0L0N+OPM,

.DL 4yr3   c                J    [        U R                  R                  [        S9nU$ )zk
Return an indexer class that will compute the window start and end bounds

Returns
-------
GroupbyIndexer
)groupby_indicesr   )r   r   r   r   )rd   r   s     r1   rr   2ExponentialMovingWindowGroupby._get_window_indexer  s&     ( MM119
 r3   )r_   r   r   )r   r   )r   r   r   r   r   rF   r   r   rU   rr   r   r   r   s   @r1   r   r     s8     *558I8U8UUK,0 	 	 r3   r   c                     ^  \ rS rSr          SSS.                       SU 4S jjjjrSS jrSS jrSSS jjr   S     SS jjr    S       SS	 jjr	SSS
 jjr
SSS.S jrSrU =r$ )rw   i  NrM   c                 > U	b  [        S5      e[        TU ]	  UUUUUUUUU	US9
  [        U R                  U R
                  U R                  UR                  5      U l        [        U
5      (       a  Xl
        Xl        g [        S5      e)Nz0times is not implemented with online operations.)
rP   rH   r,   r-   r.   rI   rJ   rK   r@   rN   z$'numba' is the only supported engine)r`   rT   rU   r   ra   rJ   rK   rc   _meanr   ru   rv   r&   )rd   rP   rH   r,   r-   r.   rI   rJ   rK   r@   ru   rv   rN   rf   s                r1   rU   &OnlineExponentialMovingWindow.__init__  s      %B  	# 	 	
 "$))T[[$..#))T
6"" K!.CDDr3   c                8    U R                   R                  5         g)z-
Reset the state captured by `update` calls.
N)r  resetrq   s    r1   r  #OnlineExponentialMovingWindow.reset!  s     	

r3   c                    [        S5      e)Nzaggregate is not implemented.r`   )rd   r}   r~   r   s       r1   r|   'OnlineExponentialMovingWindow.aggregate'  s    !"ABBr3   c                    [        S5      e)Nzstd is not implemented.r	  )rd   r   r~   r   s       r1   r   !OnlineExponentialMovingWindow.std*      !";<<r3   c                    [        S5      e)Nzcorr is not implemented.r	  )rd   r   r   r   s       r1   r   "OnlineExponentialMovingWindow.corr-  s     ""<==r3   c                    [        S5      e)Nzcov is not implemented.r	  )rd   r   r   r   r   s        r1   r   !OnlineExponentialMovingWindow.cov5  s     "";<<r3   c                    [        S5      e)Nzvar is not implemented.r	  r   s      r1   r   !OnlineExponentialMovingWindow.var>  r  r3   )updateupdate_timesc                  0 nU R                   R                  S:H  nUb  [        S5      e[        R                  " [        U R                   R                  S   S-
  S5      [        R                  S9nUb  U R                  R                  c  [        S5      eSnUR                  US	'   U(       a;  U R                  R                  [        R                  SS24   n	UR                  US
'   O%U R                  R                  n	UR                  US'   [        R                  " XR!                  5       45      n
OSnU R                   R                  US	'   U(       a  U R                   R                  US
'   OU R                   R                  US'   U R                   R#                  [        R                  5      R!                  5       n
[%        S0 ['        U R(                  5      D6nU R                  R+                  U(       a  U
OU
SS2[        R                  4   UU R,                  U5      nU(       d  UR/                  5       nXS nU R                   R0                  " U40 UD6nU$ )a3  
Calculate an online exponentially weighted mean.

Parameters
----------
update: DataFrame or Series, default None
    New values to continue calculating the
    exponentially weighted mean from the last values and weights.
    Values should be float64 dtype.

    ``update`` needs to be ``None`` the first time the
    exponentially weighted mean is calculated.

update_times: Series or 1-D np.ndarray, default None
    New times to continue calculating the
    exponentially weighted mean from the last values and weights.
    If ``None``, values are assumed to be evenly spaced
    in time.
    This feature is currently unsupported.

Returns
-------
DataFrame or Series

Examples
--------
>>> df = pd.DataFrame({"a": range(5), "b": range(5, 10)})
>>> online_ewm = df.head(2).ewm(0.5).online()
>>> online_ewm.mean()
      a     b
0  0.00  5.00
1  0.75  5.75
>>> online_ewm.mean(update=df.tail(3))
          a         b
2  1.615385  6.615385
3  2.550000  7.550000
4  3.520661  8.520661
>>> online_ewm.reset()
>>> online_ewm.mean()
      a     b
0  0.00  5.00
1  0.75  5.75
r$   Nz update_times is not implemented.r#   r   r5   z;Must call mean with update=None first before passing updater   columnsr   rj   )r   r   r`   r'   rb   rV   rc   r<   r  last_ewmr&   r   newaxisr  r   r   to_numpyastyper   r   rv   run_ewmrI   squeeze_constructor)rd   r  r  r~   r   result_kwargsis_frameupdate_deltasresult_from
last_valuenp_array	ewma_funcr   s                r1   r   "OnlineExponentialMovingWindow.meanA  s   X %%**a/#%&HII""((,q0!4BJJ
 zz""* Q  K%+\\M'"!ZZ00Q?
+1>>i(!ZZ00
(.f%~~z??3D&EFHK%)%7%7%=%=M'"+/+=+=+E+Ei((,(:(:(?(?f%))00<EEGH3 
 2 23
	 ## Hhq"**}&=	
 ^^%F%##00I=Ir3   )r  ru   rv   )
NNNNr   TFNr   N)rP   r!   rH   r   r,   r   r-   r   r.   r   rI   r   rJ   r   rK   r   r@   r   ru   rZ   rv   zdict[str, bool] | Noner   r   r   ri   )F)r   r   r   r   r   r   r   r   )r   r   r   r   rU   r  r|   r   r   r   r   r   r   r   r   s   @r1   rw   rw     sJ    !!=A""#-104%E %E%E %E 	%E
 ;%E %E  %E %E %E +%E %E .%E 
%E %ENC=
 ,0 $"	>(> > 	> ,0 $"=(= = 	=
 == "&D V Vr3   rw   )
r+   r   r,   r   r-   r   r.   r   r   r*   )r@   znp.ndarray | NDFramer-   r   r   znpt.NDArray[np.float64])@
__future__r   r[   	functoolsr   typingr   r   numpyr'   pandas._libs.tslibsr    pandas._libs.window.aggregations_libswindowaggregationsr   pandas.util._decoratorsr   pandas.core.dtypes.commonr	   r
   pandas.core.dtypes.dtypesr   pandas.core.dtypes.genericr   pandas.core.dtypes.missingr   pandas.corer   pandas.core.arrays.datetimeliker   pandas.core.indexers.objectsr   r   r   pandas.core.util.numba_r   r   pandas.core.window.commonr   pandas.core.window.numba_r   r   pandas.core.window.onliner   r   pandas.core.window.rollingr   r   pandas._typingr   r   r   r   r   r    pandas.core.genericr!   r2   rD   rF   r   rw   rj   r3   r1   <module>r@     s#   "  
  ) > > . 6 0 +  9 
 ,
   ,
  	
 B''6' '<  U
j U
 !U
p  %68O  !B^$; ^r3   