2016-04-10 11 views
2

Ich habe zwei Zeitreihen. Jede Zeitreihe (s1 und s2) wird durch eine Liste von Werten und eine entsprechende Liste von Zeiten (zum Beispiel Zeitstempel oder was auch immer) dargestellt. Ich verwende Python, so zum Beispiel habe ich:Plot Werte von zwei Zeitreihen mit unterschiedlichen Daten

s1_values = [6,8,6,3,7,9] # len(s1_values) == len(s1_times) 
s1_times = [1,3,6,7,8,12] 

s2_values = [3,8,7,2,5,4,6,2] # len(s2_values) == len(s2_times) 
s2_times = [2,4,5,7,8,9,10,13] 

Ich möchte die Beziehung zwischen den beiden Zeitreihen s1 und s2 sehen, so dass ich möchte in der Lage sein s1_values ​​zu plotten (auf einer x-Achse) gegen s2_values ​​(auf einer Y-Achse) mit Matplotlib, aber da die beiden Zeitreihen nicht zeitlich ausgerichtet sind, weiß ich nicht, wie das geht.

Vielleicht gibt es einige übliche Möglichkeiten, dies für Zeitreihen zu tun, aber ich bin mir ihrer nicht bewusst.

+0

Was versuchen Sie sie in planen? –

+0

@JamieBull In Matplotlib. Ich hätte gerne eine Art aggregierte Zeitreihe s, die eine Kombination aus s1 und s2 ist. – eLearner

+0

Hast du Plotten (t1, s1) und dann (t2, s2) auf dem gleichen Plot? Wenn nicht, dann mach es zuerst. Das wird dir eine Idee geben, was als nächstes zu tun ist. – Hun

Antwort

2

Sie können pandas (docs) verwenden, was für Zeitreihendaten hervorragend ist. In diesem Fall würden Sie zwei Datenrahmen erstellen, diese zusammenführen und sortieren.

Die merge gibt Ihnen eine fusionierte „Time“ -Serie (viele auf verschiedene Arten von here Verschmelzung), nan Werte in den Wertspalten eingefügt, wo kein Wert für diese Zeit. Dies wird dann nach der gemeinsamen Spalte Time sortiert. Die df.fillna-Funktion (docs) akzeptiert den Parameter method, der, wenn er ffill oder pad ist, Lücken mit dem letzten gültigen Wert füllt und bfill mit dem nächsten gültigen Wert füllt. Alternativ können Sie auch df.interpolate für die lineare Interpolation von fehlenden Werten verwenden().

Das handliche Ding ist pandas Wraps matplotlib, so dass Sie nur direkt aus dem Datenrahmen plotten können.

import matplotlib.pyplot as plt 
import pandas as pd 


s1_values = [6,8,6,3,7,9] 
s1_times = [1,3,6,7,8,12] 

s2_values = [3,8,7,2,5,4,6,2] 
s2_times = [2,4,5,7,8,9,10,13] 

df1 = pd.DataFrame(zip(s1_times, s1_values), columns=['Time', 's1 values']) 
df2 = pd.DataFrame(zip(s2_times, s2_values), columns=['Time', 's2 values']) 

df = df1.merge(df2, how='outer', on='Time', sort='Time') 
df.fillna(method='pad', inplace=True) # or df.interpolate(inplace=True) 

df.plot(kind='scatter', x='s1 values', y='s2 values') 
plt.show() 

Mit fillna(method='ffill')

enter image description here

Mit interpolate()

enter image description here

+0

Siehe Änderungen. Ich habe auch einige Links zu den Dokumenten hinzugefügt. –

+0

Ja, das würde funktionieren. Sie müssen nur nach der Spalte "Zeit" sortieren, bevor Sie interpolieren oder füllen. –