o
    5c͊                     @  s  d dl mZ d dlZd dlmZ d dlmZ d dlmZm	Z	 d dl
Z
d dlZd dlmZ d dlm  m  mZ d dlmZmZ erPd 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$m%Z% d dl&m'Z' d dl(m)  m*Z* d dl+m,Z,m-Z-m.Z. d dl/m0Z0m1Z1 d dl2m3Z3m4Z4 d dl5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z? d dl@mAZAmBZB d dlCmDZDmEZE d dlFmGZGmHZH d+ddZId,d#d$ZJG d%d& d&eGZKG d'd( d(eHeKZLG d)d* d*eKZMdS )-    )annotationsN)partial)dedent)TYPE_CHECKINGcast)	Timedelta)AxisTimedeltaConvertibleTypes)	DataFrameSeries)NDFrame)function)doc)find_stack_level)is_datetime64_ns_dtypeis_numeric_dtype)isna)BaseIndexerExponentialMovingWindowIndexerGroupbyIndexer)get_jit_argumentsmaybe_use_numba)maybe_warn_args_and_kwargszsqrt)
_shared_docsargs_compatcreate_section_headerkwargs_compatkwargs_numeric_onlynumba_notestemplate_headertemplate_returnstemplate_see_alsowindow_agg_numba_parameters)generate_numba_ewm_funcgenerate_numba_ewm_table_func)EWMMeanStategenerate_online_numba_ewma_func)
BaseWindowBaseWindowGroupbycomassfloat | Nonespanhalflifealphareturnfloatc                 C  s   t | |||}|dkrtd| d ur | dk rtdt| S |d ur6|dk r,td|d d } t| S |d urX|dkrBtddttd|  }d| d } t| S |d urr|dksd|dkrhtd	d| | } t| S td
)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)commoncount_not_none
ValueErrornpexplogr0   )r*   r,   r-   r.   valid_countdecay r;   L/var/www/html/gps/gps/lib/python3.10/site-packages/pandas/core/window/ewm.pyget_center_of_massK   s0   r=   times!str | np.ndarray | NDFrame | None(float | TimedeltaConvertibleTypes | None
np.ndarrayc                 C  s4   t j| t jt jd}tt|j}t || 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 : str, np.ndarray, Series, default None
        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
    dtype)	r6   asarrayviewint64float64r0   r   valuediff)r>   r-   _times	_halflifer;   r;   r<   _calculate_deltasl   s
   rL   c                      s  e Zd ZdZg dZ										dcdddd fddZded%d&Zdfd(d)Z	dgdhd,d-Ze	e
d. ed/ed0d1d2d3 fd4d5ZeZe	eed6eee eed7eed8eed9ed:d2d;d<d=d>d?	diddd@djdBdCZe	eed6eee eed7eed8eed9ed:d2d;d<dDdEd?	diddd@djdFdGZe	eed6edHd:d2d;eeeed7eed8eddI d<dJdKd?dkdldMdNZdidmdOdPZe	eed6edHd:d2d;eeeed7eed8eddI d<dQdRd?dkdldSdTZe	eed6edUd:d2d;eeed7eed8eddI d<dVdWd?				dndod\d]Ze	eed6ed^d:d2d;eeed7eed8eddI d<d_d`d?			dpdqdadbZ  ZS )r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,
    ``halflife`` and one of ``com``, ``span`` or ``alpha`` may be provided.

    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.

        .. versionadded:: 1.1.0

    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``.

    axis : {0, 1}, default 0
        If ``0`` or ``'index'``, calculate across the rows.

        If ``1`` or ``'columns'``, calculate across the columns.

        For `Series` this parameter is unused and defaults to 0.

    times : str, np.ndarray, Series, default None

        .. versionadded:: 1.1.0

        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.

        .. deprecated:: 1.4.0
            If str, the name of the column in the DataFrame representing the times.

    method : str {'single', 'table'}, default 'single'
        .. versionadded:: 1.4.0

        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
    -------
    ``ExponentialMovingWindow`` subclass

    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_naaxisr>   methodNr   TFsingle	selectionobjr   rN   r+   r,   r-   r@   r.   rO   
int | NonerP   boolrQ   rR   r   r>   r?   rS   strr/   Nonec             
     s  t  j||d u r
dntt|dd dd ||	|d || _|| _|| _|| _|| _|| _	|
| _
| j
d ur| js:tdt| j
trStjdtt d td| j| j
 | _
t| j
s\tdt| j
t|kritd	t| jttjtjfsxtd
t| j
 rtdt| j
| j| _t | j| j| jdkrt!| j| jd | j| _"d S d| _"d S | jd urt| jttjtjfrtdtj#t| j$j%| j& d dtj'd| _t!| j| j| j| j| _"d S )Nr1   F)rW   rO   oncenterclosedrS   rR   rV   z)times is not supported with adjust=False.zSpecifying times as a string column label is deprecated and will be removed in a future version. Pass the column into times instead.
stacklevelr   z#times must be datetime64[ns] 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   g      ?zKhalflife can only be a timedelta convertible argument if times is not None.rB   )(super__init__maxintrN   r,   r-   r.   rP   rQ   r>   NotImplementedError
isinstancerZ   warningswarnFutureWarningr   r   _selected_objr   r5   lendatetime	timedeltar6   timedelta64r   anyrL   _deltasr3   r4   r=   _comonesrW   shaperR   rG   )selfrW   rN   r,   r-   r.   rO   rP   rQ   rR   r>   rS   rV   	__class__r;   r<   rb   ^  sl   





z ExponentialMovingWindow.__init__startrA   endnum_valsrd   c                 C  s   d S Nr;   )rt   rw   rx   ry   r;   r;   r<   _check_window_bounds  s   z,ExponentialMovingWindow._check_window_boundsr   c                 C  s   t  S )z[
        Return an indexer class that will compute the window start and end bounds
        )r   rt   r;   r;   r<   _get_window_indexer  s   z+ExponentialMovingWindow._get_window_indexernumbaOnlineExponentialMovingWindowc                 C  s8   t | j| j| j| j| j| j| j| j| j	| j
||| jdS )a  
        Return an ``OnlineExponentialMovingWindow`` object to calculate
        exponentially moving window aggregations in an online method.

        .. versionadded:: 1.3.0

        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
        )rW   rN   r,   r-   r.   rO   rP   rQ   rR   r>   engineengine_kwargsrV   )r   rW   rN   r,   r-   r.   rO   rP   rQ   rR   r>   
_selection)rt   r   r   r;   r;   r<   online  s   zExponentialMovingWindow.online	aggregatezV
        See Also
        --------
        pandas.DataFrame.rolling.aggregate
        a  
        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
        zSeries/Dataframe )see_alsoexamplesklassrR   c                   s   t  j|g|R i |S rz   )ra   r   rt   funcargskwargsru   r;   r<   r     s   z!ExponentialMovingWindow.aggregate
ParametersReturnszSee AlsoNotes
r1   ewmz"(exponential weighted moment) meanmean)window_methodaggregation_description
agg_method)r   r   numeric_onlyc          
   	   O  s   t t| d|| t|r5| jdkrt}nt}|d
i t|| j| j| j	t
| jdd}| j|ddS |dv rh|d urAtdtd|| | jd u rOd n| j}ttj| j| j| j	|dd}	| j|	d|dS td	)Nr   rT   TrN   rP   rQ   deltas	normalizenamecythonN+cython engine does not accept engine_kwargsr   r   )engine must be either 'numba' or 'cython'r;   )r   typer   rS   r$   r%   r   rq   rP   rQ   tuplerp   _applyr5   nvvalidate_window_funcr>   r   window_aggregationsr   
rt   r   r   r   r   r   r   ewm_funcr   window_funcr;   r;   r<   r     s<   

zExponentialMovingWindow.meanz!(exponential weighted moment) sumsumc          
   	   O  s   t t| d|| | jstdt|r<| jdkrt}nt}|di t|| j	| j| j
t| jdd}| j|ddS |dv ro|d urHtdtd|| | jd u rVd n| j}ttj| j	| j| j
|dd}	| j|	d|d	S td
)Nr   z(sum is not implemented with adjust=FalserT   Fr   r   r   r   r   r   r;   )r   r   rP   re   r   rS   r$   r%   r   rq   rQ   r   rp   r   r5   r   r   r>   r   r   r   r   r;   r;   r<   r   I  s@   

zExponentialMovingWindow.sumzc
        bias : bool, default False
            Use a standard estimation bias correction.
        z0(exponential weighted moment) standard deviationstdbiasc                 O  sj   t t| d|| td|| |r(| jjdkr(t| jjs(tt| j	 dt
| jd||d|S )Nr   r1   z$.std does not implement numeric_only)r   r   r;   )r   r   r   r   rj   ndimr   rC   re   __name__r   var)rt   r   r   r   r   r;   r;   r<   r     s   

zExponentialMovingWindow.stdc                 O  s*   t jdtt d | j|g|R i |S )NzGvol is deprecated will be removed in a future version. Use std instead.r_   )rg   rh   ri   r   r   rt   r   r   r   r;   r;   r<   vol  s   zExponentialMovingWindow.volz&(exponential weighted moment) variancer   c                   sZ   t t| d|| td|| tj}t|| j| j| j	|d  fdd}| j
|d|dS )Nr   )rN   rP   rQ   r   c                   s    | |||| S rz   r;   )valuesbeginrx   rO   wfuncr;   r<   var_func  s   z-ExponentialMovingWindow.var.<locals>.var_funcr   )r   r   r   r   r   ewmcovr   rq   rP   rQ   r   )rt   r   r   r   r   r   r   r;   r   r<   r     s   zExponentialMovingWindow.vara  
        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.
        z/(exponential weighted moment) sample covariancecovotherDataFrame | Series | Nonepairwisebool | Nonec                   sN   ddl m  ttdd | d|  fdd}j||||S )Nr   r   r   c           	        s    | } |} }jd urjn|j}|jt||jjjd\}}t	
|||j|jjj	} || j| jdS )N
num_valuesrO   r]   r^   stepindexr   )_prep_valuesr}   rO   window_sizeget_window_boundsrk   r]   r^   r   r   r   rq   rP   rQ   r   r   )	xyx_arrayy_arraywindow_indexerrO   rw   rx   resultr   r   rt   r;   r<   cov_func  s4   


z-ExponentialMovingWindow.cov.<locals>.cov_funcpandasr   r   r   _validate_numeric_only_apply_pairwiserj   )rt   r   r   r   r   r   r   r;   r   r<   r     s   %zExponentialMovingWindow.covaL  
        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.
        z0(exponential weighted moment) sample correlationcorrc                   sL   ddl m  ttdd | d|  fdd}j||||S )Nr   r   r   c           
        s    | } |} }jd urjn|j|jt|jjjd\  fdd}t	j
dd |||}|||}|||}|t||  }	W d    n1 s[w   Y  |	| j| jdS )Nr   c                   s    t |  |jjjd	S )NT)r   r   rq   rP   rQ   )XY)rx   rO   rt   rw   r;   r<   _cov\  s   z<ExponentialMovingWindow.corr.<locals>.cov_func.<locals>._covignore)allr   )r   r}   rO   r   r   rk   r]   r^   r   r6   errstater   r   r   )
r   r   r   r   r   r   r   x_vary_varr   r   rt   )rx   rO   rw   r<   r   K  s,   





z.ExponentialMovingWindow.corr.<locals>.cov_funcr   )rt   r   r   r   r   r   r;   r   r<   r   $  s   "%zExponentialMovingWindow.corr)
NNNNr   TFr   NrT   )rW   r   rN   r+   r,   r+   r-   r@   r.   r+   rO   rX   rP   rY   rQ   rY   rR   r   r>   r?   rS   rZ   r/   r[   )rw   rA   rx   rA   ry   rd   r/   r[   )r/   r   )r~   N)r/   r   F)r   rY   )FF)r   rY   r   rY   r   rY   NNFFr   r   r   r   r   rY   r   rY   NNFr   r   r   r   r   rY   ) r   
__module____qualname____doc___attributesrb   r{   r}   r   r   r   r   r   aggr    r   r   r   r#   r   r!   r"   r   replacer   r   r   r   r   r   r   __classcell__r;   r;   ru   r<   rM      s@    E
U
,)+





0

rM   c                      s>   e Zd ZdZejej Zddd fddZdd	d
Z  Z	S )ExponentialMovingWindowGroupbyzF
    Provide an exponential moving window groupby implementation.
    N)_grouperr/   r[   c                  sf   t  j|g|R d|i| |js/| jd ur1tt| jj	 }t
| j|| j| _d S d S d S )Nr   )ra   rb   emptyr>   r6   concatenatelistr   indicesr   rL   taker-   rp   )rt   rW   r   r   r   groupby_orderru   r;   r<   rb   |  s   

z'ExponentialMovingWindowGroupby.__init__r   c                 C  s   t | jjtd}|S )z
        Return an indexer class that will compute the window start and end bounds

        Returns
        -------
        GroupbyIndexer
        )groupby_indicesr   )r   r   r   r   )rt   r   r;   r;   r<   r}     s
   z2ExponentialMovingWindowGroupby._get_window_indexerr/   r[   )r/   r   )
r   r   r   r   rM   r   r)   rb   r}   r   r;   r;   ru   r<   r   u  s
    r   c                      s   e Zd Z											d5ddd6 fddZd7d d!Zd"d# Zd8d9d%d&Z			d:d;d,d-Z				d<d=d.d/Zd8d9d0d1Z	ddd2d3d4Z
  ZS )>r   Nr   TFr~   rU   rW   r   rN   r+   r,   r-   r@   r.   rO   rX   rP   rY   rQ   rR   r   r>   r?   r   rZ   r   dict[str, bool] | Noner/   r[   c                  sn   |
d urt dt j|||||||||	|
|d t| j| j| j| j|j| _	t
|r3|| _|| _d S td)Nz0times is not implemented with online operations.)rW   rN   r,   r-   r.   rO   rP   rQ   rR   r>   rV   z$'numba' is the only supported engine)re   ra   rb   r&   rq   rP   rQ   rR   rs   _meanr   r   r   r5   )rt   rW   rN   r,   r-   r.   rO   rP   rQ   rR   r>   r   r   rV   ru   r;   r<   rb     s0   
z&OnlineExponentialMovingWindow.__init__c                 C  s   | j   dS )z=
        Reset the state captured by `update` calls.
        N)r   resetr|   r;   r;   r<   r     s   z#OnlineExponentialMovingWindow.resetc                 O     t S rz   re   r   r;   r;   r<   r        z'OnlineExponentialMovingWindow.aggregater   c                 O  r   rz   r   r   r;   r;   r<   r     r   z!OnlineExponentialMovingWindow.stdr   r   r   r   r   c                 K  r   rz   r   )rt   r   r   r   r   r;   r;   r<   r     s   z"OnlineExponentialMovingWindow.corrc                 K  r   rz   r   )rt   r   r   r   r   r   r;   r;   r<   r     s   z!OnlineExponentialMovingWindow.covc                 O  r   rz   r   r   r;   r;   r<   r     r   z!OnlineExponentialMovingWindow.var)updateupdate_timesc                O  st  i }| j jdkr
dnd}|durtdtjt| j j| jd  d dtjd}|durc| j	j
du r6td	d}|j|d
< |rP| j	j
tjddf }	|j|d< n	| j	j
}	|j|d< t|	| f}
n d}| j j|d
< |rt| 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
        r2   TFNz update_times is not implemented.r1   r   rB   z;Must call mean with update=None first before passing updater   columnsr   r;   )rj   r   re   r6   rr   rc   rs   rR   rG   r   last_ewmr5   r   newaxisr   r   r   to_numpyastyper'   r   r   run_ewmrO   squeeze_constructor)rt   r   r   r   r   result_kwargsis_frameupdate_deltasresult_from
last_valuenp_array	ewma_funcr   r;   r;   r<   r     sP   ,

z"OnlineExponentialMovingWindow.mean)NNNNr   TFr   Nr~   N)rW   r   rN   r+   r,   r+   r-   r@   r.   r+   rO   rX   rP   rY   rQ   rY   rR   r   r>   r?   r   rZ   r   r   r/   r[   r   r   r   r   r   r   r   )r   r   r   rb   r   r   r   r   r   r   r   r   r;   r;   ru   r<   r     s:    
+
r   )
r*   r+   r,   r+   r-   r+   r.   r+   r/   r0   )r>   r?   r-   r@   r/   rA   )N
__future__r   rl   	functoolsr   textwrapr   typingr   r   rg   numpyr6   pandas._libs.tslibsr    pandas._libs.window.aggregations_libswindowaggregationsr   pandas._typingr   r	   r   r
   r   pandas.core.genericr   pandas.compat.numpyr   r   pandas.util._decoratorsr   pandas.util._exceptionsr   pandas.core.dtypes.commonr   r   pandas.core.dtypes.missingr   pandas.core.commoncorer3   pandas.core.indexers.objectsr   r   r   pandas.core.util.numba_r   r   pandas.core.window.commonr   r   pandas.core.window.docr   r   r   r   r   r   r    r!   r"   r#   pandas.core.window.numba_r$   r%   pandas.core.window.onliner&   r'   pandas.core.window.rollingr(   r)   r=   rL   rM   r   r   r;   r;   r;   r<   <module>   sH    0

!      n!