not*_*ink 3 python scipy pandas
我的数据集如下所示:data0,data1,data2(类似于时间与电压数据)
如果我使用以下代码加载和绘制数据集:
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)
Run Code Online (Sandbox Code Playgroud)
我有类似的东西:
现在我尝试将data0与data1关联起来:
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()
Run Code Online (Sandbox Code Playgroud)
输出:
-99
Run Code Online (Sandbox Code Playgroud)
和

这与预期一样有效!但如果我用data2尝试相同的东西,我得到一个看起来像的情节:

积极的转变410.我想我只是不理解它是如何pd.shift()工作的,但我希望我能用它pd.shift()来对齐我的数据集.据我了解,返回correlate()告诉我数据集离我有多远,所以我应该能够使用shift来重叠它们.
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)
Run Code Online (Sandbox Code Playgroud)
这是输出:

@HYRYlen()对您答案的一个更正:从一开始的 和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 时