2016-07-31 38 views
1

Ich habe ein Grundstück glatter zu machen versucht, wie es here getan wird, aber meine Xs sind Datetime-Objekte, die mit linspace nicht kompatibel sind ..Glatte Linie mit Spline + Datetime-Objekte funktioniert nicht

ich wandeln die xs matplotlib Termine:

Xnew = matplotlib.dates.date2num(X) 
X_smooth = np.linspace(Xnew.min(), Xnew.max(), 10) 
Y_smooth = spline(Xnew, Y, X_smooth) 

Aber dann bekomme ich ein leeres Grundstück, wie mein Y_smooth

ist

[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ]

f oder aus irgendeinem unbekannten Grund.

Wie kann ich das schaffen?

EDIT

Hier ist, was ich bekomme, wenn ich die Variablen drucken, ich sehe nichts Ungewöhnliches:

X : [datetime.date(2016, 7, 31), datetime.date(2016, 7, 30), datetime.date(2016, 7, 29)] 
X new: [ 736176. 736175. 736174.] 
X new max: 736176.0 
X new min: 736174.0 
XSMOOTH [ 736174.   736174.22222222 736174.44444444 736174.66666667 
    736174.88888889 736175.11111111 736175.33333333 736175.55555556 
    736175.77777778 736176.  ] 
Y [711.74, 730.0, 698.0] 
YSMOOTH [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] 
+0

Ich habe gerade versucht, ein Beispiel, und Ihr Ansatz für mich gearbeitet. Versuchen Sie, jede Zeile zu debuggen. Was sind die Werte von 'Xnew.min()' und 'Xnew.max()'? Veröffentlichen Sie weitere Details. Was sind die Werte von 'X',' X_smooth', 'Xnew'. Für [Debugging in einem IPython während der Ausführung versuchen Sie '% debug'] (https://ipython.org/ipython-doc/1/interactive/tutorial.html#debugging) [Haltepunkte hinzufügen] (https: // docs. python.org/2/library/pdb.html#debugger-commands) oder verwenden Sie [logging] (https://docs.python.org/2/library/logging.html), um während der Ausführung Zwischenwerte anzuzeigen. –

+0

Ich habe die Frage bearbeitet und die Variablen hinzugefügt – AimiHat

+0

Aus Ihrer Ausgabe folgere ich, dass Sie Problem mit Spline sind, nicht das Datum mal. Kannst du deine Frage anders formulieren? Und vielleicht versuchen Sie Ihr Problem mit einem kleineren Satz von Zahlen, wie 10 statt 300, die einfacher in SO angezeigt werden und einfacher zu debuggen sind. Überprüfen Sie auch die 'np.splie' Dokumente sorgfältig –

Antwort

3

Ihre X Werte umgekehrt sind, scipy.interpolate.spline erfordert die unabhängige Variable monoton steigend zu sein, und Diese Methode ist veraltet - verwenden Sie stattdessen interp1d (siehe unten).

>>> from scipy.interpolate import spline 
>>> import numpy as np 
>>> X = [736176.0, 736175.0, 736174.0] # <-- your original X is decreasing 
>>> Y = [711.74, 730.0, 698.0] 
>>> Xsmooth = np.linspace(736174.0, 736176.0, 10) 
>>> spline(X, Y, Xsmooth) 
array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]) 

Reverse X und Y erste und es funktioniert

>>> spline(
...  list(reversed(X)), # <-- reverse order of X so also 
...  list(reversed(Y)), # <-- reverse order of Y to match 
...  Xsmooth 
...) 
array([ 698.  , 262.18297973, 159.33767533, 293.62017489, 
     569.18656683, 890.19293934, 1160.79538066, 1285.149979 , 
     1167.41282274, 711.74  ]) 

Beachten Sie, dass viele Spline-Interpolationsverfahren X erfordern monoton zu steigen:

x : (N,) array_like - 1-D array of independent input data. Must be increasing.

x : (N,) array_like - Input dimension of data points – must be increasing

Die Standardreihenfolge von scipy.interpolate.spline ist kubisch. Da es nur 3 Datenpunkte gibt, gibt es große Unterschiede zwischen einem kubischen Spline (order=3) und einem quadratischen Spline (order=2). Die folgende Grafik zeigt den Unterschied zwischen Splines unterschiedlicher Ordnung. Hinweis: 100 Punkte wurden glatt verwendet die angepasste Kurve mehr.

scipy.interpolate.spline

Die Dokumentation für scipy.interpolate.spline ist vage und schlägt vor, sie nicht unterstützt werden kann. Zum Beispiel ist es nicht auf der scipy.interpolate main page oder auf der interploation tutorial aufgeführt. Die source for spline zeigt, dass es spleval und splmake tatsächlich Anrufe, die unter Additional Tools wie aufgeführt sind:

Functions existing for backward compatibility (should not be used in new code).

würde ich cricket_007 ‚s Vorschlag folgen und interp1d verwenden.Es ist die derzeit vorgeschlagene Methode, sie ist sehr gut dokumentiert mit detailed examples in both the tutorial und API, und es ermöglicht die unabhängige Variable unsortiert (Reihenfolge) standardmäßig (siehe assume_sorted Argument in API).

>>> from scipy.interpolate import interp1d 
>>> f = interp1d(X, Y, kind='quadratic') 
>>> f(Xsmooth) 
array([ 711.74  , 720.14123457, 726.06049383, 729.49777778, 
     730.45308642, 728.92641975, 724.91777778, 718.4271605 , 
     709.4545679 , 698.  ]) 

Auch wird es einen Fehler auslösen, wenn die Daten rank deficient sind.

>>> f = interp1d(X, Y, kind='cubic') 

ValueError: x and y arrays must have at least 4 entries

+0

Sorgt für Ordnung? Was ist, wenn Sie eine lineare Linie mit einer negativen Steigung spline? X erhöht sich, wenn Y abnimmt ... –

+0

Ich weiß nicht, vielleicht, tat ich nicht lese die Dokumentation auf 'scipy.interpolate.spline', aber es spielt keine Rolle, die Ausgabe von' np.linspace '' Xsmooth' ist der ursprünglichen Eingabe entgegengesetzt, 'Xnew', also ist das Problem, es ist inkonsistent. –

+0

Unerklärlich .. Wenn ich was mache t Sie haben gesagt: 'newX = Liste (umgekehrt (matplotlib.dates.date2num (X))) Y = Liste (umgekehrt (Y)) X_smooth = np.linspace (min (newX), max (newX), 10) Y_smooth = Spline (newX, Y, X_smooth) ' ich:' [755. 1000,68447671 1062,10559586 991,91003112 842,74445597 667,25554403 518,08996888 447,89440414 509,31552329 755.] ' für dieses Y: ' [755.0, 755.0, 755.0 ] ' – AimiHat