How do I obtain the rolling values of some length n of a pandas series of value ?
For example, if I have the following:
df = pd.DataFrame({'temperature': [0, 1, 2, np.nan, 4, 2, 0.8, 4, 8.8, 7.12]})
how do I obtain the moving values of length n, i.e. something like, if n=3:
[NaN, NaN, 0], [NaN, 0, 1],..., [4, 8.8, 7.12]
EDIT: If I use pandas rolling, as:
roll = pd.Series.rolling(df, 3).mean()
then roll is the moving averages of the series. Here, I do not want the averages of every moving set of 3 values, but these sets of 3 values.
I think you need first add NaNs and then this solution:
N = 3
x = np.concatenate([[np.nan] * (N-1), df['temperature'].values])
def rolling_window(a, window):
    shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
    strides = a.strides + (a.strides[-1],)
    return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
print (rolling_window(x, N))
[[  nan   nan  0.  ]
 [  nan  0.    1.  ]
 [ 0.    1.    2.  ]
 [ 1.    2.     nan]
 [ 2.     nan  4.  ]
 [  nan  4.    2.  ]
 [ 4.    2.    0.8 ]
 [ 2.    0.8   4.  ]
 [ 0.8   4.    8.8 ]
 [ 4.    8.8   7.12]]
pd.concat([df1.shift(i) for i in range(3)],axis=1).loc[:,::-1]\
    .agg(list,axis=1)
0     [nan, nan, 0.0]
1     [nan, 0.0, 1.0]
2     [0.0, 1.0, 2.0]
3     [1.0, 2.0, nan]
4     [2.0, nan, 4.0]
5     [nan, 4.0, 2.0]
6     [4.0, 2.0, 0.8]
7     [2.0, 0.8, 4.0]
8     [0.8, 4.0, 8.8]
9    [4.0, 8.8, 7.12]
dtype: object
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With