Seite 1 von 1
Datenkurve glätten - aber ersten und letzten Wert müssen erhalten bleiben
Verfasst: Donnerstag 30. April 2020, 21:07
von Rene-AC
Hey,
ich möchte gerne eine Datenkurve glätten, dabei allerdings den ersten und letzten Wert als Fixpunkte in der neuen Kurve.
Ich hatte bisher mit scipy.signal.savgol_filter gearbeitet, aber da find ich leider kein Option um mein Problem einzuarbeiten.
Die Daten sind Druck über Zeit und sehen bisher so aus (blau = (semi)rohdaten, orange = gefiltert mit savgol
Schonmal vielen Dank.
Viele Grüße
Re: Datenkurve glätten - aber ersten und letzten Wert müssen erhalten bleiben
Verfasst: Samstag 2. Mai 2020, 21:53
von NPC
Servus,
Wenn du die mathematische Struktur der Kurve kennst (bis auf ein paar konstanten), dann könntest du
quick and dirty z.B. scipy.optimize.curve_fit nutzt und die Fehler entsprechend anpasst (sigma)
vgl:
https://docs.scipy.org/doc/scipy/refere ... e_fit.html
Ein Beispiel wäre:
Code: Alles auswählen
from scipy.optimize import curve_fit
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(1, 100, 100)
f = np.vectorize(lambda x: 2.2 / (x ** 0.1) + 0.3)
y = f(x)
y[1:98] += np.random.normal(size=[97], scale=0.01) + 0.1
# die + 0.1 setzt alle daten bis auf den ersten und letzten
# nach oben um den unterschied in der Gewichtung sichtbar zu machen
c1, pcov = curve_fit(lambda x, c, a: a / (x ** 0.1) + c, x, y)
all_data = np.vectorize(lambda x: c1[1] / (x ** 0.1) + c1[0])
sigmas = np.zeros([100])
sigmas.fill(100)
sigmas[0] = 0.000001
sigmas[-1] = 0.000001
c2, pcov = curve_fit(lambda x, c, a: a / (x ** 0.1) + c, x, y, sigma=sigmas)
not_equal = np.vectorize(lambda x: c2[1] / (x ** 0.1) + c2[0])
plt.plot(x, y, label="data")
plt.plot(x, all_data(x), label="all_data_equal")
plt.plot(x, not_equal(x), label="not_equal")
plt.legend()
plt.show()
Falls du das nicht kannst bleibt die Frage ob du etwas über die Noise aussagen kannst. Falls das auch nichts ist weiß ich leider nicht weiter.
Bzw. weiß ich dann nicht ob das überhaupt möglich ist oder ich verstehe dein Problem nicht ganz