求推荐可识别时间序列图重复形状的Python工具包(含指定匹配功能)
适合时间序列重复形状识别的Python工具包推荐
我推荐几个非常贴合你需求的Python工具包——它们都能帮你根据给定的子序列(指定起始索引和长度),找出时间序列中形状相似的重复模式,并返回它们的位置和尺寸信息:
1. tslearn(首选)
这是专门为时间序列分析设计的库,子序列匹配功能简直是为你的需求量身定做的。它内置了基于动态时间规整(DTW)的子序列搜索工具,既能高效计算序列相似度,又能轻松定位相似子序列的位置。
快速上手示例:
假设你有一个时间序列数组,目标子序列是从start_idx开始、长度为subseq_len的片段:
from tslearn.metrics import dtw_subsequence_path import numpy as np # 示例时间序列 time_series = np.array([1, 3, 2, 1, 3, 2, 4, 5, 4, 1, 3, 2]) start_idx = 0 subseq_len = 3 target_subseq = time_series[start_idx:start_idx+subseq_len] # 遍历所有可能的子序列,筛选相似项 similar_subseqs = [] for i in range(len(time_series) - subseq_len + 1): current_subseq = time_series[i:i+subseq_len] # 计算DTW距离(值越小越相似) dtw_dist, _ = dtw_subsequence_path(target_subseq, current_subseq) # 自定义相似度阈值,这里设为0.5 if dtw_dist < 0.5: similar_subseqs.append({ "start_index": i, "length": subseq_len, "dtw_distance": dtw_dist }) print("找到的相似子序列:", similar_subseqs)
tslearn还提供了更高效的批量搜索API,比如KNeighborsTimeSeries相关工具,适合处理大规模时间序列数据。
2. dtw-python
如果你需要对DTW算法有更精细的控制,dtw-python是个轻量又灵活的选择。它专注于DTW的底层实现,能精准计算两个序列的相似度,你可以基于它封装自己的子序列匹配逻辑。
示例片段:
from dtw import dtw import numpy as np time_series = np.array([1, 3, 2, 1, 3, 2, 4, 5, 4, 1, 3, 2]) target_subseq = time_series[0:3] subseq_len = len(target_subseq) similar_positions = [] for i in range(len(time_series) - subseq_len + 1): candidate = time_series[i:i+subseq_len] # 用欧氏距离作为DTW的局部距离度量 dist, _, _, _ = dtw(target_subseq, candidate, dist=lambda x, y: np.linalg.norm(x-y)) # 筛选距离小于0.3的相似子序列 if dist < 0.3: similar_positions.append({ "start_idx": i, "length": subseq_len, "similarity_score": 1/(1+dist) # 转换为0-1的相似度得分 }) print("相似子序列位置:", similar_positions)
3. Scikit-learn + 滑动窗口
如果你已经在使用scikit-learn的生态栈,可以结合滑动窗口提取子序列特征,再用相似度匹配(比如余弦相似度)来找到重复模式。这里可以用skimage.util.view_as_windows快速生成所有滑动窗口子序列:
示例:
from sklearn.metrics.pairwise import cosine_similarity from skimage.util import view_as_windows import numpy as np # 注意要把时间序列转成二维数组(适配scikit-learn的输入格式) time_series = np.array([1, 3, 2, 1, 3, 2, 4, 5, 4, 1, 3, 2]).reshape(-1, 1) subseq_len = 3 target_subseq = time_series[0:3] # 生成所有滑动窗口子序列 windows = view_as_windows(time_series, window_shape=(subseq_len, 1), step=1).squeeze() # 计算目标子序列与所有窗口的余弦相似度 similarities = cosine_similarity(target_subseq.T, windows.T)[0] # 筛选相似度高于0.95的子序列 threshold = 0.95 similar_indices = np.where(similarities >= threshold)[0] similar_results = [{"start_index": idx, "length": subseq_len, "similarity": sim} for idx, sim in zip(similar_indices, similarities[similar_indices])] print("相似子序列:", similar_results)
选择建议:
- 如果你是做专业时间序列分析,优先选tslearn,它封装了大量现成工具,能帮你少写很多重复代码。
- 若需要对DTW算法进行定制化调整,dtw-python会更灵活。
- 如果你已经在使用scikit-learn,第三种方法可以无缝融入你的现有工作流。
内容的提问来源于stack exchange,提问作者Rob




