2013-10-28 20 views
1

我有數據集看起來像下面這樣:data0data1data2(類似於時間與電壓數據)使用pandas.shift()來對齊數據集的基礎上scipy.signal.correlate

如果我加載和繪製使用類似代碼的數據集:

import pandas as pd 
import numpy as np 
from scipy import signal 
from matplotlib import pylab as plt 

data0 = pd.read_csv('data0.csv') 
data1 = pd.read_csv('data1.csv') 
data2 = pd.read_csv('data2.csv') 

plt.plot(data0.x, data0.y, data1.x, data1.y, data2.x, data2.y) 

我得到的是這樣的:

plotting all three datasets

現在我嘗試用數據1到相關數據0:

shft01 = np.argmax(signal.correlate(data0.y, data1.y)) - len(data1.y) 
print shft01 
plt.figure() 
plt.plot(data0.x, data0.y, 
     data1.x.shift(-shft01), data1.y) 
fig = plt.gcf() 

與輸出:

-99 

shifted version of data1

其作品也期待!但如果我嘗試它與DATA2同樣的事情,我得到一個情節,看起來像:

shifted version of data2

410一個積極的轉變。我想我只是不瞭解pd.shift()如何工作,但我希望我可以使用pd.shift()來對齊我的數據集。據我所知,correlate()的回報告訴我我的數據集有多遠,所以我應該能夠使用shift來重疊它們。

回答

5

panda.shift()不是沿x軸移動曲線的正確方法。你應該調整點的X值:

plt.plot(data0.x, data0.y) 
for target in [data1, data2]: 
    dx = np.mean(np.diff(data0.x.values)) 
    shift = (np.argmax(signal.correlate(data0.y, target.y)) - len(target.y)) * dx 
    plt.plot(target.x + shift, target.y) 

這裏是輸出:

enter image description here

+0

謝謝。這很有道理。我想根據可用的文檔,我不清楚pd.shift()是如何工作的。 –

2

@HYRY一個修正你的答案:有len()之間的索引不匹配,這是基於一個和np.argmax(),這是從零開始的。該行應爲:

shift = (np.argmax(signal.correlate(data0.y, target.y)) - (len(target.y)-1)) * dx

例如,在你的信號已經對準的情況下:

len(target.y) = N(一個爲主)

的互相關函數具有長度2N-1,所以中心值,爲對齊的數據,方法是:

np.argmax(signal.correlate(data0.y, target.y) = N - 1(從零開始)

shift = ((N-1) - N) * dx =(-1)* dx,當我們真的想要0 * dx