Skip to content Skip to sidebar Skip to footer

Pandas Rolling Values

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.

Solution 1:

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]]

Solution 2:

Even though the thread is old, maybe it will help someone else. I'm a beginner, but I solved user5805065's question by following procedure. Maybe, someone can make it more elegant and efficient.

  • converting Pandas series to NumPy:
rollTemperature = df['temperature'].values
  • then I've created numpy array in a for loop with some initial variables:
period = 2
stop = len(rollTemperature)
diffRoll = np.zeros(stop)

for i in range(0,stop):

    if i == 0:
        diffRoll[i] = np.nan

    elif np.mod(i,period)!=0:
        diffRoll[i] = np.nan

    else:
        diffRoll[i] = (rollTemperature[i] + rollTemperature[i-period])/2
  • than adding numpy array to existin dataFrame:
df['diffRoll'] = diffRoll 

Than the output is:

   temperature  diffRoll
0         0.00       NaN
1         1.00       NaN
2         2.00       1.0
3          NaN       NaN
4         4.00       3.0
5         2.00       NaN
6         0.80       2.4
7         4.00       NaN
8         8.80       4.8
9         7.12       NaN

Post a Comment for "Pandas Rolling Values"