Я пытаюсь взаимно коррелировать температурный сигнал с сигналом деформации.Я хочу получить временную задержку между двумя сигналами, а затем сдвинуть температурный сигнал во времени, чтобы я мог использовать его дальше для PCA.
Проблема в том, что я сделал взаимную корреляцию и все, но сигнал со смещенной температурой не имеет никакого эффекта, он такой же, как и у коррелированного сигнала.
Вы можете загрузить набор данных здесь: http://www.mediafire.com/file/r7dg7i9dacvpl2j/curve_fitting_ahmed.xlsx/file Вы можете посмотреть на цифры
Первый сигнал - это сдвинутый сигнал, я полагаю
Последний ACF - это взаимно коррелированный сигнал
df = pd.read_excel(file_path, skip_blank_lines=False, skiprows=1)
def process_data_time_delay(temperature, strain, df):
from scipy import signal
# normalization before ACF
def normalize(data):
return (data - np.mean(data, axis=0).reshape((1, -11))) / (np.std(data, axis=0).reshape((1, -1)))
# select subset of columns, seems relevant as a group
SCOLS = ['T1', 'W_A1']
# just to see the data
f = plt.figure()
ax = f.add_subplot(111)
df[SCOLS[:2]].iloc[::10].plot(ax=ax)
ax.set_title('Raw data')
# normalization
normalized = normalize(df[SCOLS].values)
f = plt.figure()
ax = f.add_subplot(111)
ax.plot(np.arange(normalized.shape[0]), normalized[:, 0], label='TW_A1')
ax.plot(np.arange(normalized.shape[0]), normalized[:, 1], label='W_A1')
ax.set_title('Normalized')
# ACF between two components
x1x2 = np.correlate(normalized[:, 0], normalized[:, 1], 'full')
# see the results
f = plt.figure()
ax = f.add_subplot(111)
ax.plot(x1x2)
ax.set_title('ACF')
df['TIMESTAMP'] = pd.to_datetime(df['TIMESTAMP'])
peaks_indices = signal.find_peaks_cwt(array(x1x2).flatten(), np.arange(1,10))
print(peaks_indices)
delta_index = np.argmax(peaks_indices);
print(delta_index)
delta_time = df['TIMESTAMP'][delta_index] - df['TIMESTAMP'][0]
# assuming timestamps is a datetime64 numpy array that can be easily obtained from pandas;
shifted_signal = x1x2[delta_index:]
f = plt.figure()
ax = f.add_subplot(111)
ax.plot(shifted_signal)
# mainloop
plt.show()
return x1x2