Messwerte nach Ausreißer filtern

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

Guten Morgen zusammen,

ich habe eine neue Aufgabe und damit auch neue Probleme und würde mal wieder um eure Hilfe bitten.

Ein Messgerät liefert eine *.csv - Datei mit Messwerten, hier ein Auszug damit man den Aufbau erkennt:

Code: Alles auswählen

"Time","Speed_CNT 4/1 (AVG)","Speed_CNT 4/1 (RMS)","Speed_CNT 4/1 (MIN)","Speed_CNT 4/1 (MAX)","Speed_CNT 4/1","tX1 (AVG)","tX1 (RMS)","tX1 (MIN)","tX1 (MAX)","tX1","tX2 (AVG)","tX2 (RMS)","tX2 (MIN)","tX2 (MAX)","tX2","pD3 (AVG)","pD3 (RMS)","pD3 (MIN)","pD3 (MAX)","pD3","tD3  (AVG)","tD3  (RMS)","tD3  (MIN)","tD3  (MAX)","tD3 ","pD4  (AVG)","pD4  (RMS)","pD4  (MIN)","pD4  (MAX)","pD4 ","tD4 (AVG)","tD4 (RMS)","tD4 (MIN)","tD4 (MAX)","tD4","pX1 (AVG)","pX1 (RMS)","pX1 (MIN)","pX1 (MAX)","pX1","tS4 (AVG)","tS4 (RMS)","tS4 (MIN)","tS4 (MAX)","tS4","pX2 (AVG)","pX2 (RMS)","pX2 (MIN)","pX2 (MAX)","pX2"
"s","rpm","rpm","rpm","rpm","rpm","deg C","deg C","deg C","deg C","deg C","deg C","deg C","deg C","deg C","deg C","bar","bar","bar","bar","bar","Cdeg","Cdeg","Cdeg","Cdeg","Cdeg","bar","bar","bar","bar","bar","Cdeg","Cdeg","Cdeg","Cdeg","Cdeg","bar","bar","bar","bar","bar","Cdeg","Cdeg","Cdeg","Cdeg","Cdeg","bar","bar","bar","bar","bar"
0.000000,,,,,704.425125122070,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0.000514090092,,,,,,,,,,0.000514090092
0.001000,,,,,704.394774754842,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0.002000,,,,,704.364424387614,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0.003000,,,,,704.334074020386,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0.004000,,,,,704.303723653158,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0.005000,,,,,704.273373285929,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0.006000,,,,,704.243022918701,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0.007000,,,,,704.212672551473,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0.008000,,,,,704.182322184245,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0.009000,,,,,704.151971817017,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
0.010000,,,,,704.121621449788,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0.000514090092,,,,,,,,,,0.000514090092
Ziel ist es verschiedene Messwerte grafisch darzustellen und eventuell auch mit einander vergleichen. Vorerst muss ich mich aber mal etwas in das Thema einarbeiten. Und will mal eine Spalte, in dem Fall "Spee_CNT 4/1" grafisch darstellen.
Hinter der Spalte steckt folgenes:

Code: Alles auswählen

from pathlib import Path
from icecream import ic
import pandas


CSV_FILE = Path(__file__).parent / "20230221113501.csv"


def main():
    data = pandas.read_csv(CSV_FILE, header=[0, 1], low_memory=False)
    ic(data['Speed_CNT 4/1'])
    ic(data.dtypes)


if __name__ == '__main__':
    main()

Code: Alles auswählen

ic| data['Speed_CNT 4/1']:                 rpm
                           0        704.425125
                           1        704.394775
                           2        704.364424
                           3        704.334074
                           4        704.303724
                           ...             ...
                           4515775    0.000000
                           4515776    0.000000
                           4515777    0.000000
                           4515778    0.000000
                           4515779    0.000000
                           
                           [4515780 rows x 1 columns]
ic| data.dtypes: Time                 s        float64
                 Speed_CNT 4/1 (AVG)  rpm      float64
                 Speed_CNT 4/1 (RMS)  rpm      float64
                 Speed_CNT 4/1 (MIN)  rpm      float64
                 Speed_CNT 4/1 (MAX)  rpm      float64
                 Speed_CNT 4/1        rpm      float64
                 ...
Mal eine Kurve über die Zeit mache ich so:

Code: Alles auswählen

from pathlib import Path
import pandas
import matplotlib.pyplot as plt

CSV_FILE = Path(__file__).parent / "20230221113501.csv"


def main():
    data = pandas.read_csv(CSV_FILE, header=[0, 1], low_memory=False)
    data.plot.scatter(x="Time", y="Speed_CNT 4/1", s=1)
    plt.show()


if __name__ == '__main__':
    main()
Man muss jetzt wissen dass die Drehzahl bei der Aufzeichnung konstant war, ich sollte eigentlich keine Drehzahl über ~704 rpm bekommen. Mein Diagramm hat aber einen (deutlichen. nicht zu übersehenden) Ausreißer drin. Wie kann ich denn den "wegfiltern"?
Eine Suche brachte mich auf den Median-Filter und in Verbindung mit Python bin ich dann auf scipy.median_filter gestoßen.
Ich weis aber gar nicht wirklich, ob dass das richtige für mich ist.(?) Habe es auch noch nicht geschafft, dass ich damit was angezeigt bekomme.

Code: Alles auswählen

from pathlib import Path
from icecream import ic
import pandas
import matplotlib.pyplot as plt
from scipy.ndimage import median_filter

CSV_FILE = Path(__file__).parent / "20230221113501.csv"


def main():
    data = pandas.read_csv(CSV_FILE, header=[0, 1], low_memory=False)
    speed = median_filter(data['Speed_CNT 4/1'], size=(1, 1), output='float64')
    data.plot.scatter(x="Time", y=speed, s=1)
    plt.show()


if __name__ == '__main__':
    main()
Ergibt die Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Users\straub\PycharmProjects\csv\format_csv.py", line 18, in <module>
    main()
  File "C:\Users\straub\PycharmProjects\csv\format_csv.py", line 13, in main
    data.plot.scatter(x="Time", y=speed, s=1)
  File "C:\Users\straub\PycharmProjects\csv\venv\lib\site-packages\pandas\plotting\_core.py", line 1697, in scatter
    return self(kind="scatter", x=x, y=y, s=s, c=c, **kwargs)
  File "C:\Users\straub\PycharmProjects\csv\venv\lib\site-packages\pandas\plotting\_core.py", line 945, in __call__
    return plot_backend.plot(data, x=x, y=y, kind=kind, **kwargs)
  File "C:\Users\straub\PycharmProjects\csv\venv\lib\site-packages\pandas\plotting\_matplotlib\__init__.py", line 71, in plot
    plot_obj.generate()
  File "C:\Users\straub\PycharmProjects\csv\venv\lib\site-packages\pandas\plotting\_matplotlib\core.py", line 452, in generate
    self._make_plot()
  File "C:\Users\straub\PycharmProjects\csv\venv\lib\site-packages\pandas\plotting\_matplotlib\core.py", line 1261, in _make_plot
    data[y].values,
  File "C:\Users\straub\PycharmProjects\csv\venv\lib\site-packages\pandas\core\frame.py", line 3813, in __getitem__
    indexer = self.columns._get_indexer_strict(key, "columns")[1]
  File "C:\Users\straub\PycharmProjects\csv\venv\lib\site-packages\pandas\core\indexes\multi.py", line 2626, in _get_indexer_strict
    return super()._get_indexer_strict(key, axis_name)
  File "C:\Users\straub\PycharmProjects\csv\venv\lib\site-packages\pandas\core\indexes\base.py", line 6065, in _get_indexer_strict
    indexer = self.get_indexer_for(keyarr)
  File "C:\Users\straub\PycharmProjects\csv\venv\lib\site-packages\pandas\core\indexes\base.py", line 6052, in get_indexer_for
    return self.get_indexer(target)
  File "C:\Users\straub\PycharmProjects\csv\venv\lib\site-packages\pandas\core\indexes\base.py", line 3953, in get_indexer
    return pself.get_indexer(
  File "C:\Users\straub\PycharmProjects\csv\venv\lib\site-packages\pandas\core\indexes\base.py", line 3973, in get_indexer
    return self._get_indexer(target, method, limit, tolerance)
  File "C:\Users\straub\PycharmProjects\csv\venv\lib\site-packages\pandas\core\indexes\base.py", line 3994, in _get_indexer
    tgt_values = engine._extract_level_codes(  # type: ignore[union-attr]
  File "pandas\_libs\index.pyx", line 664, in pandas._libs.index.BaseMultiIndexCodesEngine._extract_level_codes
  File "C:\Users\straub\PycharmProjects\csv\venv\lib\site-packages\pandas\core\indexes\multi.py", line 137, in _codes_to_ints
    codes <<= self.offsets
ValueError: non-broadcastable output operand with shape (4515780,1) doesn't match the broadcast shape (4515780,2)
Bin ich auf dem richtigen Weg mit Scipy? Muss ich den Filter selbst programmieren? Habe ich etwas passendes von Pandas in der Doku übersehen?
Irgendwie drehe ich mich gerade im Kreis.
Wenn ich den Filter selbst schreiben müsste, dann müsste ich immer die Differenz zwischen zwei aufeinanderfolgende Werte berechnen und die Differenz die wesentlich höher (wie hoch?) ist fällt dann raus, aber nur wenn die nachfolgenden Werte wieder ähnlich mit denen davor sind.

So jetzt habe ich mal wieder aufgeschrieben was in meinem Kopf so vor sich geht. Vielen Dank für das lesen bis hier her und schon einmal danke für eure Antworten.

Viele Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
grubenfox
User
Beiträge: 433
Registriert: Freitag 2. Dezember 2022, 15:49

Mangels eigenem Wissen habe ich mal ein wenig gesucht und dabei unter anderem diese drei Links gefunden:

https://stackoverflow.com/questions/231 ... -dataframe
https://stackoverflow.com/questions/462 ... e-outliers
https://stackoverflow.com/questions/469 ... ing-median

vielleicht hilft das ja beim "Irgendwie drehe ich mich gerade im Kreis." ;)

oder auch die folgenden... (die Suche nach Ausreißern scheint ein weites Feld zu sein)
https://towardsdatascience.com/outlier- ... 78a911abaf
https://hersanyagci.medium.com/detectin ... dbfcd5cad8
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

Danke für die Antwort. Da sind sehr interessante Ansätze/Lösungen dabei. Beim durcharbeiten bin ich nicht wirklich voran gekommen und beim genaueren hinsehen, habe ich gemerkt, das ich schon viel "früher" ein Problem habe, das ich erst einmal lösen muss.

Ich erstelle ja mit 'scatter' kein Liniendiagramm sondern es zeigt mir Streupunkte an. Das Liniendiagramm sieht zwar ähnlich aus, aber jetzt kommen wir zu meinem Problem. Die erste Spalte in der *.csv-Datei nennt sich 'Time' und dahinter wird fortlaufend die Zeit in Sekunden hochgezählt, bzw in 1/1000. Also erster Messpunkt bei 0,001 Sekunden, zweiter Messpunkt bei 0,002 Sekunden und so weiter. Das Ende liegt bei 4515,779 Sekunden.
Die erste Spalte nimmt Pandas per default als Index, das passt für mich, weil ich die Drehzahl über die Zeit darstellen will. Auf die y-Achse soll die Drehzahl und auf die x-Achse die Zeit.
Hiermit

Code: Alles auswählen

from pathlib import Path

from icecream import ic
import pandas
import matplotlib.pyplot as plt

CSV_FILE = Path(__file__).parent / "20230221113501.csv"


def main():
    data = pandas.read_csv(CSV_FILE, header=[0, 1], low_memory=False)
    data.plot(y=5)
    plt.show()


if __name__ == '__main__':
    main()
Habe ich auf der y-Achse einen Ausreißer der bis auf 60000 hochgeht und der Rest liegt bei ca. 300000. Dabei ist meine Drehzahl doch bei ca. 704rmp. (Ich habe die Datei in Excel geöffnet und mal durchgescrollt und die Drehzahl bewegt sich zwischen 702 und 705) Ich erhalte auch keine Linie die sich bei den 30000 einpendelt, sondern immer Sprünge von 0 auf 30000.
Die x-Achse geht von 0 bis über 4e6. Auch das passt nicht, weil die Zeit bei 4515,779 Sekunden aufhört.
Was mache ich denn hier falsch? 'y=5' habe ich genommen weil ich mit 'y=Speed_CNT 4/1' die Meldung kam, das ich ein Label oder eine Position angeben soll, daher habe ich die Position genommen.


Muss ich die Zeitachse irgendwie mit 'to_timestamp' in ein anderes Format bringen?

Ich würde euch auch gerne das Diagramm zeigen, möchte mich aber hier nicht auf meiner privaten Dropbox anmelden, gibt es eine freie Alternative um Bilder hochzuladen? Bzw. wie könnt ihr am besten nachvollziehen, was ich hier mache?

Irgendwas mache ich hier gerade komplett falsch.

Vielen Dank und Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
grubenfox
User
Beiträge: 433
Registriert: Freitag 2. Dezember 2022, 15:49

Dennis89 hat geschrieben: Montag 6. März 2023, 16:05 Danke für die Antwort. Da sind sehr interessante Ansätze/Lösungen dabei. Beim durcharbeiten bin ich nicht wirklich voran gekommen und beim genaueren hinsehen, habe ich gemerkt, das ich schon viel "früher" ein Problem habe, das ich erst einmal lösen muss.
Ha, dann war das ja schon mal irgendwie hilfreich. Aber bei dem "früherem" Probleme bin ich leider raus....

Aber hier für
Dennis89 hat geschrieben: Montag 6. März 2023, 16:05 Ich würde euch auch gerne das Diagramm zeigen, möchte mich aber hier nicht auf meiner privaten Dropbox anmelden, gibt es eine freie Alternative um Bilder hochzuladen?
hätte ich was:

https://imgbb.com/

Wenn sich da nichts geändert hat, dann muss man sich dort nicht mal registrieren um dort was hoch zu laden.... [hatte ich erst bemerkt nachdem ich mich dort registriert hatte... :shock: ]
Benutzeravatar
grubenfox
User
Beiträge: 433
Registriert: Freitag 2. Dezember 2022, 15:49

Dennis89 hat geschrieben: Montag 6. März 2023, 16:05 Die x-Achse geht von 0 bis über 4e6. Auch das passt nicht, weil die Zeit bei 4515,779 Sekunden aufhört.
Naja, wenn man das Komma ganz amerikanisch als Tausender-Trenner betrachtet, dann passt es wieder! Das ist wohl das beliebte "Dezimalkomma" vs. "Dezimalpunkt" und "Tausendertrenner"-Thema....
Erklärt wohl auch die Probleme auf der Y-Achse...
nezzcarth
User
Beiträge: 1638
Registriert: Samstag 16. April 2011, 12:47

Dennis89 hat geschrieben: Montag 6. März 2023, 09:41 Bin ich auf dem richtigen Weg mit Scipy? Muss ich den Filter selbst programmieren? Habe ich etwas passendes von Pandas in der Doku übersehen?
Irgendwie drehe ich mich gerade im Kreis.
Wenn ich den Filter selbst schreiben müsste, dann müsste ich immer die Differenz zwischen zwei aufeinanderfolgende Werte berechnen und die Differenz die wesentlich höher (wie hoch?) ist fällt dann raus, aber nur wenn die nachfolgenden Werte wieder ähnlich mit denen davor sind.
Es gibt eine große Vielfalt an Verfahren um Ausreißer zu erkennen (Outlier Detection). Welches für dich geeignet ist, hängt von mehreren Dingen ab, z.B. von der Wahrscheinlichkeitsverteilung, die deinen Daten zugrunde liegt oder auch einfach, was in dem Feld üblich ist, und vielem mehr (das ist im Grunde ein eigenes Forschungsfeld). Eine einfache Klasse von Verfahren, die sich für den Hausgebrauch leicht selbst implementieren lässt, basiert darauf, dass du einen Mittelwert und ein Streumaß auswählst und berechnest und dann zum Beispiel alle Werte filterst, die X-Streumaß-Einheiten vom Mittelwert abweichen. Also zum Beispiel das arithmetische Mittel und die Standardabweichung oder den Median und die MAD. Das sollte (überwiegend) sogar mit dem Statistik-Modul aus der Standardbibliothek gehen. Eine andere einfache Methode beruht auf Perzentillen, die man vielleicht noch aus der Schule von Boxplots kennt. Besonders gut ist beides, allgemein betrachtet, eher nicht, aber vielleicht reicht das für deinen Fall ja schon; musst du ausprobieren. Ansonsten gibt es zum Beispiel auch statische Verfahren, Ansätze, die mit Clustering, Machane-Learning etc. arbeiten. Da muss man dann aber tiefer in die Thematik einsteigen und ggf. wissen, ob das für die Daten anwendbar ist.
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

Vielen Dank für die Antworten.

Ahja Komma und Punkt, da war doch was, das schaue ich mir morgen früh als erstes an.
Auch das mit dem Bild hochladen funktioniert, dann kann ich morgen zeigen was ich meine (meinte).

Auch mit den ganzen Begriffen zum filtern bin ich morgen auf jeden Fall beschäftigt, manche Sachen habe ich schon mal gehört, aber intensiv einarbeiten muss ich mich dann auf jeden Fall. Sobald das Diagramm mal ordentlich steht.

Schönen Abend noch
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

Guten Morgen,

als erstes habe ich hier das Bild meines Diagrams:
https://ibb.co/b3Hdg7D

Das ändert sich gar nicht, wenn ich mit 'style.format' irgendwelche Änderungen mache. Ich wollte zum Beispiel, dass keine Tausender-Trennung vorgenommen wird und dass der Punkt angibt, wann die Nachkommastellen kommen. Das habe ich so versucht:

Code: Alles auswählen

from pathlib import Path

from icecream import ic
import pandas
import matplotlib.pyplot as plt

CSV_FILE = Path(__file__).parent / "20230221113501.csv"


def main():
    data = pandas.read_csv(CSV_FILE, header=[0, 1], low_memory=False)
    data.style.format(decimal='.', thousands=None)
    data.plot(y=5)
    ic(data.dtypes)
    ic(data['Time'])
    ic(data['Speed_CNT 4/1'])
    plt.show()


if __name__ == '__main__':
    main()
Das Diagramm ändert sich dabei nicht. Alle Werte in 'data' sind vom Type 'float64'.
Die Ausgabe vom Code gibt:
[codeic| data['Time']: s
0 0.000
1 0.001
2 0.002
3 0.003
4 0.004
... ...
4515775 4515.775
4515776 4515.776
4515777 4515.777
4515778 4515.778
4515779 4515.779

[4515780 rows x 1 columns]
ic| data['Speed_CNT 4/1']: rpm
0 704.425125
1 704.394775
2 704.364424
3 704.334074
4 704.303724
... ...
4515775 0.000000
4515776 0.000000
4515777 0.000000
4515778 0.000000
4515779 0.000000

[4515780 rows x 1 columns]

Process finished with exit code 0
[/code]
Bei den Sekunden macht es Sinn, dass der Punkt als Tausender-Trenner genommen wird. Bei der Drehzahl sollte mein Diagramm dann aber nicht bei 300_000 sein sondern bei ~700_000_000.
Hier steige ich noch gar nicht durch.

Grüße
Dennis

Edit: Das Diagramm sieht auch gleich aus, wenn ich beim einlesen der *.csv-Datei den Dezimal-Trenner mit angeben:

Code: Alles auswählen

data = pandas.read_csv(CSV_FILE, header=[0, 1], low_memory=False, decimal='.')
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

Nachtrag: Ich habe jetzt explizit beim laden der *.csv-Datei die Index-Spalte angegeben und die Werte auf der x-Achse sehen jetzt mal gut aus und der Punkt wurde als Dezimaltrenner erkannt:

Code: Alles auswählen

from pathlib import Path

from icecream import ic
import pandas
import matplotlib.pyplot as plt


CSV_FILE = Path(__file__).parent / "20230221113501.csv"


def main():
    data = pandas.read_csv(CSV_FILE, header=[0, 1], low_memory=False, index_col=0)
    data.plot(y='Speed_CNT 4/1')
    ic(data.index)
    plt.show()


if __name__ == '__main__':
    main()

Code: Alles auswählen

ic| data.index: Float64Index([     0.0,    0.001,    0.002,    0.003,    0.004,    0.005,
                                 0.006,    0.007,    0.008,    0.009,
                              ...
                               4515.77, 4515.771, 4515.772, 4515.773, 4515.774, 4515.775,
                              4515.776, 4515.777, 4515.778, 4515.779],
                             dtype='float64', length=4515780)
Das sieht so aus: https://ibb.co/3hzPqF5

Für die y-Achse habe ich noch keinen Ansatz.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
heyJo
User
Beiträge: 23
Registriert: Mittwoch 24. Januar 2018, 20:49
Wohnort: Köln

Da hst du ja ein riesiges Fass aufgemacht: pandas, matplotlib, und Python ;-)

Um gezielt Werte "fallen zu lassen" kennt pandas den Befehl "DataFrame.drop(..."
Du willst ja die Werte >704 rpm rausfiltern. Da braucht es keine m. E. keine besondere Softwarelösung/ -intelligenz.

Mir hat das Buch von Felix Zumstein "Python für Excel" einen guten Einstieg gegeben. Es ist nicht zu ausführlich und hat für die gänigen Probleme eine "Kochbuchanleitung" parat.
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

Danke für die Antwort.
Aber das ist nur in diesem Fall so, dass es um die Werte geht die größer wie 705 sind. Es ist nicht gesagt, das jede Messung bei dieser Drehzahl statt findet. Filtern will ich "nur" die Werte die eindeutige Ausreißer sind. 705,2 ist größer aber kein Ausreißer.

Das Problem kann ich aber gerade erst mal noch ignorieren, weil mein Diagramm die erwarteten Werte von ~700 gar nicht anzeigt. Ich muss erst diesen Fehler finden. Der bringt mich gerade um den Verstand 🤯

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

Soo ich schreib hier jetzt einfach meine neuen Erkenntnisse auf.
Die Dateien enthalten tatsächlich so große Werte wie angezeigt, allerdings sind die von "Hand" sehr schwer rauszulesen. Ich habe Rücksprache gehalten, die Maschine wird konstant mit 700rmp betrieben. Habe eine neue Datei bekommen und auch hier sieht ds Diagramm so aus:
https://ibb.co/JdNyJ9b

Wenn ich jetzt mal reinzoome, dann kann man die "konstante" 700rpm Linie sehen und "kleinere Ausreßer auf über 1500rpm und dann die extremen Ausreißer.
Gezoomt sieht das so aus:
https://ibb.co/72vh4m1

Also da wird vermutlich erst mal an der Messwertaufnahme gearbeitet werden, könnte ich mir vorstellen.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
heyJo
User
Beiträge: 23
Registriert: Mittwoch 24. Januar 2018, 20:49
Wohnort: Köln

Vielleicht bringt dich das Beispiel weiter:

Test.csv:

my_Time, rpm
0.000000,704.425125122070
0.001000,704.394774754842
0.002000,704.364424387614
0.003000,704.334074020386
0.004000,704.303723653158
0.005000,704.273373285929
0.006000,704.243022918701
0.007000,704.212672551473
0.008000,704.182322184245
0.009000,704.151971817017
0.010000,704.121621449788

Code: Alles auswählen

import matplotlib.pyplot as plt
import pandas as pd

data = pd.read_csv("Test.csv", header=0, decimal=".")
y = data.iloc[:,[1]]
x = data.iloc[:,[0]]

fig, ax = plt.subplots()

ax.scatter(x, y)
plt.show()
Der Rest ist ja "nur" Feintuning ;-)
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

Danke für deine Hilfe, aber das ist nicht das Problem. Das kann ich auch in drei Zeilen schreiben:

Code: Alles auswählen

def main():
    data = pandas.read_csv(CSV_FILE, header=0)
    data.plot.scatter(y=' rpm', x='my_Time')
    plt.show()
Die Messwertaufnahme wird überarbeitet. In dem Fall lag es tatsächlich nicht an mir.
Die Drehzahl wird von einem Sensor über der Schwungscheibe erfasst. Allerdings nicht so wie ich das kenne, das der Sensor sehr nahe an der Scheibe ist und dann wird eine "Markierung" abgefragt, sondern der Sensor hat einen großen Abstand zur Scheibe und es wird ein mehrreihiger Reflektor (ähnlich wie von Autos, Fahrräder etc. bekannt) abgefragt. Meine Vermutung ist, weil ja absolut überirdische Drehzahlen in der Datei sind, dass der Sensor öfters hintereinander auslöst.

Ich warte mal bis ich die neuen Daten bekomme und lese mich in das filtern ein.

Viele Grüße und sorry für die vielen Beiträge von mir 🤨
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
grubenfox
User
Beiträge: 433
Registriert: Freitag 2. Dezember 2022, 15:49

jep, Ausreißer oder Extremwerte finden und filtern kann man immer gebrauchen.... vermutlich auch mit der zukünftigen neuen Messwertaufnahme. So lange sich die Datenverarbeitung und Erzeugung der Daten innerhalb des Rechners abspielt ist ja theoretisch alles recht einfach. Bei einer simulierten Maschine wäre die Drehzahl vermutlich immer bei 700rpm. Aber wenn dann über Sensoren usw. die reale Welt mit reinspielt, dann wird es interessant...

Ich stelle gerade fest, die lang vergessene Elektronikerausbildung ist wirklich schon lange her. Sinnvolle Lösungen auf Hardware-Ebene fallen mir gerade nicht ein (abgesehen vom oben erwähnten "Sensor nahe an die Scheibe und [nur] eine Markierung beobachten"), meine Gedanke gehen heutzutage immer in Richtung Programmcode...
Antworten