You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 16:31:16