Messdaten: Wertänderung automatisch erkennen und kennzeichnen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Vash
User
Beiträge: 5
Registriert: Mittwoch 30. Mai 2018, 18:50

Montag 4. Juni 2018, 18:45

Hallo,

ich habe Daten eines Referenzsystems und Messdaten. Jetzt will ich meine Messdaten mit Hilfe des Referenzsystems kennzeichnen ob die Werte gerade konstant bleiben oder zu-/abnehmen. Ich hab natürlich schon gegoogled aber nicht wirklich gefunden was ich suche. Mein erster Gedanke war folgender Code unten der einfach den Wert des Referenzsystems mit dem vorherigen vergleicht und an der entsprechenden Stelle in meinem Daten Objekt 0 = konstant, -1 = Abnahme, 1 = Zunahme einträgt. Die Referenzdaten sind so genau, dass bei keiner Änderung die Differenz zwischen zwei hintereinander folgenden Werten immer 0 ist. Jedoch sind die Messintervalle so klein, dass auch in Phasen der Änderung die meisten Datenpunkte mit dem nachfolgendem Code mit 0 gekennzeichnet werden.

Das Problem wollte ich damit beheben, dass ich ein sinnvolles Intervall festlege und er beim ersten mal wenn er eine Änderung registriert alle nachfolgende Datenpunkte über das Intervall mit dem entsprechenden Zustand (0, -1, 1) kennzeichnet und gleichzeitig überprüft ob innerhalb des Intervalls ein anderer Bewegungszustand vorkam und dann ggfs. das nächste Intervall entsprechend ausfüllt usw. usw.

Ziel ist am Ende die Daten z.B. nach durchschnittlicher Abweichung der Messdaten zum Referenzsystem während konstanten und sich ändernden Werten zu vergleichen.

Im Grunde habe ich zwei Fragen. Soll ich die selbst gebastelte Lösung weiterverfolgen oder gibt es für das Problem schon Funktionen in numpy bzw. panda die das ganze besser/schneller machen?
Falls ich die eigene Lösung benutzen sollte bin ich auch gerne für Vorschläge offen falls jemand eine bessere Idee hat wie man die Zustände heraus findet und kennzeichnet.

Code: Alles auswählen

def movement_data(data):
    
    for i in range(0, len(data.time), 1):
        if i == 0:
            data.motionstate.append(0)                   
            
        elif(data.ref[i] - data.ref[i-1] > 0):
            data.motionstate.append(1) 
            
        elif(data.ref[i] - data.ref[i-1] < 0):
            data.motionstate.append(-1)
            
        else:
            data.motionstate.append(0)
            
    return data   
Sirius3
User
Beiträge: 8812
Registriert: Sonntag 21. Oktober 2012, 17:20

Montag 4. Juni 2018, 19:21

Wenn es geht, benutzt man keine Indizes, sondern rechnet mit Vektoren. Funktionen, die ein übergebenes Objekt ändern, sollten keinen Rückgabewert haben.

Code: Alles auswählen

def movement_data(data):
    data.motionstate = numpy.sign(numpy.diff(data.ref))
Ansonsten kommt mir Dein Vorgehen etwas komisch vor. Ich würde mit Mittelung und Schwellwerten arbeiten.
Vash
User
Beiträge: 5
Registriert: Mittwoch 30. Mai 2018, 18:50

Montag 4. Juni 2018, 22:40

Ja mir kommt mein Vorgehen auch komisch vor deswegen frage ich ja^^. Danke schon mal für die elegantere Bestimmung von dem diskreten Unterschieden.

Hab jetzt auch nochmal bisschen recherchiert und bin jetzt auf Schlagworte wie Change Point Analysis bzw. Anomaly Detection gestoßen lohnt es sich damit genauer auseinander zusetzen um die Daten nach unterschiedlichen Eigenschaften zu unterteilen?
Antworten