Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pandas rolling values

Tags:

python

pandas

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.


2 Answers

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]]
like image 147
jezrael Avatar answered Oct 31 '25 04:10

jezrael


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
like image 36
G.G Avatar answered Oct 31 '25 02:10

G.G



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!