2016-10-18 1 views
1

Ich verwende Physionet's data base für einige Aufgaben im Zusammenhang mit der EKG-Signalanalyse. Ich wollte .MAT-Dateien lesen, die MLII-Werte aus der Datei extrahieren (in Reihe 1), das Signal mit "Gain" und "Base" (im .INFO-Feld von Physionet) auf mV einstellen und schließlich drucken die Signalwerte und ihre Periode.Python 2.7: Variable "ist nicht definiert"

Ich wollte ein Skript schreiben, das alle diese Dinge für alle Dateien in einem Ordner tun könnte. Vorher habe ich eine geschrieben, in der ich alles, was oben erwähnt wurde, machen konnte und es hat gut funktioniert.

Aber das Skript, das alle .mat und .info-Dateien in meinem Ordner verwalten würde, gibt mir Probleme mit den Variablen. Ich habe versucht, den Befehl 'global' zu Beginn meiner Folge von IFs zu verwenden, aber es wurde eine ähnliche Fehlermeldung gesendet.

Dies ist der Code:

import os 
import scipy.io as sio 
import numpy as np 
import re 
import matplotlib.pyplot as plt 

for file in os.listdir('C:blablablablabla\Multiple .mat files'): 
    if file.endswith(".mat"): 
     file_name=os.path.splitext(file) 
     ext_txt=".txt" 
     ext_info=".info" 
     if file.endswith(".info"): 
      f=open(file_name[0]+ext_info,'r') 
      k=f.read() 
      f.close() 
      j=re.findall('\d+', k) 
      Fs=j[9] 
      gain=j[13] 
      base=j[14] 

     RawData=sio.loadmat(file) 
     signalVectors=RawData['val'] 
     [a,b]=signalVectors.shape 
     signalVectors_2=np.true_divide((signalVectors-gain),base) 
     ecgSignal=signalVectors_2[1,1:] 
     T=np.true_divide(np.linspace(1,b,num=b-1),Fs) 
     txt_data=np.array([ecgSignal, T]) 
     txt_data=txt_data.T 
     f=open(file_name[0]+ext_name,'w') 
     np.savetxt(file_name[0]+ext_txt,txt_data,fmt=['%.8f','%.8f']) 
     f.close() 

Die Fehlermeldung ich erhalte, ist:

> File "C:blablablablabla\Multiple .mat files\ecg_mat_multi.py", line 24, in <module> 
    signalVectors_2=np.true_divide((signalVectors-gain),base) 
NameError: name 'gain' is not defined 

Das Problem kommt mit den 'Gewinn' Variablen 'Basis' und 'Fs'. Ich habe versucht, sie als globale Variablen zu definieren, aber das machte keinen Unterschied. Können Sie mir bitte helfen, diesen Fehler zu beheben?

Vielen Dank für Ihre Zeit und Hilfe.

EDIT 1: kopiert die Fehlermeldung unter dem Skript. EDIT 2: Änderte den Beitragstitel und löschte zusätzliche Fragen.

+1

Sie haben uns nicht gesagt, was der Fehler ist. Welche Variable ist nicht definiert? –

+1

Sie können die Frequenz suchen, indem Sie nach dem Stringindex der Wörter 'Sampling frequency' suchen und dann die entsprechenden Zeichen nach ie suchen: 'index = your_string.index ('Abtastfrequenz:')' 'frequency = your_string [(index +20): (index + 23)] ' – Jalo

+0

@DanielRoseman tut mir leid, Daniel. Ich habe die Frage mit der Fehlermeldung, die ich bekomme, aktualisiert. –

Antwort

2

Verwenden zwei Schleifen und extrahieren Sie die info bevor die Datendateien verarbeiten

for filepath in os.listdir('C:blablablablabla\Multiple .mat files'): 
    if filepath.endswith(".info"): 
     Fs, gain, base = get_info(filepath) 
     break 
for file in os.listdir('C:blablablablabla\Multiple .mat files'): 
    if file.endswith(".mat"): 
     file_name=os.path.splitext(file) 
     ... 
     RawData=sio.loadmat(file) 
     signalVectors=RawData['val'] 
     ... 

Ich arbeitete von Ihrer ersten editierten so das werde ich schließen, obwohl die Frage war rationalisierte

# foo.info 
Source: record mitdb/100 Start: [00:00:10.000] 
val has 2 rows (signals) and 3600 columns (samples/signal) 
Duration: 0:10 
Sampling frequency: 360 Hz Sampling interval: 0.002777777778 sec 
Row Signal Gain Base Units 
1 MLII 200 1024 mV 
2 V5 200 1024 mV 

To convert from raw units to the physical units shown 
above, subtract 'base' and divide by 'gain'. 

Ich würde auch eine Funktion schreiben, die die gewünschten Informationen zurückgibt. Das Verwenden einer Funktion zum Extrahieren der Informationen macht den Code in Ihrer Schleife besser lesbar und erleichtert das Testen der Extraktion.

Da die Datei gut strukturiert ist, könnten Sie wahrscheinlich über die Zeilen iterieren und die Informationen extrahieren, indem Sie Zeilen zählen und str.split und Slices verwenden.

Diese Funktion verwendet regex Muster die Informationen zu extrahieren:

# regex patterns 
hz_pattern = r'frequency: (\d+) Hz' 
mlii_pattern = r'MLII\t(\d+)\t(\d+)' 

def get_info(filepath): 
    with open(filepath) as f: 
     info = f.read() 
    match = re.search(hz_pattern, info) 
    Fs = match.group(1) 
    match = re.search(mlii_pattern, info) 
    gain, base = match.groups() 
    return map(int, (Fs, gain, base)) 

Wenn es mehrere .info und .mat Dateien in einem Verzeichnis, möchten Sie Sie extrahieren die richtigen Informationen für die Daten, um sicherzustellen, . Da die .info-Datei denselben Namen wie die .mat-Datei hat, die zu gehört, sortieren Sie die Verzeichnisliste nach Name und gruppieren Sie nach Name -dies wird sicherstellen, dass Sie mit den beiden Dateien arbeiten, die miteinander verwandt sind.

import itertools 
def name(filename): 
    name, extension = filename.split('.') 
    return name 

files = os.listdir('C:blablablablabla\Multiple .mat files') 
files.sort(key = name) 
for fname, _ in itertools.groupby(files, key = name): 
    fname_info = name + '.info' 
    fname_data = name + '.mat' 
    Fs, gain, base = get_info(fname_info) 
    # process datafile 
+0

Das ist großartig. Speziell für die Funktion Lesen der .info-Datei. Physionet bietet ein Matlab-Skript, das Strings auf ähnliche Weise scannt, wie Sie es hier tun. Ich wollte das selbst machen, aber ich konnte nicht. Das hat mir wirklich geholfen. Ich habe kaum ein paar Tage damit, Dinge in Python zu tun, und diese Aufgabe war nützlich, um Zweifel auszuräumen und neue Fragen zu stellen. vielen dank! –

Verwandte Themen