Forum: PC-Programmierung Effitiente Datenverarbeitung/Auswertung unter Windows mit Python, es geht!


von Matze (Gast)


Lesenswert?

Hallo,

Hier geht es tatsächlich nicht um ein Problem, sondern darum wie leicht 
man Daten effitient per Script verarbeiten kann.
Ich möchte Messdaten effitient verarbeiten, und habe sie vom Messgerät 
in der Form:
1
#1,01-Jan-2003 01:30:45,0                 
2
Time,Ampl
3
0,-170.969
4
3.0517578,-89.8264
5
6.1035156,-86.5723
6
9.1552734,-86.2506
7
12.207031,-85.7201

Diese möchte ich zunächst mal mit Exel sowie Scilab unproblematisch zur 
Diagrammerstellung öffnen können.
Dazu muss in Exel 2013 unter Datei->Optionen->Erweitert der Haken 
"Trennzeichen von Betriebssystem übernehmen." abgewählt werden.
Als Dezimalzeichen wähle Ich einen ".".
Somit können gewünschte Diagramme nacher korrekt dargestellt werden.

Im nächsten Schritt geht's unter 
Start->Systemsteuerung->Programme->Standardprogramme->Dateityp óder 
Protokoll einem Programm zuordnen.
CSV wählen, ->Programm ändern->Die Datei "Konverter.bat" wählen.

Diese enthält folgenden Inhalt:
1
C:\1\Messungen\Scilab\Konverter.py %1
Der Dateipfad muss gegebenenfalls angepasst werden.

Es wird die Datei "Konverter.py" aufgerufen und ihr als 
Übergabeparameter der Pfad der Gewünschten CSV-Datei übergeben.

Duch das Python-Skript wird der Dateiinhalt konvertiert sodass er 
einfach in Scilab/Exel weiterverarbeitet werden kann.

Das Python-Skript enthält folgendes:
1
import os
2
import sys
3
print (sys.argv)
4
l1=[]
5
for elem in sys.argv:
6
    l1.extend(elem.strip().split("\\"))
7
8
leng=len(l1)
9
print(l1,"\n")
10
print(leng,"\n")
11
with open ("Erg.csv","w") as ziel :
12
    with open(l1[leng-1],"r") as datei :
13
        print ("Inhalt :")
14
        z=0
15
        for i in datei :
16
            z=z+1
17
            zeile = i.strip()
18
            inhalt = zeile.split(",")
19
            in1=inhalt[0].split(".")
20
            in2=inhalt[1].split(".")
21
            if z>5:
22
                if len(in1)>1 and len(in2)>1:
23
                    ziel.write("{0}.{1};{2}.{3}\n".format(in1[0],in1[1],in2[0],in2[1]))
24
                elif len(in1)>1:
25
                    ziel.write("{0}.{1};{2}.0\n".format(in1[0],in1[1],in2[0]))
26
                elif len(in2)>1:
27
                    ziel.write("{0}.0;{1}.{2}\n".format(in1[0],in2[0],in2[1]))
28
                else:
29
                    ziel.write("{0};{1}\n".format(in1[0],in2[0]))
30
31
os.system("C:\\1\\Messungen\\Scilab\\Auswertung.sci")")

Hierbei wird der übergebene Pfad zunächst getrennt, damit der Dateiname 
entnommen werden kann.
In dieser Datei werden entsprechend "," durch "." ersetzt.
Es wird auch überprüft ob nicht etwa ein Eintrag keine Nachkommastelle 
hat. Deshalb die if-Abfrage.
Die erzeugte Datei wird nun in Exel automatisch in zwei Spalten 
geöffnet.

Die konvertierte Datei wird im Pfad der gewählten Datei als Erg.csv 
gespeichert.
Abschließend wird dir Datei "Auswertung.sci" geöffnet.
Dadurch wird automatisch Scilab mit der konvertierten Datei gestartet. 
Diese kann nun durch Drücken auf F5 ausgewertet werden.
--> Habt ihr eine Idee wie man sich dass sparen kann?

Darin könnte man sich z.b. das Zeitsignal eine FFT oder die 
Autokorrelation der gewählten Datei ansehen...
z.b. so
1
M=csvRead('Erg.csv',";")
2
Achse = M(:,1)
3
Ampl = M(:,2)
4
[c,ind]=xcorr(Ampl,"biased")
5
F=fft(Ampl)
6
subplot(221)
7
plot(Achse,Ampl)
8
title ("Signal druch XI44")
9
xlabel ("Zeitverlauf")
10
ylabel ("Amplitude")
11
legend ("Signal(t)")
12
subplot(222)
13
plot(ind,c)
14
title ("Autokorrelation")
15
xlabel ("dt")
16
ylabel ("Amplitude")
17
legend ("Autokorr")
18
subplot(223)
19
plot(F)
20
title ("FFT")
21
xlabel ("Frequenz")
22
ylabel ("Amplitude")
23
legend ("FFT")

Nun seht ihr das gewünschte...

Ich wäre dankbar für Anregungen und einen Tip wie die Frequenzachse der 
FFT richtig skaliert wird...
oder das gewünschte einfacher erreicht werden kann...

Grüße,
Matze

von Bernd K. (prof7bit)


Lesenswert?

Du könntest versuchen fft und Plot komplett in Python zu machen. Mit 
numpy und matplotlib kommt man schon ziemlich weit. Auch das 
umständliche Einlesen eines CSV (Dein erstes Script wird in numpy zu 
einem Einzeiler)

: Bearbeitet durch User
von Bernhard S. (gmb)


Lesenswert?

Matze schrieb:
> Ich wäre dankbar für Anregungen und einen Tip wie die Frequenzachse der
> FFT richtig skaliert wird...

Die FFT erzeugt Frequenzpunkte der Breite "Samplingfrequenz/fftpoints", 
und das bis zur Nyquistfrequenz. Mache sowas mit FS=Samplingfrequenz und 
fft_points=Anzahl FFT Punkte:

f=(0:(FS/fft_points):(FS)-(FS/fft_points));

Und nimm das dann auf die x-Achse

"F=fft(Ampl)" + "plot(F)" würde bei mir in Octave allerdings nicht 
funktionieren, weil die FFT komplexe Werte liefert, ich schreibe 
stattdessen den Betrag, außerdem verwende ich einen Vorfaktor, der dafür 
sorgt dass die Amplitude eines Signales unabhängig von der Anzahl der 
FFT Punkte ist:

spectrum=(2/fft_points).*(abs(fft(Y,fft_points)));

Plotten tue ich dann in dB:

plot(f,20*log10(spectrum))

> oder das gewünschte einfacher erreicht werden kann...

Was du davor gemacht hast mit Python usw. habe ich nicht ganz kapiert, 
ich mache sowas in Octave und kann dort Messdaten in verschiedenen 
Formaten (S2P, CSV) direkt mit "dlmread" einlesen. Einfacher geht es 
eigentlich nicht.

von Bernd K. (prof7bit)


Lesenswert?

Bernhard S. schrieb:
> Was du davor gemacht hast mit Python usw. habe ich nicht ganz kapiert,
> ich mache sowas in Octave und kann dort Messdaten in verschiedenen
> Formaten (S2P, CSV) direkt mit "dlmread" einlesen.

Er ist Python-Anfänger. Warte erstmal bis er die mitgelieferten 
Batterien¹ findet, auspackt und einlegt ;-)


________
¹) 
https://www.python.org/dev/peps/pep-0206/#batteries-included-philosophy

: Bearbeitet durch User
von Matze (Gast)


Lesenswert?

@Bernhard S.
> FFT
Danke dass werd ich versuchen :)

Bernhard S. schrieb:
> Was du davor gemacht hast mit Python usw. habe ich nicht ganz kapiert,
> ich mache sowas in Octave und kann dort Messdaten in verschiedenen
> Formaten (S2P, CSV) direkt mit "dlmread" einlesen. Einfacher geht es
> eigentlich nicht.

Also im Prinzip hat der Nutzer csv Dateien.
Diese klickt er mit Doppelklich an, sie werden so konvertiert dass sie 
nun leicht mit SciLab und Exel geöffnet werden können.
Die Kopie wird als Erg.csv im Verzeichniss der Ursprungsdatei 
gespeichert.

Das Skript zur Auswertung der konvertierten Datei wird in Scilab 
geöffnet, zusätzlich befindet sich Scilab im richtigen verzeichniss und 
durch nur einen Tastendruck auf F5 wird das zu den Messdaten gehörige 
Script ausgeführt.
Als Nebenergebniss lässt sich die Datei Erg.csv auch in Exel nun 
unkompliziert weiterverarbeiten.

Dass Auswerteskript, das Python und Batch-File können an jedem 
beliebigen Ort auf dem PC Liegen.
Allein durch Doppelklich auf die Messdatendatei und einen Tastendruck 
auf F5 erhält der Nutzer alle gewünschten diagramme jeder beliebigen 
csv-Messdatei :)

Wenn ich nur wüsste wie ein Script bei laden in Scilab automatisch 
gestartet werden kann... dazu hab ich nichts gefunden?

von Bernd K. (prof7bit)


Lesenswert?

Matze schrieb:
> Also im Prinzip hat der Nutzer csv Dateien.
> Diese klickt er mit Doppelklich an, sie werden so konvertiert dass sie
> nun leicht mit SciLab

Aber SciLab kann doch die Datei auch so schon lesen, das ist eine ganz 
normale csv-Datei. Die Notwendigkeit des Umwegs über Python an der 
Stelle ist irgendwie nicht nachvollziehbar.

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.