finish mov_avg

This commit is contained in:
2025-04-25 19:49:46 +02:00
parent 58ebddcd48
commit a7091af1b2
5 changed files with 58 additions and 9 deletions

View File

@@ -33,7 +33,7 @@ class Filter:
calib_factor = 100. / float(self.calib_entry.get())
df = self.device.data
df = df[df['weights'] < 10e9]
df = df[df['weights'] < 10e8]
df['timestamps'] -= df['timestamps'].min()
df['filtered'], df['filtered_calib'] = self.filter(df, calib_factor)

View File

@@ -1,21 +1,58 @@
from tkinter import ttk
from statistics import mean
import pandas as pd
from .base import Filter
from ..gui import Slider
from ..config import MOV_AVG_DEFAULTS
class MovAvg(Filter):
def init_params(self, toolbar):
self.param_map = {
"window_size": Slider(toolbar, "Window Size", 1, 100, 10, self.callback),
"decimals": Slider(toolbar, "Decimals", 1, 5, 1, self.callback),
# "reset_threshold": Slider(self.toolbar, "Reset Threshold", 0.001, 0.1, 0.1, self.update),
"window_size": Slider(toolbar, "Window Size", 1, 100,
MOV_AVG_DEFAULTS['window_size'],
self.callback),
"decimals": Slider(toolbar, "Decimals", 1, 5,
MOV_AVG_DEFAULTS['decimals'],
self.callback),
"reset_threshold": Slider(toolbar, "Reset Threshold", 0.01, 1,
MOV_AVG_DEFAULTS['reset_threshold'],
self.callback, float),
"ignore_samples": Slider(toolbar, "Ignore Samples before reset", 1, 10,
MOV_AVG_DEFAULTS['ignore_samples'],
self.callback)
}
def filter(self, df: pd.DataFrame, calib_factor: float) -> pd.Series:
params = self._get_params()
mov_avg = df['weights'].rolling(window=int(params['window_size'])).mean()
reset_threshold = params['reset_threshold'] / calib_factor
window = []
mov_avg = []
ignored_samples = 0
for w in df['weights']:
if len(window) < params['window_size']:
window.append(w)
mov_avg.append(mean(window))
else:
out_of_threshold = abs(mov_avg[-1] - w) > reset_threshold
if out_of_threshold and\
ignored_samples < params['ignore_samples']:
ignored_samples += 1
mov_avg.append(mov_avg[-1])
elif out_of_threshold:
ignored_samples = 0
window = [w]
mov_avg.append(w)
else:
ignored_samples = 0
window.append(w)
mov_avg.append(mean(window))
mov_avg = pd.Series(mov_avg)
mov_avg_calib = (mov_avg * calib_factor).round(int(params['decimals']))
return mov_avg, mov_avg_calib