Forum: Mikrocontroller und Digitale Elektronik Datenaufbereitung


von Matthias P. (m4tthi)


Lesenswert?

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

von Thomas W. (Gast)


Lesenswert?

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

von Programmierer (Gast)


Lesenswert?

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.

von Walter T. (nicolas)


Lesenswert?

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.

von Matthias P. (m4tthi)


Lesenswert?

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.

von Kevin M. (arduinolover)


Lesenswert?

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.

von Jim M. (turboj)


Lesenswert?

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.

von Helge (Gast)


Lesenswert?

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?

von schotter (Gast)


Lesenswert?


von Matthias P. (m4tthi)


Lesenswert?

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.

von Programmierer (Gast)


Lesenswert?

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.

von Matthias P. (m4tthi)


Angehängte Dateien:

Lesenswert?

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

von Walter T. (nicolas)


Lesenswert?

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.

von Matthias P. (m4tthi)


Lesenswert?

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.

von Bauform B. (bauformb)


Lesenswert?

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.

von Andreas H. (ahz)


Lesenswert?

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

von MaNi (Gast)


Lesenswert?

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.

von Ingo E. (ogni42)


Lesenswert?

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
Noch kein Account? Hier anmelden.