การซิงโครไนซ์ข้อมูลใน Python (หรือ Excel)

ฉันใช้ 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

การทำข้อมูลให้เป็นมาตรฐานนั้นตรงไปตรงมาเพื่อให้ทั้งคู่เริ่มต้นด้วยค่าอุณหภูมิปกติที่ 20 C ณ เวลา = 0 วินาที แต่สิ่งที่ฉันต้องการจริงๆ คือการซิงโครไนซ์ข้อมูลเพื่อให้ระดับอุณหภูมิเริ่มต้นในเวลาเดียวกัน

ฉันได้ลองใช้อัลกอริธึมง่ายๆ เพื่อตรวจสอบความชันของข้อมูลเพื่อระบุว่าอุณหภูมิที่เพิ่มขึ้นเริ่มต้นขึ้นเมื่อใด แต่ความผันผวนในท้องถิ่นในการวัดเนื่องจากเครื่องมือวัดส่งผลให้เกิดความชันที่ไม่สะท้อนถึงอัตราการเปลี่ยนแปลงของอุณหภูมิโดยรวมจริงๆ

มีฟังก์ชันใน Numpy, Scipy, Pandas ฯลฯ ที่สามารถกรองความผันผวนในท้องถิ่นเหล่านี้และระบุเมื่ออุณหภูมิเริ่มเพิ่มขึ้นจริงหรือไม่

ฉันทำงานใน Excel เป็นครั้งคราว ดังนั้นหากมีวิธีที่สะดวกกว่าในการดำเนินการนี้ในสเปรดชีต ฉันสามารถใช้ Excel เพื่อประมวลผลข้อมูลได้

ข้อเสนอแนะใด ๆ ที่จะได้รับการชื่นชม


person user3818634    schedule 03.08.2014    source แหล่งที่มา
comment
แนวคิดสองสามประการ: (1) กรองข้อมูลของคุณ การบิดด้วย G. kernel อาจจะเพียงพอ แต่เล่นกับขนาดเคอร์เนล (2) พยายามสร้างการถดถอยเชิงเส้นของข้อมูลของคุณ ออฟเซ็ตจุดเริ่มต้นของการถดถอยของคุณ ออฟเซ็ตจากความชันที่จะคงที่คือจุดเริ่มต้นของทางลาดของคุณ   -  person rth    schedule 03.08.2014
comment
ฉันไม่แน่ใจว่าฉันเข้าใจ (2) อย่างไรก็ตาม ฉันได้ทดลองกับการถดถอยเชิงเส้นแล้ว เนื่องจากหลังจากถึงอุณหภูมิสูงสุดแล้วจะมีการหน่วงเวลา 20-30 วินาที ความชันของเส้นการถดถอยจึงไม่มีความหมาย วิธีการที่คุณแนะนำถือว่าการทดสอบหยุดลงหลังจากเพิ่มขึ้นถึง 20 องศาหรือไม่   -  person user3818634    schedule 03.08.2014
comment
ถ้าคุณจะใช้เฉพาะข้อมูลบางส่วนเป็นเวลา 15-20 วินาทีในการวิเคราะห์การถดถอย ที่อุณหภูมิทดสอบค้างไว้ที่ค่าคงที่เป็นเวลา 15-25 วินาที ความชันจะอยู่ที่ศูนย์ จากนั้นมันก็เพิ่มขึ้น เมื่อถึงความชันจริงของคุณ 0.5 C / วินาที ไม่มีการเก็บข้อมูลการถดถอยหาง .... อาจเป็นเพราะฉันไม่เข้าใจปัญหาของคุณ คุณช่วยแบ่งปันตัวอย่างได้ไหม?   -  person rth    schedule 03.08.2014
comment
ข้อมูลมีเสียงดังแค่ไหน? คุณสามารถโพสต์ตัวอย่างทั่วไปได้หรือไม่?   -  person Warren Weckesser    schedule 03.08.2014


คำตอบ (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

และโครงเรื่อง:

พอดีทางลาด

person Warren Weckesser    schedule 04.08.2014