Messwerte nach Ausreißer filtern
Verfasst: Montag 6. März 2023, 09:41
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:
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:
Mal eine Kurve über die Zeit mache ich so:
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.
Ergibt die Fehlermeldung:
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
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
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
...
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()
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()
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)
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