2016-06-03 7 views
1

Ich führe Datenanalyse für eine große Anzahl von Variablen in einer hdf5-Datei. Der Code, den ich geschrieben habe, führt eine Schleife über eine Liste von Variablen, führt dann Analysen durch und gibt einige Graphen aus. Es wäre schön, in der Lage zu sein, den Code für Kombinationen von Variablen zu verwenden (wie A+B oder), ohne eine Reihe von if-Anweisungen einfügen zu müssen, d. H. Die Anweisung in der Zeichenfolge ausführen, wenn die Variablen aus meiner hdf5-Datei geladen werden. Wenn möglich, möchte ich vermeiden, pandas zu verwenden, aber ich bin nicht völlig dagegen, wenn das der einzige effiziente Weg ist, zu tun, was ich will.Führen Sie grundlegende mathematische Operationen beim Laden von Variablen mit h5py durch

Meine hdf5 Datei sieht wie folgt aus etwas:

HDF5 "blahblah.hdf5" { 
FILE_CONTENTS { 
group /
group  /all 
dataset /all/blargle 
dataset /all/blar 
} 
} 

Und was ich möchte, ist, dies zu tun (diese Funktionalität nicht in h5py nicht vorhanden ist, so dass es Bugs):

myfile = h5py.File('/myfile/blahblah.hdf5') 
varlist = ['blargle', 'blar', 'blargle+blar'] 

savelist = [None]*len(varlist) 

for ido, varname in enumerate(varlist): 
    savelist[ido] = myfile['all'][varname] 
    #would like to evaluate varname upon loading 

Antwort

0

Zuerst muss man sich fragen: Kenne ich die arithmetischen Operationen nur zur Laufzeit oder schon zur Programmierzeit?

Wenn Sie es bereits jetzt wissen, schreiben Sie einfach eine Funktion in Python dafür.

Wenn Sie es nur zur Laufzeit wissen, benötigen Sie einen Parser. Während es da draußen spezialisierte Bibliotheken gibt (example), ist Python selbst bereits ein Parser. Mit exec können Sie Strings ausführen, die Python-Code enthalten.

Jetzt alles, was Sie definieren müssen, ist eine Art von Grammatik für bestimmte Sprache. Du brauchst einige Konventionen. Sie haben sie bereits, es scheint, Sie möchten myfile['all']['blargle+blar'] zu myfile['all']['blargle']+myfile['all']['blar'] konvertieren. Um das Leben leichter zu machen, empfehle ich.

Namen von Datensätzen in Klammern setzen.

varlist = ['[blargle]', '[blar]', '[blargle]+[blar]', 'sqrt(([blargle]**2)+([blar]**2)'] 

Dann ersetzen Sie einfach alle Begriffe in Klammern von myfile['all'][name_in_brackets] und dann die Zeichenfolge mit exec auszuführen.

import re 
for ido, varname in enumerate(varlist): 
    term = re.sub(r'\[(.*?)\]', lambda x: "myfile['all']['{}']".format(x), varname, flag='g') 
    savelist[ido] = exec(term) 

Die Linie regulären Ausdruck unter Verwendung der Variablennamen übereinstimmen re.sub ist eigentlich nicht von mir getestet.

Und noch ein weiterer Nachteil. Ich bin nicht sicher, ob das Lesen von Datensätzen aus einem hdf5-Objekt schnell ist, da der gleiche Datensatz mehrmals gelesen werden kann und wenn hdf5 nicht zwischengespeichert wird, könnte es besser sein, die Datensätze zwischenzuspeichern, bevor sie berechnet werden.

Verwandte Themen