B
    W0dP                 @  s   d dl mZ d dlmZ d dlmZmZ d dlmZm	Z	m
Z
 d dlmZ d dlmZ d dlmZ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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)AnyCallable)AxisFrameOrSeriesFrameOrSeriesUnion)function)doc)
_shared_docsargs_compatcreate_section_headerkwargs_compatnumba_notestemplate_headertemplate_returnstemplate_see_alsowindow_agg_numba_parameterswindow_apply_parameters)BaseIndexerExpandingIndexerGroupbyIndexer)BaseWindowGroupbyRollingAndExpandingMixinc                  s  e Zd ZdZddddgZdd
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# fd$d%Zeeed&eedeededd d d'd(d#
dd*d+d,d-d.d/d0 fd1d2Zeeed&eeeedeedeed3edd d d4d4d#ddd5d,d-d5 fd6d7Zeeed&eeeedeedeed3edd d d8d9d#ddd5d,d-d5 fd:d;Zeeed&eeeedeedeed3edd d d<d=d#ddd5d,d-d5 fd>d?Zeeed&eeeedeedeed3edd d d@d@d#ddd5d,d-d5 fdAdBZeeed&eeedeedeed3edd d dCdCd#dd,d-d5 fdDdEZeeed&e	dFdGddeeedeeddHeed3e	dIdGddedJe	dKdGddd dLdMd#dddN fdOdPZeeed&e	dFdGddeeedeeddQeed3e	dRdGddedJe	dSdGddd dTdUd#dddN fdVdWZeeed&e	dFdGddeeedeedeed3dXedJe	dYdGddd dZd[d#dddN fd\d]Zeeed&eedeedd^eed3d_d d`dad# fdbdcZ eeed&eedeedddeed3deedJe	dfdGddd dgdhd# fdidjZ!eeed&e	dkdGddeedeededd d dldld#ddnddo fdpdqZ"eeed&e	drdGddeedeededd d dsdtd#ddudvddw fdxdyZ#eeed&e	dzdGddeedeede	d{dGddeed3e	d|dGddd d}d~d#ddudvddw fddZ$  Z%S )	Expandinga  
    Provide expanding transformations.

    Parameters
    ----------
    min_periods : int, default 1
        Minimum number of observations in window required to have a value
        (otherwise result is NA).
    center : bool, default False
        Set the labels at the center of the window.
    axis : int or str, default 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
    -------
    a Window sub-classed for the particular operation

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

    Notes
    -----
    By default, the result is set to the right edge of the window. This can be
    changed to the center of the window by setting ``center=True``.

    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.expanding(2).sum()
         B
    0  NaN
    1  1.0
    2  3.0
    3  3.0
    4  7.0
    min_periodscenteraxismethod   Nr   singler   intr   str)objr   r   r   c               s   t  j||||||d d S )N)r#   r   r   r   r   	selection)super__init__)selfr#   r   r   r   r   r$   )	__class__ N/var/www/html/venv/lib/python3.7/site-packages/pandas/core/window/expanding.pyr&   a   s    	zExpanding.__init__r   )returnc             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_indexers   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%   r-   )r'   funcargskwargs)r(   r)   r*   r-   y   s     zExpanding.aggregateZReturnszSee AlsoZ	expandingzcount of non NaN observationscount)Zwindow_methodZaggregation_descriptionZ
agg_methodc               s
   t   S )N)r%   r4   )r'   )r(   r)   r*   r4      s    zExpanding.countZ
Parameterszcustom aggregation functionapplyFzCallable[..., Any]boolz
str | Nonezdict[str, bool] | Noneztuple[Any, ...] | Nonezdict[str, Any] | None)r0   rawengineengine_kwargsr1   r2   c               s   t  j||||||dS )N)r7   r8   r9   r1   r2   )r%   r5   )r'   r0   r7   r8   r9   r1   r2   )r(   r)   r*   r5      s    zExpanding.applyZNotessum)r8   r9   c              s&   t d|| t j|||d|S )Nr:   )r8   r9   )nvvalidate_expanding_funcr%   r:   )r'   r8   r9   r1   r2   )r(   r)   r*   r:      s    zExpanding.summaximummaxc              s&   t d|| t j|||d|S )Nr>   )r8   r9   )r;   r<   r%   r>   )r'   r8   r9   r1   r2   )r(   r)   r*   r>      s    zExpanding.maxminimumminc              s&   t d|| t j|||d|S )Nr@   )r8   r9   )r;   r<   r%   r@   )r'   r8   r9   r1   r2   )r(   r)   r*   r@      s    zExpanding.minmeanc              s&   t d|| t j|||d|S )NrA   )r8   r9   )r;   r<   r%   rA   )r'   r8   r9   r1   r2   )r(   r)   r*   rA     s    zExpanding.meanmedianc               s   t  jf ||d|S )N)r8   r9   )r%   rB   )r'   r8   r9   r2   )r(   r)   r*   rB   0  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/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)ddofc               s$   t d|| t jf d|i|S )NrD   rE   )r;   r<   r%   rD   )r'   rE   r1   r2   )r(   r)   r*   rD   G  s    /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 d|| t jf d|i|S )NrF   rE   )r;   r<   r%   rF   )r'   rE   r1   r2   )r(   r)   r*   rF   y  s    /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semc               s   t  jf d|i|S )NrE   )r%   rG   )r'   rE   r1   r2   )r(   r)   r*   rG     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f |S )N)r%   rH   )r'   r2   )r(   r)   r*   rH     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f |S )N)r%   rI   )r'   r2   )r(   r)   r*   rI     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float)rJ   interpolationc               s   t  jf ||d|S )N)rJ   rM   )r%   rJ   )r'   rJ   rM   r2   )r(   r)   r*   rJ     s    "zExpanding.quantilea   
        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FrameOrSeriesUnion | Nonezbool | None)otherpairwiserE   c               s   t  jf |||d|S )N)rO   rP   rE   )r%   rN   )r'   rO   rP   rE   r2   )r(   r)   r*   rN   3  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f |||d|S )N)rO   rP   rE   )r%   rQ   )r'   rO   rP   rE   r2   )r(   r)   r*   rQ   Y  s    ?zExpanding.corr)r   Nr   r    N)FNNNN)NN)r   )r   )r   )rK   )NNr   )NNr   )&__name__
__module____qualname____doc___attributesr&   r,   r
   r   r   r-   Zaggr   r   r   r   r4   r   r5   r   r   r   r   r:   r>   r@   rA   rB   replacerD   rF   rG   rH   rI   rJ   rN   rQ   __classcell__r)   r)   )r(   r*   r   (   s<  5    

     




 

	
    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   )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
        )Zgroupby_indiceswindow_indexer)r   _grouperindicesr   )r'   rZ   r)   r)   r*   r,     s    z$ExpandingGroupby._get_window_indexerN)rR   rS   rT   rU   r   rV   r   r,   r)   r)   r)   r*   rY     s   rY   N)$
__future__r   textwrapr   typingr   r   Zpandas._typingr   r   r   Zpandas.compat.numpyr	   r;   Zpandas.util._decoratorsr
   Zpandas.core.window.docr   r   r   r   r   r   r   r   r   r   Zpandas.core.window.indexersr   r   r   Zpandas.core.window.rollingr   r   r   rY   r)   r)   r)   r*   <module>   s   0    w