Sequenzen in Dataframe finden und markieren

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
MichaelM
User
Beiträge: 13
Registriert: Dienstag 15. Dezember 2020, 08:37

Hallo zusammen,

ich beschäftige mich erst recht kurz mit Python. Es gibt viele Anleitungen und tolle Möglichkeiten, allerdings habe ich für mein Problem nur erste Ansätze gesehen:

Ich habe Messdaten, die sich in einem CSV befinden. Dank Pandas lassen sich diese Daten ja super einfach in einen DataFrame importieren.

Die Spalten sehen so aus:

'Zeit', 'Messwert','Funktion1'

Nun möchte ich in diesen Daten gern eine Art Markierung haben, ggf. in einer zusätzlichen Spalte(Funktion ), wenn über eine variable Periode die Daten kleiner werden.
Beginnend am letzten Tag.
Die Funktion könnte so aussehen( Sorry für den Mix hier, der Code soll nur die Funktion darstellen und ist wahrscheinlich von der Syntax ein Mix):

Code: Alles auswählen

def suche (daten, periode):
	i=1
	while (((daten[-i]) <(daten[-i+1]))
		i++
		if (i==periode)
		return true
return false
Nun meine Frage,
Kann ich die Funktion als Filter auf den DF anwenden? Wie?
Wie lege ich fest, dass die Funktion mit dem letzten Messwert beginnt?
Es soll also der letzte Messwert als Referenz übergeben werden, dann der vorletzte bis zum Anfang der Messwerte + Periode.


Vielen Dank vorab!
einfachTobi
User
Beiträge: 510
Registriert: Mittwoch 13. November 2019, 08:38

Bei Pandas und Numpy gilt grundsätzlich: Schau erstmal, ob es nicht eine Funktion gibt, die deine Aufgabe bereits erfüllt. Über DataFrames/Arrays zu iterieren ist selten erforderlich oder eine gute Idee.
Dir dürfte https://pandas.pydata.org/pandas-docs/s ... hange.html oder https://pandas.pydata.org/pandas-docs/s ... Frame.diff weiter helfen.

Wenn die die Differenz (absolut oder relativ) erzeugt hast, kannst du die entsprechenden Datensätze einfach abrufen.

Code: Alles auswählen

>>> import pandas as pd
>>> df = pd.DataFrame({"messwerte": [1, 2, 3, 4, 5, 6, 5, 3, 0]})
>>> df
   messwerte
0          1
1          2
2          3
3          4
4          5
5          6
6          5
7          3
8          0

>>> df.messwerte.diff()
0    NaN
1    1.0
2    1.0
3    1.0
4    1.0
5    1.0
6   -1.0
7   -2.0
8   -3.0
Name: messwerte, dtype: float64

>>> df.messwerte.diff() < 0
0    False
1    False
2    False
3    False
4    False
5    False
6     True
7     True
8     True
Name: messwerte, dtype: bool

>>> df[df.messwerte.diff() < 0]
   messwerte
6          5
7          3
8          0
Unabhängig davon kannst du beliebige Funktionen mit apply() auf ein DataFrame anwenden. Wie gesagt solltest du aber prüfen, ob es da nicht schon etwas gibt, denn das ist in der Regel wesentlich schneller.
MichaelM
User
Beiträge: 13
Registriert: Dienstag 15. Dezember 2020, 08:37

Vielen Dank, das sieht sehr gut aus! Ich schaue es mir später in Ruhe an.
Antworten