Pandas Example:
Source Series:
import pandas as pd In [109]: s = pd.Series([1,2,3,4,6,3,4,0,2]) In [110]: s Out[110]: 0 1 1 2 2 3 3 4 4 6 5 3 6 4 7 0 8 2 dtype: int64
Use the sliding window ( Series.rolling () ):
In [111]: s.rolling(3, min_periods=1).sum() Out[111]: 0 1.0 1 3.0 2 6.0 3 9.0 4 13.0 5 13.0 6 13.0 7 7.0 8 6.0 dtype: float64 In [112]: idx = s.rolling(3, min_periods=1).sum().idxmax() In [113]: idx Out[113]: 4 In [114]: s.loc[idx-2:idx] Out[114]: 2 3 3 4 4 6 dtype: int64
Measuring speed for an array of 1.000.000 items:
In [18]: a = np.random.randint(10**4, size=10**6) In [19]: a Out[19]: array([9918, 4299, 7829, ..., 7513, 3367, 7140]) In [20]: pd.options.display.max_rows = 15 In [21]: s = pd.Series(a) In [22]: %%timeit ...: idx = s.rolling(3, min_periods=1).sum().idxmax() ...: s.loc[idx-2:idx] ...: 115 ms ± 7.44 ms per loop (mean ± std. dev. of 7 runs, 10 loops each) In [23]: s.shape Out[23]: (1000000,)