U
    MZfE]                     @  s   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
mZ er`d dlmZ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mZmZmZmZmZmZm Z  d d
l!m"Z"m#Z# G dd de#Z$G dd de"e$Z%dS )    )annotations)dedent)TYPE_CHECKINGAnyCallable)AxisQuantileInterpolationWindowingRankType)	DataFrameSeries)NDFrame)doc)BaseIndexerExpandingIndexerGroupbyIndexer)	_shared_docscreate_section_headerkwargs_numeric_onlynumba_notestemplate_headertemplate_returnstemplate_see_alsowindow_agg_numba_parameterswindow_apply_parameters)BaseWindowGroupbyRollingAndExpandingMixinc                      s\  e Zd ZU dZdddgZded< ddddddd fddZddddZee	d e
de
dddd fddZeZeeedeed ed
d! d"d#d$d%dd'd( fd)d*Zeeed+eedeed ed
d! d"d,d-d%
dd.d'd/d0d1d2d3 fd4d5Zeeed+ee edeed eed6ed
d! d"d7d7d%dd'd/d0d8 fd9d:Zeeed+ee edeed eed6ed
d! d"d;d<d%dd'd/d0d8 fd=d>Zeeed+ee edeed eed6ed
d! d"d?d@d%dd'd/d0d8 fdAdBZeeed+ee edeed eed6ed
d! d"dCdCd%dd'd/d0d8 fdDdEZeeed+ee edeed eed6ed
d! d"dFdFd%dd'd/d0d8 fdGdHZeeed+e
dIdJddeedKedeed dLeed6e
dMdJddedNe
dOdJddd"dPdQd%ddd'd/d0dR fdSdTZeeed+e
dIdJddeedKedeed dUeed6e
dVdJddedNe
dWdJddd"dXdYd%ddd'd/d0dR fdZd[Zeeed+e
dIdJddeedeed eed6d\edNe
d]dJddd"d^d_d%ddd'd` fdadbZeeed+eedeed dceed6ddd"dedfd%dd'd( fdgdhZ eeed+eedeed dieed6djedNe
dkdJddd"dldmd%dd'd( fdndoZ!eeed+e
dpdJddeedeed ed
d! d"dqdqd%ddsdtd'du fdvdwZ"eedxed+e
dydJddeedeed eedNe
dzdJddd"d{d{d%dd~d'd'd'd fddZ#eeed+e
ddJddeedeed ed
d! d"ddd%ddddd'd fddZ$eeed+e
ddJddeedeed e
ddJddeed6e
ddJddd"ddd%ddddd'd fddZ%  Z&S )	Expandinga  
    Provide expanding window calculations.

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

    axis : int or str, default 0
        If ``0`` or ``'index'``, roll across the rows.

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

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

    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.

        .. versionadded:: 1.3.0

    Returns
    -------
    ``Expanding`` subclass

    See Also
    --------
    rolling : Provides rolling window calculations.
    ewm : Provides exponential weighted functions.

    Notes
    -----
    See :ref:`Windowing Operations <window.expanding>` 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

    **min_periods**

    Expanding sum with 1 vs 3 observations needed to calculate a value.

    >>> df.expanding(1).sum()
         B
    0  0.0
    1  1.0
    2  3.0
    3  3.0
    4  7.0
    >>> df.expanding(3).sum()
         B
    0  NaN
    1  NaN
    2  3.0
    3  3.0
    4  7.0
    min_periodsaxismethodz	list[str]_attributes   r   singleNr   intr   strNone)objr   r   r   returnc                   s   t  j|||||d d S )N)r&   r   r   r   	selection)super__init__)selfr&   r   r   r   r(   	__class__ @/tmp/pip-unpacked-wheel-nbcvw55c/pandas/core/window/expanding.pyr*   u   s    zExpanding.__init__r   r'   c                 C  s   t  S )z[
        Return an indexer class that will compute the window start and end bounds
        )r   )r+   r.   r.   r/   _get_window_indexer   s    zExpanding._get_window_indexer	aggregatez
        See Also
        --------
        pandas.DataFrame.aggregate : Similar DataFrame method.
        pandas.Series.aggregate : Similar Series method.
        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 )Zsee_alsoZexamplesklassr   c                   s   t  j|f||S )N)r)   r2   )r+   funcargskwargsr,   r.   r/   r2      s     zExpanding.aggregateZReturnszSee AlsoZ	expandingzcount of non NaN observationscount)Zwindow_methodZaggregation_descriptionZ
agg_methodFboolnumeric_onlyc                   s   t  j|dS Nr;   )r)   r9   r+   r<   r,   r.   r/   r9      s    zExpanding.countZ
Parameterszcustom aggregation functionapplyzCallable[..., Any]z
str | Nonezdict[str, bool] | Noneztuple[Any, ...] | Nonezdict[str, Any] | None)r5   rawengineengine_kwargsr6   r7   c                   s   t  j||||||dS )N)r@   rA   rB   r6   r7   )r)   r?   )r+   r5   r@   rA   rB   r6   r7   r,   r.   r/   r?      s    zExpanding.applyZNotessumr<   rA   rB   c                   s   t  j|||dS NrD   )r)   rC   r+   r<   rA   rB   r,   r.   r/   rC      s
    zExpanding.summaximummaxc                   s   t  j|||dS rE   )r)   rH   rF   r,   r.   r/   rH      s
    zExpanding.maxZminimumminc                   s   t  j|||dS rE   )r)   rI   rF   r,   r.   r/   rI     s
    zExpanding.minmeanc                   s   t  j|||dS rE   )r)   rJ   rF   r,   r.   r/   rJ   +  s
    zExpanding.meanmedianc                   s   t  j|||dS rE   )r)   rK   rF   r,   r.   r/   rK   F  s
    zExpanding.medianz
        ddof : int, default 1
            Delta Degrees of Freedom.  The divisor used in calculations
            is ``N - ddof``, where ``N`` represents the number of elements.

        
z1.4z/numpy.std : Equivalent method for NumPy array.
z
        The default ``ddof`` of 1 used in :meth:`Series.std` is different
        than the default ``ddof`` of 0 in :func:`numpy.std`.

        A minimum of one period is required for the rolling calculation.

        ZExamplesa  
        >>> s = pd.Series([5, 5, 6, 7, 5, 5, 5])

        >>> s.expanding(3).std()
        0         NaN
        1         NaN
        2    0.577350
        3    0.957427
        4    0.894427
        5    0.836660
        6    0.786796
        dtype: float64
        zstandard deviationstdddofr<   rA   rB   c                   s   t  j||||dS NrN   )r)   rM   r+   rO   r<   rA   rB   r,   r.   r/   rM   a  s    5zExpanding.stdz/numpy.var : Equivalent method for NumPy array.
z
        The default ``ddof`` of 1 used in :meth:`Series.var` is different
        than the default ``ddof`` of 0 in :func:`numpy.var`.

        A minimum of one period is required for the rolling calculation.

        a  
        >>> s = pd.Series([5, 5, 6, 7, 5, 5, 5])

        >>> s.expanding(3).var()
        0         NaN
        1         NaN
        2    0.333333
        3    0.916667
        4    0.800000
        5    0.700000
        6    0.619048
        dtype: float64
        Zvariancevarc                   s   t  j||||dS rP   )r)   rR   rQ   r,   r.   r/   rR     s    5zExpanding.varz:A minimum of one period is required for the calculation.

z
        >>> s = pd.Series([0, 1, 2, 3])

        >>> s.expanding().sem()
        0         NaN
        1    0.707107
        2    0.707107
        3    0.745356
        dtype: float64
        zstandard error of meansemrO   r<   c                   s   t  j||dS )NrT   )r)   rS   )r+   rO   r<   r,   r.   r/   rS     s    #zExpanding.semz:scipy.stats.skew : Third moment of a probability density.
zDA minimum of three periods is required for the rolling calculation.
zunbiased skewnessskewc                   s   t  j|dS r=   )r)   rU   r>   r,   r.   r/   rU     s    zExpanding.skewz/scipy.stats.kurtosis : Reference SciPy method.
z<A minimum of four periods is required for the calculation.

a[  
        The example below will show a rolling calculation with a window size of
        four matching the equivalent function call using `scipy.stats`.

        >>> arr = [1, 2, 3, 4, 999]
        >>> import scipy.stats
        >>> print(f"{{scipy.stats.kurtosis(arr[:-1], bias=False):.6f}}")
        -1.200000
        >>> print(f"{{scipy.stats.kurtosis(arr, bias=False):.6f}}")
        4.999874
        >>> s = pd.Series(arr)
        >>> s.expanding(4).kurt()
        0         NaN
        1         NaN
        2         NaN
        3   -1.200000
        4    4.999874
        dtype: float64
        z,Fisher's definition of kurtosis without biaskurtc                   s   t  j|dS r=   )r)   rV   r>   r,   r.   r/   rV     s    &zExpanding.kurta  
        quantile : float
            Quantile to compute. 0 <= quantile <= 1.
        interpolation : {{'linear', 'lower', 'higher', 'midpoint', 'nearest'}}
            This optional parameter specifies the interpolation method to use,
            when the desired quantile lies between two data points `i` and `j`:

                * linear: `i + (j - i) * fraction`, where `fraction` is the
                  fractional part of the index surrounded by `i` and `j`.
                * lower: `i`.
                * higher: `j`.
                * nearest: `i` or `j` whichever is nearest.
                * midpoint: (`i` + `j`) / 2.
        quantilelinearfloatr   rW   interpolationr<   c                   s   t  j|||dS )NrZ   )r)   rW   )r+   rW   r[   r<   r,   r.   r/   rW   8  s
    "zExpanding.quantilez.. versionadded:: 1.4.0 

a  
        method : {{'average', 'min', 'max'}}, default 'average'
            How to rank the group of records that have the same value (i.e. ties):

            * average: average rank of the group
            * min: lowest rank in the group
            * max: highest rank in the group

        ascending : bool, default True
            Whether or not the elements should be ranked in ascending order.
        pct : bool, default False
            Whether or not to display the returned rankings in percentile
            form.
        a+  
        >>> s = pd.Series([1, 4, 2, 3, 5, 3])
        >>> s.expanding().rank()
        0    1.0
        1    2.0
        2    2.0
        3    3.0
        4    5.0
        5    3.5
        dtype: float64

        >>> s.expanding().rank(method="max")
        0    1.0
        1    2.0
        2    2.0
        3    3.0
        4    5.0
        5    4.0
        dtype: float64

        >>> s.expanding().rank(method="min")
        0    1.0
        1    2.0
        2    2.0
        3    3.0
        4    5.0
        5    3.0
        dtype: float64
        rankaverageTr	   r   	ascendingpctr<   c                   s   t  j||||dS )Nr^   )r)   r\   )r+   r   r_   r`   r<   r,   r.   r/   r\   `  s    DzExpanding.ranka   
        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 MultiIndexed DataFrame in the case of DataFrame
            inputs. In the case of missing elements, only complete pairwise
            observations will be used.
        ddof : int, default 1
            Delta Degrees of Freedom.  The divisor used in calculations
            is ``N - ddof``, where ``N`` represents the number of elements.
        zsample covariancecovzDataFrame | Series | Nonezbool | NoneotherpairwiserO   r<   c                   s   t  j||||dS Nrb   )r)   ra   r+   rc   rd   rO   r<   r,   r.   r/   ra     s    $zExpanding.covaN  
        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 MultiIndexed DataFrame in the case of DataFrame
            inputs. In the case of missing elements, only complete pairwise
            observations will be used.
        z
        cov : Similar method to calculate covariance.
        numpy.corrcoef : NumPy Pearson's correlation calculation.
        an  
        This function uses Pearson's definition of correlation
        (https://en.wikipedia.org/wiki/Pearson_correlation_coefficient).

        When `other` is not specified, the output will be self correlation (e.g.
        all 1's), except for :class:`~pandas.DataFrame` inputs with `pairwise`
        set to `True`.

        Function will return ``NaN`` for correlations of equal valued sequences;
        this is the result of a 0/0 division error.

        When `pairwise` is set to `False`, only matching columns between `self` and
        `other` will be used.

        When `pairwise` is set to `True`, the output will be a MultiIndex DataFrame
        with the original index on the first level, and the `other` DataFrame
        columns on the second level.

        In the case of missing elements, only complete pairwise observations
        will be used.
        Zcorrelationcorrc                   s   t  j||||dS re   )r)   rg   rf   r,   r.   r/   rg     s    ?zExpanding.corr)r!   r   r"   N)F)FNNNN)FNN)FNN)FNN)FNN)FNN)r!   FNN)r!   FNN)r!   F)F)F)rX   F)r]   TFF)NNr!   F)NNr!   F)'__name__
__module____qualname____doc__r    __annotations__r*   r1   r   r   r   r2   Zaggr   r   r   r   r9   r   r?   r   r   r   rC   rH   rI   rJ   rK   replacerM   rR   rS   rU   rV   rW   r\   ra   rg   __classcell__r.   r.   r,   r/   r   ,   sB  
F    


      
   
   
   
   
         0          0        "  %  
      ?      
          :    r   c                   @  s*   e Zd ZdZejej ZddddZdS )ExpandingGroupbyz5
    Provide a expanding groupby implementation.
    r   r0   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
        )Zgroupby_indiceswindow_indexer)r   _grouperindicesr   )r+   rp   r.   r.   r/   r1   $  s
    z$ExpandingGroupby._get_window_indexerN)rh   ri   rj   rk   r   r    r   r1   r.   r.   r.   r/   ro     s   ro   N)&
__future__r   textwrapr   typingr   r   r   Zpandas._typingr   r   r	   Zpandasr
   r   Zpandas.core.genericr   Zpandas.util._decoratorsr   Zpandas.core.indexers.objectsr   r   r   Zpandas.core.window.docr   r   r   r   r   r   r   r   r   Zpandas.core.window.rollingr   r   r   ro   r.   r.   r.   r/   <module>   s"   ,     v