如何在Pandas中对两个时间序列进行偏移匹配并计算相似度
实现方案
下面分两种适配不同场景的实现方式:
方案1:互相关法计算固定滞后量(适用于两个序列仅存在整体偏移、无局部时序拉伸/压缩的场景)
该方案计算速度最快,70万数据量可在秒级完成计算。
步骤1:数据预处理
首先提取given的有效非空片段,同时对两个序列做z-score标准化消除幅值差异影响:
import pandas as pd import numpy as np from scipy.signal import correlate, correlation_lags # 模拟数据构造 df = pd.DataFrame( {"measured": [20, 20, 9.8, 10.1, 4.8, 4.9, 9.7, 9.9, 2.9, 3.0, 3.1, 10.1, 10.0, 20, 20], "given": [np.nan, 10, 10, 5, 5, 10, 10, 3, 3, 3, 10, 10, np.nan, np.nan, np.nan]}, index=pd.date_range("2018-01-01", periods=15, freq="s") ) # 提取given有效序列 given_valid = df["given"].dropna().values # 提取measured全序列 measured_full = df["measured"].values # 标准化 def z_score(arr): return (arr - arr.mean()) / arr.std() given_std = z_score(given_valid) measured_std = z_score(measured_full)
步骤2:计算互相关与最优滞后
# 计算互相关 corr = correlate(measured_std, given_std, mode="valid") # 计算对应的滞后量(单位为采样点间隔,此处为1秒) lags = correlation_lags(len(measured_std), len(given_std), mode="valid") # 找到最大相关值对应的最优滞后 max_corr_idx = np.argmax(corr) best_lag = lags[max_corr_idx] best_similarity = corr[max_corr_idx] print(f"最优滞后量:{best_lag}秒") print(f"最优相似度(归一化相关系数):{best_similarity:.3f}")
对模拟数据运行后可得到最优滞后为1秒,相关系数接近1,符合数据特征。
方案2:动态时间规整(DTW)(适用于序列存在局部时序拉伸/压缩的场景)
普通DTW时间复杂度为O(n*m)不适合大数据量,可使用fastdtw库实现线性时间复杂度计算,70万数据量可在分钟级完成:
依赖安装
pip install fastdtw scipy
实现代码
from fastdtw import fastdtw from scipy.spatial.distance import euclidean # 计算DTW距离与匹配路径 distance, path = fastdtw(given_std, measured_std, dist=euclidean) # 计算平均滞后量 lags = [y - x for x, y in path] avg_lag = np.mean(lags) print(f"DTW距离(越小相似度越高):{distance:.3f}") print(f"平均滞后量:{avg_lag:.1f}秒")
path变量存储了两个序列的逐点匹配关系,可直接用于后续对齐操作。
内容的提问来源于stack exchange,提问作者V.Hunon
相关产品推荐
相关产品推荐

