Datenkurve glätten - aber ersten und letzten Wert müssen erhalten bleiben

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Rene-AC
User
Beiträge: 5
Registriert: Montag 1. Juni 2015, 09:25

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

Bild


Schonmal vielen Dank.

Viele Grüße
NPC
User
Beiträge: 56
Registriert: Dienstag 8. Januar 2019, 17:51

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
Antworten