2016-08-01 33 views
3

Ich werde schockiert sein, wenn es nicht einige Standard-Bibliothek-Funktion für diese insbesondere in numpy oder scipy gibt, aber keine Menge von Googling bietet eine anständige Antwort.Python - nullter Ordnung Halten Interpolation (Nächster Nachbar)

Ich bekomme Daten von der Poloniex Exchange - Kryptowährung. Denken Sie daran, wie Aktienkurse - kaufen und verkaufen - auf Ihren Computer geschoben werden. Also, was ich habe, ist Zeitreihen von Preisen für jeden gegebenen Markt. Ein Markt könnte 10-mal am Tag aktualisiert werden, während ein anderer 10 mal pro Minute aktualisiert wird - alles hängt davon ab, wie viele Menschen auf dem Markt kaufen und verkaufen.

So wird meine Zeitreihen-Daten am Ende so etwas wie sein:

[1 0.0003234, 
1.01 0.0003233, 
10.0004 0.00033, 
124.23 0.0003334, 
...] 

Wo die erste Spalte den Zeitwert ist (ich benutze Unix-Zeitstempel auf die Mikrosekunde, aber denken Sie nicht, dass in dem Beispiel notwendig war. Die zweite Spalte wäre einer der Preise - entweder der Kauf- oder der Verkaufspreis.

Ich möchte es in eine Matrix konvertieren, wo die Daten in einem regelmäßigen Zeitrahmen "abgetastet" werden. Also interpoliert (null (hold) Matrix wäre:

[1 0.0003234, 
2 0.0003233, 
3 0.0003233, 
... 
10 0.0003233, 
11 0.00033, 
12 0.00033, 
13 0.00033, 
... 
120 0.00033, 
125 0.0003334, 
...] 

Ich möchte dies mit jedem vernünftigen Zeitschritt tun. Im Moment benutze ich np.linspace(start_time, end_time, time_step), um den neuen Zeitvektor zu erstellen.

Das Schreiben meines eigenen, zugegebenermaßen groben Interpolators nullter Ordnung wird nicht so schwer sein. Ich werde den ursprünglichen Zeitvektor durchlaufen und np.nonzero verwenden, um alle Indizes im neuen Zeitvektor zu finden, die zwischen einen Zeitstempel (t0) und den nächsten (t1) passen, und fülle dann diese Indizes mit dem Wert von Zeitpunkt t0 ein.

Für jetzt funktioniert die grobe Methode. Die Matrix der Preise ist nicht so groß. Aber ich muss da eine schnellere Methode mit einer der eingebauten Bibliotheken denken. Ich kann es einfach nicht finden.

Auch für das obige Beispiel verwende ich nur eine Matrix von Nx2 (Spalte 1: Zeiten, Spalte 2: Preis), aber letztendlich hat der Markt 6 oder 8 verschiedene Parameter, die aktualisiert werden könnten. Eine Methode/Bibliothek-Funktion, die mehrere Preise und solche in verschiedenen Spalten behandelt werden könnte, wäre groß.

Python 3.5 über Anaconda auf Windows 7 (wird hoffentlich keine Rolle spielen).

TIA

Antwort

4

Für Ihr Problem können Sie scipy.interpolate.interp1d verwenden. Es scheint in der Lage zu sein, alles zu tun, was Sie wollen. Wenn Sie kind="zero" angeben, kann eine Interpolationsoperation nullter Ordnung ausgeführt werden. Es kann auch simultan mehrere Spalten einer Matrix interpolieren. Sie müssen nur die entsprechende axis angeben. f = interp1d(xData, yDataColumns, kind='zero', axis=0) gibt dann eine Funktion zurück, die Sie an einem beliebigen Punkt im Interpolationsbereich auswerten können. Sie können dann Ihre normalisierten Daten erhalten, indem Sie f(np.linspace(start_time, end_time, time_step) aufrufen.

+0

Da ich die Daten als numpy Matrix gespeichert habe, musste ich zwicken Sie Code ein wenig. Spezifisch - 'f = interpolieren.interp1d (np.asarray (a [: 0]) [:, 0], a [: 1], kind = 'null', axis = 0)' wo a die Probe wäre Daten oben. Das einzige andere Problem, das ich hatte, war, dass linspace einen Zeilenvektor ausgibt, also musste ich ihn für f als 'new_y = f (new_x.T)' bereitstellen, wobei new_x die Ausgabe von linspace ist. –

+0

Danke auch für das Beispiel auf interp1d. Ich hatte es in meinem Googling oft gesehen, aber ich hatte nie einen Bezug oder ein Beispiel zu dem '' Art''-Parameter gesehen. –

+0

@gab Ich bin froh, dass ich helfen konnte! – jotasi