5

我有如下所示的数据集:data0data1data2(类似于时间与电压数据)

如果我使用如下代码加载和绘制数据集:

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)

我得到类似的东西:

绘制所有三个数据集

现在我尝试将 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()

输出:

-99

data1 的移位版本

正如预期的那样工作!但如果我用 data2 做同样的事情,我会得到一个看起来像这样的图:

data2 的移位版本

有一个正偏移410。我想我只是不明白它是如何pd.shift()工作的,但我希望我可以用它pd.shift()来对齐我的数据集。据我了解,来自的返回correlate()告诉我我的数据集有多远,所以我应该能够使用 shift 来重叠它们。

4

2 回答 2

8

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)

这是输出:

在此处输入图像描述

于 2013-10-29T03:41:59.120 回答
4

@HYRY对您的答案的一个更正: 之间存在索引不匹配len(),从 1开始np.argmax(),从 0 开始。该行应为:

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

于 2017-03-15T21:26:14.670 回答