zmc
2023-08-08 e792e9a60d958b93aef96050644f369feb25d61b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
U
¬ý°d¢3ã@sÚdZddlmZddlmZddlZddlmZddl    m
Z
ddl m Z ddl mZd    ZGd
d „d ƒZGd d „d eƒZGdd„deƒZGdd„deƒZGdd„deƒZGdd„deƒZGdd„deƒZGdd„deƒZdS)zLIndexer objects for computing start/end window bounds for rolling operationsé)Ú annotations)Ú    timedeltaN)Ú calculate_variable_window_bounds)ÚAppender)Úensure_platform_int)ÚNanoa¾
Computes the bounds of a window.
 
Parameters
----------
num_values : int, default 0
    number of values that will be aggregated over
window_size : int, default 0
    the number of rows in a window
min_periods : int, default None
    min_periods passed from the top level rolling API
center : bool, default None
    center passed from the top level rolling API
closed : str, default None
    closed passed from the top level rolling API
step : int, default None
    step passed from the top level rolling API
    .. versionadded:: 1.5
win_type : str, default None
    win_type passed from the top level rolling API
 
Returns
-------
A tuple of ndarray[int64]s, indicating the boundaries of each
window
c    @sFeZdZdZdddddœdd    „Zeeƒddd
d d d
d dœdd„ƒZdS)Ú BaseIndexerz*Base class for window bounds calculations.Nrúnp.ndarray | NoneÚintÚNone©Ú index_arrayÚ window_sizeÚreturncKs.||_||_| ¡D]\}}t|||ƒqdS)z˜
        Parameters
        ----------
        **kwargs :
            keyword arguments that will be available when get_window_bounds is called
        N)r rÚitemsÚsetattr)Úselfr rÚkwargsÚkeyÚvalue©rúSd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\pandas/core/indexers/objects.pyÚ__init__.s    zBaseIndexer.__init__ú
int | Noneú bool | Noneú
str | Noneútuple[np.ndarray, np.ndarray]©Ú
num_valuesÚ min_periodsÚcenterÚclosedÚsteprcCst‚dS©N)ÚNotImplementedError©rrrr r!r"rrrÚget_window_bounds=s    zBaseIndexer.get_window_bounds)Nr)rNNNN)Ú__name__Ú
__module__Ú __qualname__Ú__doc__rrÚget_window_bounds_docr&rrrrr+sÿúrc    @s2eZdZdZeeƒd ddddddd    œd
d „ƒZdS) ÚFixedWindowIndexerz3Creates window boundaries that are of fixed length.rNr
rrrrrc    Cs„|r|jdd}nd}tjd||d||dd}||j}|dkrP|d8}|dkr`|d8}t |d|¡}t |d|¡}||fS)NéérÚint64©Zdtype©ÚleftÚboth)r2Zneither)rÚnpÚarangeÚclip)    rrrr r!r"ÚoffsetÚendÚstartrrrr&Ls    
z$FixedWindowIndexer.get_window_bounds)rNNNN©r'r(r)r*rr+r&rrrrr,Isúr,c    @s2eZdZdZeeƒd ddddddd    œd
d „ƒZdS) ÚVariableWindowIndexerzNCreates window boundaries that are of variable length, namely for time series.rNr
rrrrrcCst||j||||jƒSr#)rrr r%rrrr&js úz'VariableWindowIndexer.get_window_bounds)rNNNNr:rrrrr;gsúr;c    sNeZdZdZdddddœ‡fdd    „ Zeeƒddd
d d d
d dœdd„ƒZ‡ZS)ÚVariableOffsetWindowIndexerzNCalculate window boundaries based on a non-fixed offset such as a BusinessDay.Nrr    r
r r c s"tƒj||f|Ž||_||_dSr#)ÚsuperrÚindexr7)rr rr>r7r©Ú    __class__rrr„sz$VariableOffsetWindowIndexer.__init__rrrrrcCs¸|dk    rtdƒ‚|dkr4tjdddtjdddfS|dkrN|jdk    rJdnd}|dk}|dk}|j|d    |jdkr|d
}nd    }tj|dd}    |     d
¡tj|dd}
|
 d
¡d|    d<|rÆd    |
d<nd|
d<td    |ƒD]Ö} |j| } |j| ||j} |r | td    ƒ8} | |    | <t|    | d    | ƒD]0}|j|| |tdƒkr&||    | <qXq&|j|
| d    | |tdƒkrŠ| d    |
| <n|
| d    |
| <|sØ|
| d    8<qØ|    |
fS) Nz/step not implemented for variable offset windowrr/r0Úrightr3)rAr3r1r-éÿÿÿÿ)    r$r4Úemptyr>ÚfillÚranger7rr)rrrr r!r"Z right_closedZ left_closedZindex_growth_signr9r8ÚiZ    end_boundZ start_boundÚjrrrr&sF    
 
 
 
 
$z-VariableOffsetWindowIndexer.get_window_bounds)NrNN)rNNNN)    r'r(r)r*rrr+r&Ú __classcell__rrr?rr<sû úr<c    @s2eZdZdZeeƒd ddddddd    œd
d „ƒZdS) ÚExpandingIndexerz;Calculate expanding window bounds, mimicking df.expanding()rNr
rrrrrcCs&tj|tjdtjd|dtjdfS)Nr0r-)r4Úzerosr/r5r%rrrr&Ûs
þz"ExpandingIndexer.get_window_bounds)rNNNNr:rrrrrIØsúrIc    @s2eZdZdZeeƒd ddddddd    œd
d „ƒZdS) ÚFixedForwardWindowIndexera¿
    Creates window boundaries for fixed-length windows that include the current row.
 
    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
 
    >>> indexer = pd.api.indexers.FixedForwardWindowIndexer(window_size=2)
    >>> df.rolling(window=indexer, min_periods=1).sum()
         B
    0  1.0
    1  3.0
    2  2.0
    3  4.0
    4  4.0
    rNr
rrrrrcCs`|r tdƒ‚|dk    rtdƒ‚|dkr(d}tjd||dd}||j}|jrXt |d|¡}||fS)Nz.Forward-looking windows can't have center=TruezAForward-looking windows don't support setting the closed argumentr-rr/r0)Ú
ValueErrorr4r5rr6)rrrr r!r"r9r8rrrr&s    ÿ
z+FixedForwardWindowIndexer.get_window_bounds)rNNNNr:rrrrrKêsúrKc    s^eZdZdZdddedfddddddd    œ‡fd
d „ Zeeƒdd d ddd ddœdd„ƒZ‡Z    S)ÚGroupbyIndexerzMCalculate bounds to compute groupby rolling, mimicking df.groupby().rolling()Nrr    zint | BaseIndexerz dict | Noneztype[BaseIndexer]r )r rÚgroupby_indicesÚwindow_indexerÚindexer_kwargsrc sH|pi|_||_|r| ¡ni|_tƒjf||j d|¡dœ|—ŽdS)a4
        Parameters
        ----------
        index_array : np.ndarray or None
            np.ndarray of the index of the original object that we are performing
            a chained groupby operation over. This index has been pre-sorted relative to
            the groups
        window_size : int or BaseIndexer
            window size during the windowing operation
        groupby_indices : dict or None
            dict of {group label: [positional index of rows belonging to the group]}
        window_indexer : BaseIndexer
            BaseIndexer class determining the start and end bounds of each group
        indexer_kwargs : dict or None
            Custom kwargs to be passed to window_indexer
        **kwargs :
            keyword arguments that will be available when get_window_bounds is called
        r©r rN)rNrOÚcopyrPr=rÚpop)rr rrNrOrPrr?rrr s
 þýzGroupbyIndexer.__init__r
rrrrrcCsZg}g}d}|j ¡D]ø\}    }
|jdk    r:|j t|
ƒ¡} n|j} |jf| |jdœ|j—Ž} |  t    |
ƒ||||¡\} }|  
t j ¡} | 
t j ¡}t    | ƒt    |ƒks¤t dƒ‚t  ||t    |
ƒ¡}|t    |
ƒ7}t  ||ddg¡j
t j dd}| | t| ƒ¡¡| | t|ƒ¡¡qt    |ƒdkr>t jgt j dt jgt j dfSt  |¡} t  |¡}| |fS)    NrrQz6these should be equal in length from get_window_boundsrBr-F)rRr0)rNrr ZtakerrOrrPr&ÚlenZastyper4r/ÚAssertionErrorr5ÚappendÚarrayZ concatenate)rrrr r!r"Z start_arraysZ
end_arraysZwindow_indices_startrÚindicesr Zindexerr9r8Zwindow_indicesrrrr&DsV 
þýÿ  ÿþ
ÿ ÿ 
 
z GroupbyIndexer.get_window_bounds)rNNNN)
r'r(r)r*rrrr+r&rHrrr?rrMsú$úrMc    @s2eZdZdZeeƒd ddddddd    œd
d „ƒZdS) ÚExponentialMovingWindowIndexerz/Calculate ewm window bounds (the entire window)rNr
rrrrrcCs$tjdgtjdtj|gtjdfS)Nrr0)r4rWr/r%rrrr&}s    z0ExponentialMovingWindowIndexer.get_window_bounds)rNNNNr:rrrrrYzsúrY)r*Ú
__future__rÚdatetimerÚnumpyr4Zpandas._libs.window.indexersrZpandas.util._decoratorsrZpandas.core.dtypes.commonrZpandas.tseries.offsetsrr+rr,r;r<rIrKrMrYrrrrÚ<module>s       W3]