
    Pi&                       d dl mZ d dlZd dlmZ d dlmZmZ d dlZ	d dl
mZ d dlmc mc mZ d dlmZ d dlmZmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dl m!Z!m"Z"m#Z# d dl$m%Z%m&Z& d dl'm(Z( d dl)m*Z*m+Z+ d dl,m-Z-m.Z. d dl/m0Z0m1Z1 erd dl2m3Z3m4Z4m5Z5 d dl6m7Z7m8Z8 d dl9m:Z: d*dZ;d+d"Z< ed#           G d$ d%e0                      Z= ed#           G d& d'e1e=                      Z> G d( d)e=          Z?dS ),    )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)NDFramecomassfloat | Nonespanhalflifealphareturnfloatc                   t          j        | |||          }|dk    rt          d          | | dk     rt          d          n||dk     rt          d          |dz
  dz  } n|J|dk    rt          d          dt          j        t          j        d          |z            z
  }d|z  dz
  } n5|$|dk    s|dk    rt          d	          d|z
  |z  } nt          d
          t          |           S )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logr(   )r"   r$   r%   r&   valid_countdecays         j/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/pandas/core/window/ewm.pyget_center_of_massr4   ?   s#    'hFFKQSTTT A::?@@@ 		!88;<<<(a		q==BCCCBF26#;;1222UQ		A::ABBBe)u$LMMM==    timesnp.ndarray | NDFrame(float | TimedeltaConvertibleTypes | Nonenpt.NDArray[np.float64]c                   t          | j                  }t          d|          }t          | t                    r| j        } t          j        |                     t          j	                  t          j
                  }t          t          |                              |          j                  }t          j        |          |z  S )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   r<   r   
isinstancer   _valuesr.   asarrayviewint64float64r(   r   as_unit_valuediff)r6   r%   unit_times	_halflifes        r3   _calculate_deltasrI   `   s    * %%D
D!!D%## Z

28,,BJ???Fi))11$77>??I76??Y&&r5   zpandas.api.typingc                       e Zd ZdZg dZ	 	 	 	 	 	 	 	 	 d6ddd7 fdZd8d"Zd9d$Z	 d:d;d(Zd< fd)	Z	e	Z
	 	 	 d=d>d+Z	 	 	 d=d>d,Zd?d@d.Zd?d@d/Z	 	 	 	 dAdBd4Z	 	 	 dCdDd5Z xZS )EExponentialMovingWindowa  
    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_nar6   methodNr   TFsingle	selectionobjr!   rL   r#   r$   r%   r8   r&   rM   
int | NonerN   boolrO   r6   np.ndarray | NDFrame | NonerP   strr'   Nonec          	     z   t                                          ||dnt          t          |          d          d dd |
|           || _        || _        || _        || _        || _        || _	        |	| _
        | j
        t          | j
        dd           }t          |          s$t          |t                    st          d          t!          | j
                  t!          |          k    rt          d          t          | j        t"          t$          j        t(          j        f          st          d          t-          | j
                                                  rt          d          t1          | j
        | j                  | _        t5          j        | j        | j        | j                  d	k    r>| j        st9          d
          t;          | j        | j        d | j                  | _        d S d| _        d S | j        @t          | j        t"          t$          j        t(          j        f          rt          d          t)          j        t          | j         j!        d	         dz
  d	          t(          j"                  | _        t;          | j        | j        | j        | j                  | _        d S )Nr*   F)rT   rM   oncenterclosedrP   rS   r<   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.r;   )#super__init__maxintrL   r$   r%   r&   rN   rO   r6   getattrr	   r=   r   r-   lenrX   datetime	timedeltar.   timedelta64r   anyrI   _deltasr   r,   NotImplementedErrorr4   _comonesrT   shaperB   )selfrT   rL   r$   r%   r&   rM   rN   rO   r6   rP   rS   times_dtype	__class__s                r3   r_   z ExponentialMovingWindow.__init__D  s    	(0c#k:J:JA6N6N 	 	
 	
 	
 	 
"
:!!$*gt<<K#K00Dk?;;D !!BCCC4:#c((** !OPPPdmc83Er~-VWW T !RSSSDJ##%% I !GHHH,TZGGDL $TXty$*EEII{ -=   /txD$*UU						}(ZX%7H. .( !)  
 73tx~a'81'<a#@#@
SSSDL* 	
 DIIIr5   start
np.ndarrayendnum_valsra   c                    d S N )rm   rp   rr   rs   s       r3   _check_window_boundsz,ExponentialMovingWindow._check_window_bounds  s	    
 	r5   r   c                    t                      S )z[
        Return an indexer class that will compute the window start and end bounds
        )r   rm   s    r3   _get_window_indexerz+ExponentialMovingWindow._get_window_indexer  s     .///r5   numbaengineOnlineExponentialMovingWindowc                    t          | j        | j        | j        | j        | j        | j        | j        | j        | j	        ||| j
                  S )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
        )rT   rL   r$   r%   r&   rM   rN   rO   r6   r|   engine_kwargsrS   )r}   rT   rL   r$   r%   r&   rM   rN   rO   r6   
_selection)rm   r|   r   s      r3   onlinezExponentialMovingWindow.online  sT    4 -]*(;n*'o
 
 
 	
r5   c                >     t                      j        |g|R i |S )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
        )r^   	aggregate)rm   funcargskwargsro   s       r3   r   z!ExponentialMovingWindow.aggregate  s-    L !uww 7777777r5   numeric_onlyc           
        t          |          ro| j        dk    rt          }nt          } |di t	          |          | j        | j        | j        t          | j	                  dd}| 
                    |d          S |dv rg|t          d          | j        dn| j	        }t          t          j        | j        | j        | j        |d          }| 
                    |d|	          S t          d
          )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
        rQ   TrL   rN   rO   deltas	normalizemeannamecythonNN+cython engine does not accept engine_kwargsr   r   )engine must be either 'numba' or 'cython'rv   )r   rP   r   r   r   rj   rN   rO   tuplerh   _applyr-   r6   r   window_aggregationsewmrm   r   r|   r   r   ewm_funcr   window_funcs           r3   r   zExponentialMovingWindow.mean  s&   l 6"" 	J{h&&.4t  #M22I{.T\**   H ;;xf;555'''( !NOOO!Z/TTT\F!#'I{.  K ;;{l;SSSHIIIr5   c           
     J   | j         st          d          | j        t          d          t          |          ro| j        dk    rt
          }nt          } |di t          |          | j        | j         | j	        t          | j                  dd}|                     |d          S |d	v rg|t          d
          | j        dn| j        }t          t          j        | j        | j         | j	        |d          }|                     |d|          S t          d          )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 timesrQ   Fr   sumr   r   r   r   r   rv   )rN   ri   r6   r   rP   r   r   r   rj   rO   r   rh   r   r-   r   r   r   r   s           r3   r   zExponentialMovingWindow.sume  sW   h { 	R%&PQQQ:!%&IJJJ6"" 	J{h&&.4t  #M22I{.T\**   H ;;xe;444'''( !NOOO!Z/TTT\F!#'I{.  K ;;{\;RRRHIIIr5   biasc                   |rM| j         j        dk    r=t          | j         j                  s$t	          t          |           j         d          | j        t	          d          t          | 	                    ||                    S )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_onlyNz!std is not implemented with times)r   r   )
_selected_objndimr
   r<   ri   type__name__r6   r   varrm   r   r   s      r3   stdzExponentialMovingWindow.std  s    D 	"'1,,$T%7%=>> - &::&LLL   :!%&IJJJTXX4lXCCDDDr5   c                    | j         t          d          t          j        }t	          || j        | j        | j        |          fd}|                     |d|          S )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
        Nz!var is not implemented with times)rL   rN   rO   r   c                "     | ||||           S ru   rv   )valuesbeginrr   rM   wfuncs       r3   var_funcz-ExponentialMovingWindow.var.<locals>.var_func  s    5[&AAAr5   r   r   )	r6   ri   r   ewmcovr   rj   rN   rO   r   )rm   r   r   r   r   r   s        @r3   r   zExponentialMovingWindow.var  s    B :!%&IJJJ)0	;n
 
 
	B 	B 	B 	B 	B {{8%l{KKKr5   otherDataFrame | Series | Nonepairwisebool | Nonec                      j         t          d          ddlm                      d|            fd}                      j        ||||          S )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
        Nz!cov is not implemented with timesr   r    covc                                        |           }                     |          }                                }j        j        n|j        }|                    t          |          |j        j        j                  \  }}t          j
        |||j        |j        j        j        
	  	        } 	|| j        | j        d          S )N
num_valuesrM   r\   r]   stepFindexr   copy)_prep_valuesrz   rM   window_sizeget_window_boundsrc   r\   r]   r   r   r   rj   rN   rO   r   r   )xyx_arrayy_arraywindow_indexerrM   rp   rr   resultr    r   rm   s            r3   cov_funcz-ExponentialMovingWindow.cov.<locals>.cov_funcT  s    ''**G''**G!5577N #/   #/ 
 (99w<<'{{Y :  JE3 )/  	 F 6&af5IIIIr5   r6   ri   pandasr    _validate_numeric_only_apply_pairwiser   )rm   r   r   r   r   r   r    s   `  `  @r3   r   zExponentialMovingWindow.cov  s    d :!%&IJJJ!!!!!!##E<888	J 	J 	J 	J 	J 	J 	J> ##x<
 
 	
r5   c                      j         t          d          ddlm                      d|            fd}                      j        ||||          S )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
        Nz"corr is not implemented with timesr   r   corrc                0  
                      |           }                     |          }                                }j        j        n|j        |                    t          |          j        j        j                  \  

fd}t          j
        d          5   |||          } |||          } |||          }|t          ||z            z  }	d d d            n# 1 swxY w Y    |	| j        | j        d          S )Nr   c                Z    t          j        | |j        j        j        d	  	        S )NT)r   r   rj   rN   rO   )XYrr   rM   rm   rp   s     r3   _covz<ExponentialMovingWindow.corr.<locals>.cov_func.<locals>._cov  s9    *1IKN
 
 
r5   ignore)allFr   )r   rz   rM   r   r   rc   r\   r]   r   r.   errstater   r   r   )r   r   r   r   r   r   r   x_vary_varr   rr   rM   rp   r    rm   s             @@@r3   r   z.ExponentialMovingWindow.corr.<locals>.cov_func  s   ''**G''**G!5577N #/   #/ 
 (99w<<'{{Y :  JE3        *** 4 4d7G,,Wg..Wg..uUU]333	4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
 6&af5IIIIs   .:C44C8;C8r   )rm   r   r   r   r   r    s   `    @r3   r   zExponentialMovingWindow.corrw  s    ^ :!%&JKKK!!!!!!##FL999#	J #	J #	J #	J #	J #	JJ ##x<
 
 	
r5   )	NNNNr   TFNrQ   )rT   r!   rL   r#   r$   r#   r%   r8   r&   r#   rM   rU   rN   rV   rO   rV   r6   rW   rP   rX   r'   rY   )rp   rq   rr   rq   rs   ra   r'   rY   )r'   r   )r{   N)r|   rX   r'   r}   ru   )FNN)r   rV   FFr   rV   r   rV   NNFFr   r   r   r   r   rV   r   rV   NNFr   r   r   r   r   rV   )r   
__module____qualname____doc___attributesr_   rw   rz   r   r   aggr   r   r   r   r   r   __classcell__ro   s   @r3   rK   rK   ~   s       v vp
 
 
K !!=A""#-1J J J J J J J J JX   0 0 0 0 48'
 '
 '
 '
 '
RF8 F8 F8 F8 F8 F8P C #	SJ SJ SJ SJ SJn #	UJ UJ UJ UJ UJn,E ,E ,E ,E ,E\/L /L /L /L /Lf ,0 $"Z
 Z
 Z
 Z
 Z
| ,0 $"	]
 ]
 ]
 ]
 ]
 ]
 ]
 ]
 ]
r5   rK   c                  P     e Zd ZdZej        ej        z   Zddd	 fdZd
dZ xZ	S )ExponentialMovingWindowGroupbyzF
    Provide an exponential moving window groupby implementation.
    N)_grouperr'   rY   c               H    t                      j        |g|R d|i| |j        sx| j        st	          j        t          | j        j        	                                                    }t          | j                            |          | j                  | _        d S d S d S )Nr   )r^   r_   emptyr6   r.   concatenatelistr   indicesr   rI   taker%   rh   )rm   rT   r   r   r   groupby_orderro   s         r3   r_   z'ExponentialMovingWindowGroupby.__init__  s    AtAAAhA&AAAy 	TZ3N40E0L0L0N0N+O+OPPM,
.. DLLL	 	33r5   r   c                F    t          | j        j        t                    }|S )z
        Return an indexer class that will compute the window start and end bounds

        Returns
        -------
        GroupbyIndexer
        )groupby_indicesr   )r   r   r   r   )rm   r   s     r3   rz   z2ExponentialMovingWindowGroupby._get_window_indexer  s+     ( M19
 
 
 r5   r'   rY   )r'   r   )
r   r   r   r   rK   r   r   r_   rz   r   r   s   @r3   r   r     s{          *58I8UUK,0 	 	 	 	 	 	 	 	       r5   r   c                       e Zd Z	 	 	 	 	 	 	 	 	 	 d+ddd, fdZd-dZd.dZd/d0d Z	 	 	 d1d2d&Z	 	 	 	 d3d4d'Zd5d6d(Z	ddd)d*Z
 xZS )7r}   Nr   TFr{   rR   rT   r!   rL   r#   r$   r%   r8   r&   rM   rU   rN   rV   rO   r6   rW   r|   rX   r   dict[str, bool] | Noner'   rY   c               .   |	t          d          t                                          |||||||||	|
  
         t          | j        | j        | j        |j                  | _        t          |
          r|
| _
        || _        d S t          d          )Nz0times is not implemented with online operations.)
rT   rL   r$   r%   r&   rM   rN   rO   r6   rS   z$'numba' is the only supported engine)ri   r^   r_   r   rj   rN   rO   rl   _meanr   r|   r   r-   )rm   rT   rL   r$   r%   r&   rM   rN   rO   r6   r|   r   rS   ro   s                r3   r_   z&OnlineExponentialMovingWindow.__init__  s      %B   	# 	 	
 	
 	
 "$)T[$.#)TT
6"" 	E DK!.DCDDDr5   c                8    | j                                          dS )z=
        Reset the state captured by `update` calls.
        N)r   resetry   s    r3   r   z#OnlineExponentialMovingWindow.reset!  s     	
r5   c                     t          d          )Nzaggregate is not implemented.ri   )rm   r   r   r   s       r3   r   z'OnlineExponentialMovingWindow.aggregate'  s    !"ABBBr5   r   c                     t          d          )Nzstd is not implemented.r   )rm   r   r   r   s       r3   r   z!OnlineExponentialMovingWindow.std*      !";<<<r5   r   r   r   r   r   c                     t          d          )Nzcorr is not implemented.r   )rm   r   r   r   s       r3   r   z"OnlineExponentialMovingWindow.corr-  s     ""<===r5   c                     t          d          )Nzcov is not implemented.r   )rm   r   r   r   r   s        r3   r   z!OnlineExponentialMovingWindow.cov5  s     "";<<<r5   c                     t          d          )Nzvar is not implemented.r   r   s      r3   r   z!OnlineExponentialMovingWindow.var>  r   r5   )updateupdate_timesc                  i }| j         j        dk    }|t          d          t          j        t          | j         j        d         dz
  d          t          j                  }|| j        j	        t          d          d}|j        |d	<   |r+| j        j	        t          j        ddf         }	|j        |d
<   n| j        j	        }	|j        |d<   t          j        |	|                                f          }
nhd}| j         j        |d	<   |r| j         j        |d
<   n| j         j        |d<   | j                             t          j                                                  }
t%          di t'          | j                  }| j                            |r|
n|
ddt          j        f         || j        |          }|s|                                }||d         } | j         j        |fi |}|S )a[  
        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   r;   z;Must call mean with update=None first before passing updater   columnsr   rv   )r   r   ri   r.   rk   r`   rl   rB   r   last_ewmr-   r   newaxisr   r   r   to_numpyastyper   r   r   run_ewmrM   squeeze_constructor)rm   r   r   r   r   result_kwargsis_frameupdate_deltasresult_from
last_valuenp_array	ewma_funcr   s                r3   r   z"OnlineExponentialMovingWindow.meanA  s   X %*a/#%&HIII"(,q0!44BJ
 
 
 z"* Q   K%+\M'" 4!Z0QQQ?
+1>i((!Z0
(.f%~z6??3D3D&EFFHHK%)%7%=M'" @+/+=+Ei(((,(:(?f%)00<<EEGGH3 
 
 233
 
	 ## =HHhqqq"*}&=	
 
  	&^^%%F%0#0II=IIr5   )
NNNNr   TFNr{   N)rT   r!   rL   r#   r$   r#   r%   r8   r&   r#   rM   rU   rN   rV   rO   rV   r6   rW   r|   rX   r   r   r'   rY   r   ru   )F)r   rV   r   r   r   r   r   r   )r   r   r   r_   r   r   r   r   r   r   r   r   r   s   @r3   r}   r}     sM        !!=A""#-104%E %E %E %E %E %E %E %E %EN   C C C C= = = = =
 ,0 $"	> > > > > ,0 $"= = = = == = = = = "&D V V V V V V V V Vr5   r}   )
r"   r#   r$   r#   r%   r#   r&   r#   r'   r(   )r6   r7   r%   r8   r'   r9   )@
__future__r   rd   	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!   r4   rI   rK   r   r}   rv   r5   r3   <module>r'     s   " " " " " "              
     ) ) ) ) ) ) > > > > > > > > > > > > . . . . . .        6 5 5 5 5 5 0 0 0 0 0 0 + + + + + +       9 9 9 9 9 9         
        , + + + + +                     
  ,                 ,+++++   B' ' ' '<   U
 U
 U
 U
 U
j U
 U
 ! U
p       %68O   ! B^ ^ ^ ^ ^$; ^ ^ ^ ^ ^r5   