如何将KMeans聚类结果映射到原始时间序列并分色绘制?
问题:滑动序列聚类标签映射到原始时间序列并可视化
原始时间序列数据
Close 2018-01-01 66.659485 2018-01-02 66.659485 2018-01-03 65.877713 2018-01-04 66.791399 2018-01-05 67.968765 2018-01-06 96.900002 2018-01-07 96.900002 2018-01-08 96.900002 2018-01-09 96.349998 2018-01-10 95.519997
3天滑动窗口序列
Col_0 Col_1 Col_2 0 66.659485 66.659485 65.877713 1 66.659485 65.877713 66.791399 2 65.877713 66.791399 67.968765 3 66.791399 67.968765 96.900002 4 67.968765 96.900002 96.900002 5 96.900002 96.900002 96.900002 6 96.900002 96.900002 96.349998
带聚类标签的滑动窗口数据
Col_0 Col_1 Col_2 Cluster 0 66.659485 66.659485 65.877713 0 1 66.659485 65.877713 66.791399 0 2 65.877713 66.791399 67.968765 1 3 66.791399 67.968765 96.900002 0 4 67.968765 96.900002 96.900002 1 5 96.900002 96.900002 96.900002 0 6 96.900002 96.900002 96.349998 0
如何将这些聚类标签映射到原始时间序列,并用不同颜色绘制该时间序列?尝试转置操作未成功。
解决方案
1. 标签映射逻辑
滑动窗口的每个聚类标签,默认对应原始序列中窗口的结束时间点(比如第0个窗口对应2018-01-03,第1个对应2018-01-04,以此类推)。对于原始序列中前n-1个点(n=3时是前2个),可按需选择:
- 设为
NaN不标记 - 用第一个窗口的标签填充
- 单独规则处理
如果要给窗口内所有点标记,由于窗口重叠,同一个点会被多个窗口覆盖,通常取最后覆盖该点的窗口标签作为最终标签。
2. 代码实现(Python + Pandas + Matplotlib)
步骤1:构造原始数据与标签数据
import pandas as pd import matplotlib.pyplot as plt # 原始时间序列数据 raw_data = pd.DataFrame( {'Close': [66.659485, 66.659485, 65.877713, 66.791399, 67.968765, 96.900002, 96.900002, 96.900002, 96.349998, 95.519997]}, index=pd.date_range(start='2018-01-01', periods=10) ) # 聚类标签(对应滑动窗口的顺序) cluster_labels = [0, 0, 1, 0, 1, 0, 0] window_size = 3
步骤2:映射标签到原始数据
方式1:标签对应窗口结束点
# 创建标签列,初始为None raw_data['Cluster'] = None # 每个窗口标签对应原始数据的第i+window_size-1个位置(窗口结束点) for i, label in enumerate(cluster_labels): raw_data.iloc[i + window_size - 1, raw_data.columns.get_loc('Cluster')] = label # 可选:填充前window_size-1个点的标签(用第一个窗口标签) raw_data['Cluster'].fillna(cluster_labels[0], inplace=True)
方式2:标签覆盖窗口内所有点(取最后覆盖的标签)
raw_data['Cluster'] = None for i, label in enumerate(cluster_labels): # 给当前窗口覆盖的所有点标记标签 raw_data.iloc[i:i+window_size, raw_data.columns.get_loc('Cluster')] = label
步骤3:按聚类标签绘制时间序列
plt.figure(figsize=(10, 6)) # 按聚类标签分组绘制 for cluster in raw_data['Cluster'].unique(): subset = raw_data[raw_data['Cluster'] == cluster] plt.plot(subset.index, subset['Close'], marker='o', label=f'Cluster {cluster}') plt.xlabel('Date') plt.ylabel('Close Price') plt.title('Time Series Colored by Cluster Labels') plt.legend() plt.xticks(rotation=45) plt.tight_layout() plt.show()
3. 关键说明
- 滑动窗口索引与原始数据索引的对应关系是核心,标签映射的位置可根据业务需求调整(比如窗口中点、起始点)。
- 重叠窗口的标签冲突,优先取最后覆盖点的标签是最常用的处理方式,也可结合聚类置信度选择最优标签。
内容的提问来源于stack exchange,提问作者Ernesto Lopez Fune
相关产品推荐
相关产品推荐

