【问题标题】:Synchronizing Data in Python (or Excel)在 Python(或 Excel)中同步数据
【发布时间】:2014-09-25 22:11:13
【问题描述】:

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

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 C 的标称温度值开始,但我真正想要的是同步数据,以便温度斜坡同时开始。

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

Numpy、Scipy、Pandas 等中是否有可以过滤掉这些局部波动并识别温度何时真正开始升高的功能。

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

任何建议将不胜感激。

【问题讨论】:

  • 几个想法:(1)过滤你的数据,用 G. 内核卷积可能就足够了,但要使用内核大小。 (2) 尝试对您的数据进行线性回归;回归的偏移开始,斜率恒定的偏移是斜坡的开始。
  • 我不确定我是否理解 (2)。然而,我已经尝试过线性回归,因为在达到最高温度后有 20-30 秒的保持时间,回归线的斜率似乎没有意义。您建议的方法是否假设在达到 20 度增加后停止测试?
  • 如果您只使用零件数据进行 15-20 秒的回归分析,那么在“将测试温度保持在稳定值 15-25 秒”的数据处,斜率将为零。然后它增加。当它达到您的实际斜率 0.5 C/秒时,回归数据中没有保留的尾巴....可能是我不明白您的问题。你能分享一个例子吗?
  • 数据的噪音有多大?你能发布一个典型的样本吗?

标签: python excel numpy pandas scipy


【解决方案1】:

有很多方法可以解决这个问题。首先想到的是对数据进行数值区分,并寻找从 0 到 0.5 的斜率的跳跃。但是(正如您所观察到的)嘈杂的数据会阻止它正常工作。如果您在 Google 上搜索“噪声数据的数值微分”,您会发现很多关于此主题的研究,但我不知道 python 中有任何现成的库。您或许可以使用 Savitzky-Golay 过滤器取得一些进展: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

还有剧情:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 2017-02-06
    • 2012-07-06
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多