在Python(或Excel)中同步数据

我经常使用Python(偶尔Excel)来处理和比较多个实验之间的testing数据。 在某些情况下,数据可能不同步,这使得直接比较困难。 例如,典型的testing规范是:

1) Stabilize test temperature to a value of 20 +/- 2 degrees C 2) Hold test temperature at stabilized value for 15-25 seconds 3) Increase temperature by 20 degrees C at a rate of 0.5 degree C/second 

对数据进行归一化是非常简单的,因此它们在时间= 0秒时都以20℃的标称温度值开始,但是我真正想要的是同步数据,使得温度斜坡同时开始。

我已经尝试了简单的algorithm来检查数据的斜率,以确定何时开始温度boost,但由于仪器导致的测量结果的局部波动导致的斜率实际上并不能反映整体温度变化率。

在Numpy,Scipy,Pandas等有function可以过滤掉这些局部波动,并确定何时实际开始增加温度。

我偶尔会在Excel中工作,所以如果在电子表格中有更方便的方法,我可以使用Excel来处理数据。

任何build议,将不胜感激。

有很多方法可以解决这个问题。 首先想到的是数值区分数据,并寻找从0到0.5的斜率跳跃。 但是(正如你所观察到的)嘈杂的数据可以防止这个工作正常。 如果你谷歌的“噪声数据的数值差异”,你会发现很多关于这个主题的研究,但我不知道任何现成的Python库。 您可以使用Savitzky-Golayfilter取得一些进展: scipy.signal.savgol_filter

然而,这种方法可能是过度的,因为你的信号有一个非常简单和特定的预期结构:一个恒定的间隔,然后是一个斜坡,然后是另一个常数。 你可能会发现scipy.optimize.curve_fit可以正常工作。 这是一个例子:

 from __future__ import division import numpy as np from scipy.optimize import curve_fit import matplotlib.pyplot as plt def ramp(t, temp_init, temp_final, t0, t1): slope = (temp_final - temp_init) / (t1 - t0) y = temp_init + np.minimum(slope * np.maximum(t - t0, 0.0), temp_final - temp_init) return y np.random.seed(123) dt = 0.5 t = np.arange(0, 100, dt) # Generate a sample to work with. temp_init = 20.0 + np.random.randn() temp_final = 40.0 + np.random.randn() t0 = 25.0 t1 = t0 + 40 y = ramp(t, temp_init, temp_final, t0, t1) y += 0.25*np.random.randn(*t.shape) # Add noise. # Create an initial guess for the four parameters and use curve_fit # to fit the ramp function to the sample. T = t[-1] - t[0] p0 = (20, 40, t[0] + 0.333*T, t[0] + 0.667*T) popt, pcov = curve_fit(ramp, t, y, p0=p0) fit_temp_init, fit_temp_final, fit_t0, fit_t1 = popt print " Input Fit" print "temp_init %6.2f %6.2f" % (temp_init, fit_temp_init) print "temp_final %6.2f %6.2f" % (temp_final, fit_temp_final) print "t0 %6.2f %6.2f" % (t0, fit_t0) print "t1 %6.2f %6.2f" % (t1, fit_t1) plt.plot(t, y, 'ro', alpha=0.15) plt.plot(t, ramp(t, popt[0], popt[1], popt[2], popt[3]), 'k-', linewidth=1.5) plt.grid(True) plt.xlabel('t', fontsize=12) plt.show() 

这会产生输出:

  Input Fit temp_init 18.91 18.91 temp_final 41.00 40.99 t0 25.00 24.85 t1 65.00 65.09 

和情节:

适合坡道