Menyinkronkan Data dengan Python (atau Excel)

Saya sering menggunakan Python (dan terkadang Excel) untuk memproses dan membandingkan data pengujian antara beberapa eksperimen. Dalam beberapa kasus, data mungkin tidak sinkron sehingga membuat perbandingan langsung menjadi sulit. Misalnya, spesifikasi pengujian umumnya adalah:

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

Sangat mudah untuk menormalkan data sehingga keduanya dimulai dengan nilai suhu nominal 20 C pada waktu = 0 detik, tetapi yang sebenarnya saya inginkan adalah menyinkronkan data sehingga kenaikan suhu dimulai pada waktu yang sama.

Saya telah mencoba algoritme sederhana untuk memeriksa kemiringan data guna mengidentifikasi kapan kenaikan suhu dimulai, namun fluktuasi lokal dalam pengukuran akibat instrumentasi menghasilkan kemiringan yang tidak mencerminkan laju perubahan suhu secara keseluruhan.

Apakah ada fungsi di Numpy, Scipy, Pandas, dll. yang dapat menyaring fluktuasi lokal ini dan mengidentifikasi kapan suhu sebenarnya mulai meningkat.

Saya kadang-kadang bekerja di Excel jadi jika ada cara yang lebih nyaman untuk melakukan ini dalam spreadsheet saya bisa menggunakan Excel untuk memproses data.

Setiap saran akan dihargai.


person user3818634    schedule 03.08.2014    source sumber
comment
beberapa ide: (1) memfilter data Anda, konvolusi dengan kernel G. mungkin cukup, tetapi mainkan dengan ukuran kernel. (2) cobalah membuat regresi linier pada data Anda; offset awal regresi Anda, offset dari kemiringan mana yang akan konstan adalah awal tanjakan Anda.   -  person rth    schedule 03.08.2014
comment
Saya tidak yakin saya mengerti (2). Saya telah bereksperimen dengan regresi linier, namun karena ada jeda 20-30 detik setelah suhu maksimum tercapai, kemiringan garis regresi tampaknya tidak berarti. Apakah metode yang Anda sarankan mengasumsikan bahwa tes dihentikan setelah kenaikan 20 derajat tercapai?   -  person user3818634    schedule 03.08.2014
comment
baik jika Anda hanya menggunakan sebagian data selama 15-20 detik untuk analisis regresi, pada data di mana Anda menahan suhu pengujian pada nilai stabil selama 15-25 detik, kemiringannya akan nol. Kemudian meningkat. ketika mencapai kemiringan sebenarnya 0,5 C/detik, tidak ada data regresi yang ditahan.... mungkin saya tidak mengerti masalah Anda. Bisakah Anda membagikan contohnya?   -  person rth    schedule 03.08.2014
comment
Seberapa berisik datanya? Bisakah Anda memposting contoh tipikal?   -  person Warren Weckesser    schedule 03.08.2014


Jawaban (1)


Ada banyak cara untuk melakukan pendekatan ini. Hal pertama yang terlintas dalam pikiran adalah membedakan data secara numerik, dan mencari lompatan kemiringan dari 0 hingga 0,5. Namun (seperti yang Anda amati) data yang berisik dapat mencegah hal ini berfungsi dengan baik. Jika Anda mencari di Google untuk "diferensiasi numerik dari data yang berisik", Anda akan menemukan banyak penelitian tentang topik ini, tetapi saya tidak mengetahui adanya perpustakaan siap pakai dengan python. Anda mungkin dapat membuat beberapa kemajuan menggunakan filter Savitzky-Golay: scipy.signal.savgol_filter.

Namun, pendekatan tersebut mungkin berlebihan, karena sinyal Anda memiliki struktur yang diharapkan sangat sederhana dan spesifik: interval konstan diikuti oleh tanjakan, lalu konstanta lainnya. Anda mungkin menemukan bahwa scipy.optimize.curve_fit berfungsi dengan baik untuk ini. Berikut ini contohnya:

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()

Ini menghasilkan output:

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

dan alur ceritanya:

fit ramp

person Warren Weckesser    schedule 04.08.2014