2016-03-21 4 views
0
f = pd.read_hdf('Sensor_Data.h5','f') 
pieces = [f[x: x + 360] for x in xrange(504649)] 
df = pd.concat(pieces) 

Morgen alle. Ich habe eine Datei mit 500.000 Datenzeilen. Ich möchte daraus 360 Reihenscheiben nehmen und sie jeweils um 1 Reihe nach unten verschieben. (Also werde ich mit einer Menge Daten enden.)Pandas Dataframe: Mangel an Speicher - Was ist der bessere Weg hier?

Wie erwartet, habe ich den obigen Code versucht und einen Speicherfehler bekommen. Ich nehme an, es gibt einen besseren Weg, dies zu tun?

EDIT: Um etwas Kontext hinzuzufügen, ist dies eine .h5-Datei, und ich benutze Pandas Dataframe, um es auf diese Weise zu schneiden. Ich versuche, ein Array von Daten zu erstellen, um in ein tiefes neuronales Netzwerk mit Hilfe von KaffeeNet zu füttern, obwohl das Format an diesem Punkt unklar sein wird ...

Der Code funktioniert für kleine Datenmengen. Nur nicht für größere. Um klarer, was ich versuche zu tun zu: import Pandas als pd

df = pd.DataFrame(np.random.randn(10,6)); df 

[zeigt eine 6 x 10 Tabelle von Zufallszahlen] Jetzt:

pieces = [df[x: x + 4] for x in xrange(7)] 
f = pd.concat(pieces) 
f 

Diplays eine neue Tabelle ähnlich der vorherige, aber erweitert. Es hat jetzt Zeilen 0,1,2,3,1,2,3,4,2,3,4,5,3,4,5,6 ...

Jetzt "Stücke" ist kein Datenrahmen Objekt selbst, aber eine "Liste" aus irgendeinem Grund. Gibt es auch eine einfache Möglichkeit, all diese separaten Datensätze (0, 1, 2, 3), (1, 2, 3, 4) usw. in das Datenrahmenobjekt selbst zu verwandeln? (Anstelle von ihnen zusammen in einen Datenrahmen verketten

Ich hoffe, das macht Sinn

+0

Meine bevorzugte Methode zur Verarbeitung großer Datenmengen ist die Verwendung von ['numpy.memmap'] (http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.memmap.html) . Ein Nachteil ist, dass Sie Ihre Daten in ein binäres Format konvertieren müssen, das von 'memmap' verstanden wird, aber danach können Sie problemlos mit riesigen Datensätzen arbeiten. Müssen Sie wirklich alle diese redundanten Daten für Ihre Slices speichern? Was ist die ultimative Verwendung dieser Scheiben? Vielleicht wäre es besser, einfach einen Iterator zu erstellen. –

+1

Nun, Sie nehmen im Grunde Ihre Daten und multiplizieren mit 360, richtig? Aber dieser letzte Datenrahmen ist mit Tonnen redundanter Daten gefüllt, was sinnlos ist.Ich nehme an, Sie machen das für spätere Berechnungen? Aber es wird bessere Möglichkeiten geben, diese Berechnungen durchzuführen, als Speicher zu verschwenden. z.B. Verschieben/Erweitern von Funktionen, erweiterte (ausgefallene) Indizierung, etc. Ich vermute, was Sie tun müssen, ist darüber nachdenken, wie die Calcs zu tun, nicht, wie der Speicherabdruck zu erweitern. – JohnE

+0

Ja, es ist für die Zwecke der späteren calcs. Ich werde die Frage bearbeiten, um ein bisschen klarer zu sein ... Was soll ich angesichts des neuen Kontexts tun? –

Antwort

0

Betrachten h5py mit Von the website:.. „Zum Beispiel können Sie auf der Festplatte gespeicherten Datensätze Multi-Terabyte-Scheibe in, als ob sie waren echte NumPy-Arrays ".

0

So haben Sie ein paar Fragen dort. Zuerst das einfachste: Stücke ist eine Liste, weil Sie es mit einem Listenverständnis erstellt haben, sollte es eine Liste von Datenrahmen-Objekten sein. Wenn Sie wollen Um sie als separate Datenrahmenobjekte zu verwenden, könnten Sie einfach in die Liste indizieren (dh Teile [0] usw.).

Aber Sie haben immer noch dieses Problem, dass Sie versuchen, einen riesigen Datenrahmen zu erstellen. Ohne den Rest zu sehen, wie Sie den Code verwenden würden, würde ich vorschlagen, nicht eine halbe Million Scheiben Ihres df zu erstellen, sondern stattdessen über Ihren ursprünglichen Datenrahmen zu schleifen und die Funktion aufzurufen, die Sie für eine einzelne Scheibe des Datenrahmens benötigen:

for x in xrange(504649): 
    result = my_func(df[x:x+360]) 

so wird jede Scheibe nach ihrer Verwendung freigegeben. Und hoffentlich ist das Ergebnis viel kleiner als der Rahmen.

Sie können auch wie oben beschrieben alle unsere Slices in separate cvs-Dateien schreiben und sie nach Bedarf einlesen.