I'd like to filter online data with savgol_filter from scipy.signal library. But when I was trying to use it for online data (when new elements appear one by one) I realized that savgol_filter works with online data with some delay (window_length//2) in comparison to how it works with offline data (their elements are available for calculation all at once). I use code similar to that (see below please)
from queue import Queue, Empty
import numpy as np
from scipy.signal import savgol_filter
window_size = 5
data = list()
q = Queue()
d = [2.22, 2.22, 5.55, 2.22, 1.11, 0.01, 1.11, 4.44, 9.99, 1.11, 3.33]
for i in d:
q.put(i)
res = list()
while not q.empty():
element = q.get()
data.append(element)
length = len(data)
npd = np.array(data[length - window_size:])
if length >= window_size:
res.append(savgol_filter(npd , window_size, 2)[window_size // 2])
npd = np.array(data)
res2 = savgol_filter(npd , window_size, 2)
np.set_printoptions(precision=2)
print('source data ', npd)
print('online res ', np.array(res))
print('offline res ', res2)
It looks like Kalman filters family are doing what I expect. This is because they are optimal in terms of "Mean square error". Implementation can be found here for example.