Вы можете просто применить нарезку на фреймах данных, чтобы получить интервал, а затем применить градиент.
import pandas as pd
df=pd.DataFrame({'Timestamp':[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2,1.3,1.4,1.5,1.6],'speed':[27,27,27,86,86,86,74,74,74,88,88,88,62,62,62,62]})
import numpy as np
g1 = np.gradient(df["speed"], df["Timestamp"])
spacing = 4
g2 = np.gradient(df["speed"][::spacing], df["Timestamp"][::spacing])
Out:
[ 0.00000000e+00 0.00000000e+00 2.95000000e+02 2.95000000e+02
0.00000000e+00 -6.00000000e+01 -6.00000000e+01 0.00000000e+00
7.00000000e+01 7.00000000e+01 5.68434189e-14 -1.30000000e+02
-1.30000000e+02 -1.13686838e-13 0.00000000e+00 0.00000000e+00]
[147.5 58.75 -30. -30. ]
Вы можете сделать что-то подобное, так как ваше требование отличается:
def gradient(y, x, spacing=1):
y_c = np.pad(y, (spacing-1, spacing-1), 'constant', constant_values=(0, 0))
x_c = np.pad(x, (spacing-1, spacing-1), 'constant', constant_values=(0, 0))
dydx = []
#print(y)
#print(y_c)
for i in range(1, y.shape[0]):
dy = y_c[i+spacing-1] - y_c[i-1]
dx = x_c[i+spacing-1] - x_c[i-1]
dydx.append(dy/dx)
return np.array(dydx)
Примечание: этот результат не будет соответствовать numpy градиент для интервала = 1, так как numpy использует 2-шаговый размер по умолчанию для расчета dy / dx.