§
    
�’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?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         úDC:\Projects\DSCons\.venv\Lib\site-packages\pandas\core\window\ewm.pyÚget_center_of_massr4   ?   s#  € õ Ô'¨°°hÀÑFÔF€KØ�Q‚€ÝÐSÑTÔTÐTð ÐØ�AŠ:ˆ:ÝÐ?Ñ@Ô@Ð@ð à	Ð	Ø�!Š8ˆ8ÝÐ;Ñ<Ô<Ð<Ø˜‘(˜a‘ˆˆØ	Ð	Ø�qŠ=ˆ=ÝÐBÑCÔCÐCØ•B”F�2œ6 #™;œ;¨Ñ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˜Ÿ
š
¥2¤8Ñ,Ô,µB´JÐ?Ñ?Ô?€FÝ•i Ñ)Ô)×1Ò1°$Ñ7Ô7Ô>Ñ?Ô?€IÝŒ7�6‰?Œ?˜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Ô:JÈAÑ6NÔ6NØØØØØð 	ñ 	
ô 	
ð 	
ð ˆŒØˆŒ	Ø ˆŒØˆŒ
ØˆŒØ"ˆŒØˆŒ
ØŒ:Ñ!Ý! $¤*¨g°tÑ<Ô<ˆKå# KÑ0Ô0ðDå˜k­?Ñ;Ô;ðDõ !Ð!BÑCÔCÐCÝ�4”:‰Œ¥# c¡(¤(Ò*Ð*Ý Ð!OÑPÔPÐPÝ˜dœm­cµ8Ô3EÅrÄ~Ð-VÑWÔWð TÝ Ð!RÑSÔSÐSÝ�D”JÑÔ×#Ò#Ñ%Ô%ð IÝ Ð!GÑHÔHÐHÝ,¨T¬Z¸¼ÑGÔGˆDŒLõ Ô$ T¤X¨t¬y¸$¼*ÑEÔEÈÒIÐIØ”{ð Ý-ð=ñô ð õ /¨t¬x¸¼ÀDÈ$Ì*ÑUÔU�”	�	�	à�”	�	�	àŒ}Ð(­ZØ”¥¥XÔ%7½¼ÐHñ.ô .Ð(õ !ð)ñô ð õ
 œ7¥3 t¤x¤~°aÔ'8¸1Ñ'<¸aÑ#@Ô#@ÍÌ
ÐSÑSÔSˆDŒLÝ*ð ”Ø”	Ø”Ø”
ñô ˆDŒIˆIˆIr5   Ú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 !�u‰wŒwÔ  Ð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ð —;’;˜x¨f�;Ñ5Ô5Ð5ØÐ'Ð'Ð'ØÐ(Ý Ð!NÑOÔOÐOà!œZÐ/�T�T°T´\ˆ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ð —;’;˜x¨e�;Ñ4Ô4Ð4ØÐ'Ð'Ð'ØÐ(Ý Ð!NÑOÔOÐOà!œZÐ/�T�T°T´\ˆ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Ý�T—X’X 4°l�XÑ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Ô7ˆNð Ô#Ð/ð Ô Ð à#Ô/ð ð
 (×9Ò9Ý˜w™<œ<Ø'Ø”{Ø”{Ø”Yð :ñ ô ‰JˆE�3õ )Ô/ØØØð Ô ØØ”	Ø”Ø”Øñô ˆFð �6˜&¨¬°a´fÀ5Ð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Ô7ˆNð Ô#Ð/ð Ô Ð à#Ô/ð ð
 (×9Ò9Ý˜w™<œ<Ø'Ø”{Ø”{Ø”Yð :ñ ô ‰JˆE�3ðð ð ð ð ð ð ð õ ” Ð*Ñ*Ô*ð 4ð 4Ø�d˜7 GÑ,Ô,�Ø˜˜W gÑ.Ô.�Ø˜˜W gÑ.Ô.�Ø�u U¨U¡]Ñ3Ô3Ñ3�ð	4ð 4ð 4ñ 4ô 4ð 4ð 4ð 4ð 4ð 4ð 4øøøð 4ð 4ð 4ð 4ð
 �6˜&¨¬°a´fÀ5Ð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à!Ð!Ð!Ð!Ð!Ð!à×#Ò# F¨LÑ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8ðP €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£   ø€ Ø�‰ŒÔ˜ÐA˜tÐAÐAÐA¨hÐA¸&ÐAÐAÐAàŒyð 	˜TœZÐ3åœN­4°´Ô0E×0LÒ0LÑ0NÔ0NÑ+OÔ+OÑPÔPˆMÝ,Ø”
—’ Ñ.Ô.Ø”ñô ˆDŒLˆLˆLð	ð 	Ð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{   ø€ € € € € ðð ð *Ô5Ð8IÔ8UÑU€Kà,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Ø ˆDŒKØ!.ˆ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Ô4½B¼Jð
ñ 
ô 
ˆð ÐØŒzÔ"Ð*Ý ØQñô ð ð ˆKØ%+¤\ˆM˜'Ñ"Øð 4Ø!œZÔ0µ´¸Q¸Q¸Q°Ô?�
Ø+1¬>�˜iÑ(Ð(à!œZÔ0�
Ø(.¬�˜fÑ%Ý”~ z°6·?²?Ñ3DÔ3DÐ&EÑFÔFˆHˆHàˆKØ%)Ô%7Ô%=ˆM˜'Ñ"Øð @Ø+/Ô+=Ô+E�˜iÑ(Ð(à(,Ô(:Ô(?�˜fÑ%ØÔ)×0Ò0µ´Ñ<Ô<×EÒEÑGÔGˆHÝ3ð 
ð 
Ý Ô 2Ñ3Ô3ð
ð 
ˆ	ð ”×#Ò#Ø Ð=ˆHˆH h¨q¨q¨qµ"´*¨}Ô&=ØØÔØñ	
ô 
ˆð ð 	&Ø—^’^Ñ%Ô%ˆ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 €ÐÑ Ô ðð ð ð ð Ð%6Ð8Oñ ô ñ !Ô ððB^ð ^ð ^ð ^ð ^Ð$;ñ ^ô ^ð ^ð ^ð ^r5   