Hallo liebe Community, ich habe zurzeit eine Messwertaufnahme am Fahrrad laufen, bei der 12 verschiedene Sensorwerte während der Fahrt auf einem USB abgespeichert werden. Diese Daten werden in einer CSV-Datei mit zugehörigem Zeitstempel abgespeichert. Zur Datenaufbereitung und -auswärtung verwende ich zurzeit Excel. Hierbei werden die Messdaten mit Hilfe einer VBA in eine Vorlagedatei hineinkopiert. Das Problem, das sich für mich dabei jetzt ergeben hat ist, dass ich für 5 Minuten Fahrtzeit ca. 100 000 Zeilen ergeben. Ich habe bereits die maximale Größe einer CSV-Datei mit 100 000 Zeilen begrenzt. Wenn ich jetzt versuche diese hinein zu speichern, dann funktioniert dies zwar, jedoch habe ich sehr lange Ladezeiten. Die Messfrequenz kann ich leider nicht verringern und wenn ich die CSV-Datei mit noch weniger Zeilen begrenzen würde, dann hätte ich noch mehr einzelne Messfiles, da eine durchschnittliche Testfahrt mindestens 2-3 Stunden dauert und schon bei meiner aktuellen Begrenzung 20 - 30 verschiedene Files erstellt werden. Deshalb wollte ich fragen, ob jemand eine im besten Fall kostenfreie Alternative für Excel kennt, mit der Daten schnell und gut aufbereitet und dargestellt werden können. Vielen Dank bereits im Vorraus Mit freundlichen Grüßen Matthias
Moin, - Matthias P. schrieb: > ich habe zurzeit eine Messwertaufnahme am Fahrrad laufen, bei der 12 > verschiedene Sensorwerte während der Fahrt auf einem USB abgespeichert > werden. Diese Daten werden in einer CSV-Datei mit zugehörigem > Zeitstempel abgespeichert. > Das Problem, das sich für mich dabei jetzt ergeben hat ist, dass ich für > 5 Minuten Fahrtzeit ca. 100 000 Zeilen ergeben. Ich habe bereits die 5 Messungen pro Sekunde? Da wuerde ich versuchen, Trigger zu definieren und nur die "Interessanten" Events zu speichern. Gruesse Th. Edit: Tuppfehler
Die Daten z.B. mit einem Python-Script nach PostgreSQL importieren (vorher natürlich ein geeignetes Schema entwerfen) und dann mit SQL die gewünschten Auswertungen durchführen.
Matthias P. schrieb: > Deshalb wollte ich fragen, ob jemand eine im besten Fall kostenfreie > Alternative für Excel kennt, mit der Daten schnell und gut aufbereitet > und dargestellt werden können. Kostenfrei und schnell: Python Kostenpflichtig und schnell: Matlab Beiden machen CSV-Dateien mit ein paar hundertausend Einträgen nichts aus. Man kann sie auch nur zur Datenreduktion setzen. Beide benötigen Lernaufwand. Python ist agiler, d.h. man muss damit rechnen, dass ein vor 3 Jahren geschriebenes Skript auf einer aktuellen Installations Anpassungen benötigt, Matlab statischer, d.h. in der Regel machen auch 15 Jahre alte Skripte keine Probleme. Dafür eben kostenpflichtig.
Vielen Dank erstmal für die schnellen Antworten. Den Punkt mit der Triggerschwelle kann ich leider nicht anwenden, da zurzeit noch alle Messwerte für mich interessant sind und ich durchgängige Files benötige. Dies kann sich aber nochm ändern, sollte dies der Fall sein würde ich das aber trotzdem erst nachher bei der Datenaufbereitung machen. Die Sache mit Python und Matlab werde ich mich noch genauer anschauen. Bei der Sache mit Python stellen sich mir aber noch zwei Fragen. Zum Einen, ob es sinnvoll ist, das Programm auf einem Raspberry laufen zu lassen, oder ob ich es auf meinem Standardrechner installieren soll. Und zum anderen, was hier ein geeignetes Tool ist. Ich habe schon ein wenig Erfahrung mit dem RPi und Python. Ob ich hier aber "Pandas" oder ein anderes Tool verwenden soll weiß ich nicht, da ich in diesem Gebiet noch keine wirkliche Erfahrung habe.
Was sollte der Raspberry Pi für einen Vorteil haben? Du könntest NumPy auf deiner normalen Desktop Umgebung benutzen. Als frei Alternative zu Matlab gäbe es noch Scilab und Octave. Von Excel würde ich bei sowas Abstand nehmen.
Falls man sich etwas mit Statistik auskennt (oder die CSV statistisch ausgewertet werden): R. Google: "R Statistics". Wurde zu meiner Zeit gerne an Unis benutzt, d.h. man findet leicht Kursmaterial zum Lernen. Wem Mathlab zu teuer und Python zuviel "Programmierung" ist, sollte mit R glücklich werden können.
Durchgängige files müssen ja nicht in jeder Zeile alle statischen Daten noch mal enthalten. Als Beispiel 10:00:00,100,200,300 10:00:01,100,202,333 10:00:02,100,202,322 ließe sich gleich auswerten wie 10:00:00,100,200,300 10:00:01,,202,333 10:00:02,,,322 vielleicht läßt sich so die Datenmenge reduzieren, und auch die Rechenzeit?
Ich verstehe was du meinst und das ist ein Punkt, den ich auf jeden Fall in meinem Programm noch berücksichtigen werde, wenn dies einfach möglich ist. Das es auf diese Art möglich ist habe ich nicht gewusst. Vielen Dank. Das könnte die ganze Rechenzeit tatsächlich um einiges Beschleunigen. Ein anderes Programm, als Excel möchte ich trotzdem verwenden (wahrscheinlich wird es Python mit Matplotlib)um das ganze noch mehr zu optimieren.
Matthias P. schrieb: > Zum Einen, ob es sinnvoll ist, das Programm auf einem Raspberry laufen > zu lassen, oder ob ich es auf meinem Standardrechner installieren soll. Weil der PC wahrscheinlich viel mehr Leistung und Arbeitsspeicher hat, dürfte die Verarbeitung der Datenmenge da deutlich schneller gehen.
Hallo, ich habe das jetzt mit Hilfe von Matplotlib versucht. Mein Programm sieht folgendermaßen aus: #Einbinden der Bibliotheken import matplotlib.pyplot as plt import numpy as np import mplcursors import pandas as pd import matplotlib.dates as mdates #Abspeichern der Werte df = pd.read_csv (r'F:\Schule\HTL\Diplomarbeit\aw_python\datei_meas.csv') print (df) x = df.date y = df.ch1 #Darstellen der Werte plt.plot(x,y) plt.show() Im Anhang habe ich eine Beispiel-Datei hinzugefügt. Das Problem, das bei mir jetzt auftritt ist, dass diese Datei "nur" 2000 Zeilen hat und ich nur eine Spalte darstellen lasse und das ganze trotzdem schon sehr langsam. Jetzt stellt sich für mich die Frage, ob das einfach an meinem Computer liegt, oder ob ich einfach eine Leistungsgrenze von Python gekommen bin. Mfg
Matthias P. schrieb: > Jetzt stellt sich für mich die Frage, ob das einfach an meinem Computer > liegt, oder ob ich einfach eine Leistungsgrenze von Python gekommen bin. Weder noch. Das liegt mit hoher Wahrscheinlichkeit am "print()"-Kommando. Die Daten einmal auf der Konsole darstellen kostet ein vielfaches der Zeit, sie zu verarbeiten.
Walter T. schrieb: > > Weder noch. Das liegt mit hoher Wahrscheinlichkeit am > "print()"-Kommando. Die Daten einmal auf der Konsole darstellen kostet > ein vielfaches der Zeit, sie zu verarbeiten. Vielen Dank erstmal für die Rückmeldung. Ich habe das print() auskommentiert und lasse die Werte auch nicht mehr in eine Zwischenvariable speichern, um hier möglichst wenig Auslastung zu erzielen und trotzdem läuft das ganze leider nicht flüssiger.
Anscheinend ist plotten allgemein langsam, gnuplot braucht hier auch 0.5s für die paar Datensätze bzw. 3.5s für 40'000 von der Sorte.
Jim M. schrieb: > Wem Mathlab zu teuer und Python zuviel "Programmierung" ist, sollte mit > R glücklich werden können. MatLab fürs Hobby kostet €115: https://de.mathworks.com/products/matlab-home.html Wenn man MatLab schon kennt würde man also nicht unbedingt wegen dem Preis auf R umsteigen. /regards
Ich hab mal etwas mit Octave rumgespielt:
1 | pkg load io |
2 | clear all; |
3 | close all; |
4 | |
5 | %Einstellungen |
6 | fn = 'datei_meas.csv'; |
7 | timeFormat='HH:MM:SS.FFF'; |
8 | dateFormNum = 0; |
9 | |
10 | %Read File |
11 | t1 = clock(); |
12 | m = csv2cell(fn); |
13 | t2 = clock(); |
14 | |
15 | %Convert |
16 | t3 = clock(); |
17 | y1 = cell2mat(m(2:end,2)); |
18 | |
19 | cf = cellfun(@(x) x(1:end-3), m(2:end,1), 'un', 0); |
20 | cm = cell2mat(cf); |
21 | x = datenum(cm,timeFormat); |
22 | %x = 1:length(y1); %Alternative mit laufender Zahl auf x-Achse |
23 | |
24 | t4 = clock(); |
25 | |
26 | %Plot |
27 | t5 = clock(); |
28 | plot(y1); |
29 | %plot(x,y1); % Wird momentan nicht richtig angezeigt |
30 | %datetick('x',dateFormNum,'keepticks'); |
31 | t6 = clock(); |
32 | |
33 | %Console Output |
34 | printf("Read:\t\t%f\n",etime(t2,t1)); |
35 | printf("Convert:\t%f\n",etime(t4,t3)); |
36 | printf("Plot:\t\t%f\n",etime(t6,t5)); |
Der Read der Testdatei dauert bei mir ca. 20ms von der SSD. So wie ich das sehe braucht Octave für die Anzeige des Datums auf der X-Achse ein datenum. Mit dem Timeformat in der CSV-Datei kommt die Funktion aber nicht zurecht, da es mehr als 3 Zeichen in den Millis sind. Deshalb hab ich die letzten 3 Zeichen mal versucht abzuschneiden (Zeilen 19+20). Das fällt von der Zeit auch nicht sooo stark ins Gewicht (ca. 35 ms), könnte man aber bei größeren Dateien bereits beim speichern berücksichtigen. Die datenum Funktion haut dann aber richtig rein (ca. 800ms). Lass ich die datenum Geschichte weg und mache nur eine laufende Zahl für die X-Achse (Zeile 22), sind es nur noch 4ms! Das Ploten selbst dauert bei mir auch ca. 500-600ms. So wie oben von bauformb geschrieben. Wenn man die datenums im Plot verwendet sogar nochmal 100ms länger. P.S: Ist es eigentlich normal dass deine Abtastzeitpunkte so unregelmäßig sind? Von 91ms bis 1,9ms scheint da ja alles dabei zu sein.
Nein, das ist so langsam, weil Dein Datum kein Datum, sondern ein String ist. Mach mal das:
1 | # -*- coding: utf-8 -*-
|
2 | #%%
|
3 | import matplotlib.pyplot as plt |
4 | import pandas as pd |
5 | import time |
6 | |
7 | from datetime import datetime |
8 | #%%
|
9 | |
10 | df = pd.read_csv (r'C:\tmp\datei_meas.csv') |
11 | |
12 | #%%
|
13 | start = time.perf_counter() |
14 | df["date"] = df["date"].apply(lambda x: datetime.strptime(x, ' %H:%M:%S.%f')) |
15 | expired = time.perf_counter() - start |
16 | |
17 | print("Date conversion: ", expired) |
18 | |
19 | #%%
|
20 | |
21 | print (df) |
22 | x = df.date |
23 | y = df.ch1 |
24 | |
25 | #Darstellen der Werte
|
26 | start = time.perf_counter() |
27 | plt.plot(x,y) |
28 | plt.show() |
29 | expired = time.perf_counter() - start |
30 | |
31 | print("Plot time expired ", expired) |
32 | |
33 | |
34 | #%%
|
35 | start = time.perf_counter() |
36 | df.plot.line("date") |
37 | plt.show() |
38 | expired = time.perf_counter() - start |
39 | |
40 | print("Plot time expired ", expired) |
Liegt bei mir so im 100ms Bereich. (die "#%%" kommen aus spyder, um das Zellenweise laufen zu lassen)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.