Ë
    *�£j"›  ã                  óì  — 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?y)!é    )Ú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                óæ  — t        j                  | |||«      }|dkD  rt        d«      ‚| �| dk  r¸t        d«      ‚|�#|dk  rt        d«      ‚|dz
  dz  } t        | «      S |�Q|dk  rt        d«      ‚dt        j                  t        j
                  d«      |z  «      z
  }d|z  dz
  } t        | «      S |�(|dk  s|dkD  rt        d	«      ‚d|z
  |z  } t        | «      S 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ÚlogÚfloat)ÚcomassÚspanÚhalflifeÚalphaÚvalid_countÚdecays         ú8C:\FundamentalWorkbench\vendor\pandas\core\window\ewm.pyÚget_center_of_massr2   ?   s!  € ô ×'Ñ'¨°°hÀÓF€KØ�Q‚ÜÐSÓTÐTð ÐØ�AŠ:ÜÐ?Ó@Ð@Ø	Ð	Ø�!Š8ÜÐ;Ó<Ð<Ø˜‘(˜a‘ˆô �‹=Ðð 
Ð	Ø�qŠ=ÜÐBÓCÐCØ”B—F‘Fœ2Ÿ6™6 #›;¨Ñ1Ó2Ñ2ˆØ�U‘˜Q‘ˆô �‹=Ðð 
Ð	Ø�AŠ:˜ šÜÐAÓBÐBØ�e‘)˜uÑ$ˆô �‹=Ðô ÐLÓMÐMä�‹=Ðó    c                óŠ  — t        | j                  «      }t        d|«      }t        | t        «      r| j
                  } t        j                  | j                  t        j                  «      t        j                  ¬«      }t        t        |«      j                  |«      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   r6   r   Ú
isinstancer   Ú_valuesr'   ÚasarrayÚviewÚint64Úfloat64r*   r   Úas_unitÚ_valueÚdiff)Útimesr-   ÚunitÚ_timesÚ	_halflifes        r1   Ú_calculate_deltasrD   `   s…   € ô* ˜Ÿ™Ó%€DÜ�
˜DÓ!€DÜ�%œÔ#Ø—‘ˆÜ�Z‰Z˜Ÿ
™
¤2§8¡8Ó,´B·J±JÔ?€FÜ”i Ó)×1Ñ1°$Ó7×>Ñ>Ó?€IÜ�7‰7�6‹?˜YÑ&Ð&r3   zpandas.api.typingc                  ó$  ‡ — e Zd ZdZg d¢Z	 	 	 	 	 	 	 	 	 dddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Z	 	 	 	 	 	 	 	 dd„Zdd„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	 	 	 	 d	 	 	 	 	 	 	 dd„Z	 	 	 d	 	 	 	 	 dd„Zˆ xZS )Ú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_nar@   ÚmethodN©Ú	selectionc          	     ó   •— t         ‰| �  ||€dnt        t        |«      d«      d dd |
|¬«       || _        || _        || _        || _        || _        || _	        |	| _
        | j                  ��‰t        | j                  dd «      }t        |«      st        |t        «      st        d«      ‚t!        | j                  «      t!        |«      k7  rt        d«      ‚t        | j                  t"        t$        j&                  t(        j*                  f«      st        d«      ‚t-        | j                  «      j/                  «       rt        d«      ‚t1        | j                  | j                  «      | _        t5        j6                  | j                  | j
                  | j                  «      d	kD  rI| j                  st9        d
«      ‚t;        | j                  | j
                  d | j                  «      | _        y d| _        y | j                  �Dt        | j                  t"        t$        j&                  t(        j*                  f«      rt        d«      ‚t)        j>                  t        | j@                  jB                  d	   dz
  d	«      t(        jD                  ¬«      | _        t;        | j                  | j
                  | j                  | j                  «      | _        y )Nr#   F)ÚobjrH   ÚonÚcenterÚclosedrK   rM   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ÚintrG   r,   r-   r.   rI   rJ   r@   Úgetattrr	   r7   r   r&   ÚlenÚstrÚdatetimeÚ	timedeltar'   Útimedelta64r   ÚanyrD   Ú_deltasr   r%   ÚNotImplementedErrorr2   Ú_comÚonesrO   Úshaper<   )ÚselfrO   rG   r,   r-   r.   rH   rI   rJ   r@   rK   rM   Útimes_dtypeÚ	__class__s                €r1   rT   z ExponentialMovingWindow.__init__D  s-  ø€ ô 	‰ÑØØ(Ð0™´c¼#¸kÓ:JÈAÓ6NØØØØØð 	ô 	
ð ˆŒØˆŒ	Ø ˆŒØˆŒ
ØˆŒØ"ˆŒØˆŒ
Ø�:‰:Ñ!Ü! $§*¡*¨g°tÓ<ˆKä# KÔ0Ü˜k¬?Ô;ä Ð!BÓCÐCÜ�4—:‘:‹¤# c£(Ò*Ü Ð!OÓPÐPÜ˜dŸm™m¬c´8×3EÑ3EÄrÇ~Á~Ð-VÔWÜ Ð!RÓSÐSÜ�D—J‘JÓ×#Ñ#Ô%Ü Ð!GÓHÐHÜ,¨T¯Z©Z¸¿¹ÓGˆDŒLô ×$Ñ$ T§X¡X¨t¯y©y¸$¿*¹*ÓEÈÒIØ—{’{Ü-ð=óð ô /¨t¯x©x¸¿¹ÀDÈ$Ï*É*ÓU�•	à�•	à�}‰}Ð(¬ZØ—‘¤¤X×%7Ñ%7¼¿¹ÐHô.ô !ð)óð ô
 Ÿ7™7¤3 t§x¡x§~¡~°aÑ'8¸1Ñ'<¸aÓ#@ÌÏ
É
ÔSˆDŒLÜ*ð —‘Ø—	‘	Ø—‘Ø—
‘
óˆD�Ir3   c                 ó   — y ©N© )rc   ÚstartÚendÚnum_valss       r1   Ú_check_window_boundsz,ExponentialMovingWindow._check_window_bounds�  s   € ð
 	r3   c                ó   — t        «       S )z[
        Return an indexer class that will compute the window start and end bounds
        )r   ©rc   s    r1   Ú_get_window_indexerz+ExponentialMovingWindow._get_window_indexer—  s   € ô .Ó/Ð/r3   c                óø   — 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
        )rO   rG   r,   r-   r.   rH   rI   rJ   r@   ÚengineÚengine_kwargsrM   )ÚOnlineExponentialMovingWindowrO   rG   r,   r-   r.   rH   rI   rJ   r@   Ú
_selection)rc   rq   rr   s      r1   ÚonlinezExponentialMovingWindow.online�  s_   € ô4 -Ø—‘Ø—‘Ø—‘Ø—]‘]Ø—*‘*Ø×(Ñ(Ø—;‘;Ø—n‘nØ—*‘*ØØ'Ø—o‘oô
ð 	
r3   c                ó*   •— t        ‰| �  |g|¢­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
        )rS   Ú	aggregate)rc   ÚfuncÚargsÚkwargsre   s       €r1   rw   z!ExponentialMovingWindow.aggregateÆ  s    ø€ ôL ‰wÑ  Ð7¨Ò7°Ñ7Ð7r3   c           
     ó  — t        |«      ry| j                  dk(  rt        }nt        } |di t	        |«      ¤| j
                  | j                  | j                  t        | j                  «      ddœ¤Ž}| j                  |d¬«      S |dv rx|�t        d«      ‚| j                  €dn| j                  }t        t        j                  | j
                  | j                  | j                  |d¬«      }| j                  |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
        ÚsingleT©rG   rI   rJ   ÚdeltasÚ	normalizeÚmean©Úname©ÚcythonNNú+cython engine does not accept engine_kwargs©r‚   Únumeric_onlyú)engine must be either 'numba' or 'cython'rh   )r   rK   r   r   r   r`   rI   rJ   Útupler^   Ú_applyr&   r@   r   Úwindow_aggregationsÚewm©rc   r‡   rq   rr   rx   Úewm_funcr~   Úwindow_funcs           r1   r€   zExponentialMovingWindow.mean  sø   € ôl ˜6Ô"Ø�{‰{˜hÒ&Ü.‘ä4�Ùñ Ü# MÓ2ðà—I‘IØ—{‘{ØŸ.™.Ü˜TŸ\™\Ó*ØóˆHð —;‘;˜x¨f�;Ó5Ð5ØÐ'Ñ'ØÐ(Ü Ð!NÓOÐOà!ŸZ™ZÐ/‘T°T·\±\ˆFÜ!Ü#×'Ñ'Ø—I‘IØ—{‘{ØŸ.™.ØØôˆKð —;‘;˜{°Àl�;ÓSÐSäÐHÓIÐIr3   c           
     ót  — | j                   st        d«      ‚| j                  �t        d«      ‚t        |«      ry| j                  dk(  rt
        }nt        } |di t        |«      ¤| j                  | j                   | j                  t        | j                  «      ddœ¤Ž}| j                  |d¬«      S |d	v rx|�t        d
«      ‚| j                  €dn| j                  }t        t        j                   | j                  | j                   | j                  |d¬«      }| j                  |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 timesr|   Fr}   Úsumr�   rƒ   r…   r†   rˆ   rh   )rI   r_   r@   r   rK   r   r   r   r`   rJ   r‰   r^   rŠ   r&   r   r‹   rŒ   r�   s           r1   r‘   zExponentialMovingWindow.sume  s!  € ðh �{Š{Ü%Ð&PÓQÐQØ�:‰:Ð!Ü%Ð&IÓJÐJÜ˜6Ô"Ø�{‰{˜hÒ&Ü.‘ä4�Ùñ Ü# MÓ2ðà—I‘IØ—{‘{ØŸ.™.Ü˜TŸ\™\Ó*ØóˆHð —;‘;˜x¨e�;Ó4Ð4ØÐ'Ñ'ØÐ(Ü Ð!NÓOÐOà!ŸZ™ZÐ/‘T°T·\±\ˆFÜ!Ü#×'Ñ'Ø—I‘IØ—{‘{ØŸ.™.ØØôˆKð —;‘;˜{°À\�;ÓRÐRäÐHÓIÐIr3   c                ó  — |rY| j                   j                  dk(  r@t        | j                   j                  «      s!t	        t        | «      j                  › d�«      ‚| j                  �t	        d«      ‚t        | j                  ||¬«      «      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_onlyz!std is not implemented with times)Úbiasr‡   )
Ú_selected_objÚndimr
   r6   r_   ÚtypeÚ__name__r@   r   Úvar©rc   r“   r‡   s      r1   ÚstdzExponentialMovingWindow.std¼  s…   € ñD Ø×"Ñ"×'Ñ'¨1Ò,Ü$ T×%7Ñ%7×%=Ñ%=Ô>ô &Ü˜“:×&Ñ&Ð'Ð'KÐLóð ð �:‰:Ð!Ü%Ð&IÓJÐJÜ�T—X‘X 4°l�XÓCÓDÐDr3   c                óà   ‡— | j                   �t        d«      ‚t        j                  }t	        || j
                  | j                  | j                  |¬«      Šˆfd„}| j                  |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
        z!var is not implemented with times)rG   rI   rJ   r“   c                ó   •—  ‰| |||| «      S rg   rh   )ÚvaluesÚbeginrj   rH   Úwfuncs       €r1   Úvar_funcz-ExponentialMovingWindow.var.<locals>.var_func  s   ø€ Ù˜ ¨¨[¸&ÓAÐAr3   r˜   r†   )	r@   r_   r‹   Úewmcovr   r`   rI   rJ   rŠ   )rc   r“   r‡   r�   r    rŸ   s        @r1   r˜   zExponentialMovingWindow.varê  si   ø€ ðB �:‰:Ð!Ü%Ð&IÓJÐJÜ)×0Ñ0ˆÜØØ—	‘	Ø—;‘;Ø—n‘nØô
ˆô	Bð �{‰{˜8¨%¸lˆ{ÓKÐKr3   c                ó²   ‡ ‡‡— ‰ j                   �t        d«      ‚ddlmŠ ‰ j	                  d|«       ˆˆˆ fd„}‰ j                  ‰ 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
        z!cov is not implemented with timesr   ©r    Úcovc                óú  •— ‰j                  | «      }‰j                  |«      }‰j                  «       }‰j                  �‰j                  n|j                  }|j	                  t        |«      |‰j                  ‰j                  ‰j                  ¬«      \  }}t        j                  |||‰j                  |‰j                  ‰j                  ‰j                  ‰
«	      } ‰	|| j                  | j                  d¬«      S )N©Ú
num_valuesrH   rQ   rR   ÚstepF©Úindexr‚   Úcopy)Ú_prep_valuesro   rH   Úwindow_sizeÚget_window_boundsrX   rQ   rR   r¨   r‹   r¡   r`   rI   rJ   rª   r‚   )ÚxÚyÚx_arrayÚy_arrayÚwindow_indexerrH   ri   rj   Úresultr    r“   rc   s            €€€r1   Úcov_funcz-ExponentialMovingWindow.cov.<locals>.cov_funcT  sî   ø€ Ø×'Ñ'¨Ó*ˆGØ×'Ñ'¨Ó*ˆGØ!×5Ñ5Ó7ˆNð ×#Ñ#Ð/ð × Ò à#×/Ñ/ð ð
 (×9Ñ9Ü˜w›<Ø'Ø—{‘{Ø—{‘{Ø—Y‘Yð :ó ‰JˆE�3ô )×/Ñ/ØØØð × Ñ ØØ—	‘	Ø—‘Ø—‘ØóˆFñ ˜&¨¯©°a·f±fÀ5ÔIÐIr3   ©r@   r_   Úpandasr    Ú_validate_numeric_onlyÚ_apply_pairwiser”   )rc   ÚotherÚpairwiser“   r‡   rµ   r    s   `  `  @r1   r¤   zExponentialMovingWindow.cov  s[   ú€ ðd �:‰:Ð!Ü%Ð&IÓJÐJå!à×#Ñ# E¨<Ô8ö	Jð> ×#Ñ#Ø×Ñ  x°¸<ó
ð 	
r3   c                ó®   ‡ ‡— ‰ j                   �t        d«      ‚ddlmŠ ‰ j	                  d|«       ˆˆ fd„}‰ j                  ‰ 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
        z"corr is not implemented with timesr   r£   Úcorrc                ó4  •‡
‡‡— ‰j                  | «      }‰j                  |«      }‰j                  «       }‰j                  �‰j                  n|j                  Š|j	                  t        |«      ‰‰j                  ‰j                  ‰j                  ¬«      \  ŠŠ
ˆ
ˆˆˆfd„}t        j                  d¬«      5   |||«      } |||«      } |||«      }|t        ||z  «      z  }	d d d «        ‰	| j                  | j                  d¬«      S # 1 sw Y   Œ)xY w)Nr¦   c                óz   •— t        j                  | ‰‰‰|‰j                  ‰j                  ‰j                  d«	      S )NT)r‹   r¡   r`   rI   rJ   )ÚXÚYrj   rH   rc   ri   s     €€€€r1   Ú_covz<ExponentialMovingWindow.corr.<locals>.cov_func.<locals>._cov¾  s=   ø€ Ü*×1Ñ1ØØØØØØ—I‘IØ—K‘KØ—N‘NØó
ð 
r3   Úignore)ÚallFr©   )r¬   ro   rH   r­   r®   rX   rQ   rR   r¨   r'   Úerrstater   rª   r‚   )r¯   r°   r±   r²   r³   rÂ   r¤   Úx_varÚy_varr´   rj   rH   ri   r    rc   s             @@@€€r1   rµ   z.ExponentialMovingWindow.corr.<locals>.cov_func­  s  û€ Ø×'Ñ'¨Ó*ˆGØ×'Ñ'¨Ó*ˆGØ!×5Ñ5Ó7ˆNð ×#Ñ#Ð/ð × Ò à#×/Ñ/ð ð
 (×9Ñ9Ü˜w›<Ø'Ø—{‘{Ø—{‘{Ø—Y‘Yð :ó ‰JˆE�3÷ô —‘ Ö*Ù˜7 GÓ,�Ù˜W gÓ.�Ù˜W gÓ.�Øœu U¨U¡]Ó3Ñ3�÷	 +ñ
 ˜&¨¯©°a·f±fÀ5ÔIÐI÷ +Ð*ús   Â9-DÄDr¶   )rc   rº   r»   r‡   rµ   r    s   `    @r1   r½   zExponentialMovingWindow.corrw  s\   ù€ ð^ �:‰:Ð!Ü%Ð&JÓKÐKå!à×#Ñ# F¨LÔ9õ#	JðJ ×#Ñ#Ø×Ñ  x°¸<ó
ð 	
r3   )	NNNNr   TFNr|   )rO   r!   rG   úfloat | Noner,   rÈ   r-   ú(float | TimedeltaConvertibleTypes | Noner.   rÈ   rH   ú
int | NonerI   ÚboolrJ   rË   r@   únp.ndarray | NDFrame | NonerK   rY   ÚreturnÚNone)ri   ú
np.ndarrayrj   rÏ   rk   rV   rÍ   rÎ   )rÍ   r   )ÚnumbaN)rq   rY   rÍ   rs   rg   )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__Ú__doc__Ú_attributesrT   rl   ro   ru   rw   Úaggr€   r‘   rš   r˜   r¤   r½   Ú__classcell__©re   s   @r1   rF   rF   ~   sÁ  ø„ ñvòp
€Kð !Ø!Ø=AØ"Ø"#ØØØ-1ØðJð ñJàðJð ðJð ð	Jð
 ;ðJð ðJð  ðJð ðJð ðJð +ðJð ðJð 
õJðXØðØ&0ðØ<?ðà	óó0ð 48ð'
Øð'
à	&ó'
õRF8ðP €Cð #ØØð	SJàóSJðn #ØØð	UJàóUJôn,Eô\/Lðf ,0Ø $ØØ"ðZ
à(ðZ
ð ðZ
ð ð	Z
ð
 óZ
ð| ,0Ø $Ø"ð	]
à(ð]
ð ð]
ð ÷	]
r3   rF   c                  ód   ‡ — 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)Ú_grouperc               óL  •— t        ‰| �  |g|¢­d|i|¤Ž |j                  s‚| j                  �ut	        j
                  t        | j                  j                  j                  «       «      «      }t        | j                  j                  |«      | j                  «      | _        y y y )Nrâ   )rS   rT   Úemptyr@   r'   ÚconcatenateÚlistrâ   Úindicesr�   rD   Útaker-   r^   )rc   rO   râ   ry   rz   Úgroupby_orderre   s         €r1   rT   z'ExponentialMovingWindowGroupby.__init__ß  s   ø€ Ü‰Ñ˜ÐA˜tÒA¨hÐA¸&ÒAà�yŠy˜TŸZ™ZÐ3äŸN™N¬4°·±×0EÑ0E×0LÑ0LÓ0NÓ+OÓPˆMÜ,Ø—
‘
—‘ Ó.Ø—‘óˆD�Lð 4ˆyr3   c                óP   — 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   )rc   r³   s     r1   ro   z2ExponentialMovingWindowGroupby._get_window_indexerê  s&   € ô (Ø ŸM™M×1Ñ1Ü9ô
ˆð Ðr3   ©rÍ   rÎ   )rÍ   r   )
r—   rÙ   rÚ   rÛ   rF   rÜ   r   rT   ro   rÞ   rß   s   @r1   rá   rá   ×  s.   ø„ ñð *×5Ñ5Ð8I×8UÑ8UÑU€Kà,0÷ 	÷r3   rá   c                  óÖ   ‡ — e Zd Z	 	 	 	 	 	 	 	 	 	 dddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zdd„Zdd„Zddd„Z	 	 	 d	 	 	 	 	 dd„Z	 	 	 	 d	 	 	 	 	 	 	 dd„Zddd	„Z	ddd
œd„Z
ˆ xZS )rs   NrL   c               ó  •— |	�t        d«      ‚t        ‰| �	  |||||||||	|¬«
       t        | j                  | j
                  | j                  |j                  «      | _        t        |
«      r|
| _
        || _        y t        d«      ‚)Nz0times is not implemented with online operations.)
rO   rG   r,   r-   r.   rH   rI   rJ   r@   rM   z$'numba' is the only supported engine)r_   rS   rT   r   r`   rI   rJ   rb   Ú_meanr   rq   rr   r&   )rc   rO   rG   r,   r-   r.   rH   rI   rJ   r@   rq   rr   rM   re   s                €r1   rT   z&OnlineExponentialMovingWindow.__init__ú  s”   ø€ ð  ÐÜ%ØBóð ô 	‰ÑØØØØØØ#ØØØØð 	ô 	
ô " $§)¡)¨T¯[©[¸$¿.¹.È#Ï)É)ÓTˆŒ
Ü˜6Ô"Ø ˆDŒKØ!.ˆDÕäÐCÓDÐDr3   c                ó8   — | j                   j                  «        y)z=
        Reset the state captured by `update` calls.
        N)rï   Úresetrn   s    r1   rñ   z#OnlineExponentialMovingWindow.reset!  s   € ð 	�
‰
×ÑÕr3   c                ó   — t        d«      ‚)Nzaggregate is not implemented.©r_   )rc   rx   ry   rz   s       r1   rw   z'OnlineExponentialMovingWindow.aggregate'  s   € Ü!Ð"AÓBÐBr3   c                ó   — t        d«      ‚)Nzstd is not implemented.ró   )rc   r“   ry   rz   s       r1   rš   z!OnlineExponentialMovingWindow.std*  ó   € Ü!Ð";Ó<Ð<r3   c                ó   — t        d«      ‚)Nzcorr is not implemented.ró   )rc   rº   r»   r‡   s       r1   r½   z"OnlineExponentialMovingWindow.corr-  s   € ô "Ð"<Ó=Ð=r3   c                ó   — t        d«      ‚)Nzcov is not implemented.ró   )rc   rº   r»   r“   r‡   s        r1   r¤   z!OnlineExponentialMovingWindow.cov5  s   € ô "Ð";Ó<Ð<r3   c                ó   — t        d«      ‚)Nzvar is not implemented.ró   r™   s      r1   r˜   z!OnlineExponentialMovingWindow.var>  rõ   r3   )Ú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                  |	|j!                  «       f«      }
n‡d}| j                   j                  |d	<   |r| j                   j                  |d
<   n| j                   j                  |d<   | j                   j#                  t        j                  «      j!                  «       }
t%        di t'        | j(                  «      ¤Ž}| j                  j+                  |r|
n|
dd…t        j                  f   || j,                  |«      }|s|j/                  «       }||d } | j                   j0                  |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   r5   z;Must call mean with update=None first before passing updaterª   Úcolumnsr‚   rh   )r”   r•   r_   r'   ra   rU   rb   r<   rï   Úlast_ewmr&   rª   Únewaxisrý   r‚   rå   Úto_numpyÚastyper   r   rr   Úrun_ewmrH   ÚsqueezeÚ_constructor)rc   rù   rú   ry   rz   Úresult_kwargsÚis_frameÚupdate_deltasÚresult_fromÚ
last_valueÚnp_arrayÚ	ewma_funcr´   s                r1   r€   z"OnlineExponentialMovingWindow.meanA  s	  € ðX ˆØ×%Ñ%×*Ñ*¨aÑ/ˆØÐ#Ü%Ð&HÓIÐIÜŸ™Ü�×"Ñ"×(Ñ(¨Ñ,¨qÑ0°!Ó4¼B¿J¹Jô
ˆð ÐØ�z‰z×"Ñ"Ð*Ü ØQóð ð ˆKØ%+§\¡\ˆM˜'Ñ"ÙØ!ŸZ™Z×0Ñ0´·±ºQ°Ñ?�
Ø+1¯>©>�˜iÒ(à!ŸZ™Z×0Ñ0�
Ø(.¯©�˜fÑ%Ü—~‘~ z°6·?±?Ó3DÐ&EÓF‰HàˆKØ%)×%7Ñ%7×%=Ñ%=ˆM˜'Ñ"ÙØ+/×+=Ñ+=×+EÑ+E�˜iÒ(à(,×(:Ñ(:×(?Ñ(?�˜fÑ%Ø×)Ñ)×0Ñ0´·±Ó<×EÑEÓGˆHÜ3ñ 
Ü × 2Ñ 2Ó3ñ
ˆ	ð —‘×#Ñ#Ù ‰H hªq´"·*±*¨}Ñ&=ØØ×ÑØó	
ˆñ Ø—^‘^Ó%ˆFØ˜˜Ð%ˆØ0�×#Ñ#×0Ñ0°ÑI¸=ÑIˆØˆr3   )
NNNNr   TFNrÐ   N)rO   r!   rG   rÈ   r,   rÈ   r-   rÉ   r.   rÈ   rH   rÊ   rI   rË   rJ   rË   r@   rÌ   rq   rY   rr   zdict[str, bool] | NonerÍ   rÎ   rì   rg   )F)r“   rË   r×   rØ   rÓ   rÔ   rÑ   rÒ   )r—   rÙ   rÚ   rT   rñ   rw   rš   r½   r¤   r˜   r€   rÞ   rß   s   @r1   rs   rs   ù  sD  ø„ ð !Ø!Ø=AØ"Ø"#ØØØ-1ØØ04ð%Eð ñ%Eàð%Eð ð%Eð ð	%Eð
 ;ð%Eð ð%Eð  ð%Eð ð%Eð ð%Eð +ð%Eð ð%Eð .ð%Eð 
õ%EóNóCô=ð
 ,0Ø $Ø"ð	>à(ð>ð ð>ð ó	>ð ,0Ø $ØØ"ð=à(ð=ð ð=ð ð	=ð
 ó=ô=ð "&°D÷ Vð Vr3   rs   )
r+   rÈ   r,   rÈ   r-   rÈ   r.   rÈ   rÍ   r*   )r@   znp.ndarray | NDFramer-   rÉ   rÍ   znpt.NDArray[np.float64])@Ú
__future__r   rZ   Ú	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á   rs   rh   r3   r1   Ú<module>r$     s#  ðÝ "ã Ý ÷ó
 å )ß >Ó >Ý .÷õ 6Ý 0Ý +å Ý 9÷ñ ÷
õ ,÷÷÷ñ
 ÷ñ ÷õ ,ðØðà
ðð ðð ð	ð
 óðB'Øð'à6ð'ð ó'ñ< ÐÓ ôU
˜jó U
ó !ðU
ñp ÐÓ ôÐ%6Ð8Oó ó !ðôB^Ð$;õ ^r3   