【问题标题】:Summing time series after k-means clusteringk-means聚类后的时间序列求和
【发布时间】:2020-10-23 20:52:31
【问题描述】:

我正在使用时间序列数据尝试 K 均值聚类中 K 的不同变体。 对于每个实验,我想总结每个集群标签的时间序列并对其进行预测。

例如: 如果我将时间序列聚类为 3 个聚类,我想对属于聚类 1 的所有时间序列(按列)和属于聚类 2 的所有时间序列求和,对于聚类 3 也是如此。之后我将对每个聚合的时间序列集群,但我不需要预测部分的帮助。

我正在考虑将集群标签添加到原始数据框中,然后使用 .loc 和循环来提取与相同集群相对应的时间序列。但是我想知道是否有更有效的方法?

import pandas as pd
from datetime import datetime
import numpy as np
from sklearn.cluster import KMeans

#create dataframe with time series
date_rng = pd.date_range(start='1/1/2018', end='1/08/2018', freq='H')
df = pd.DataFrame(date_rng, columns=['date'])
for i in range(20):1
    df['ts' + str(i)] = np.random.randint(0,100,size=(len(date_rng)))
df_pivot = df.pivot_table(columns = 'date', values = df.columns)

#cluster
K = range(1,10,2)
for k in K:
    km = KMeans(n_clusters=k)
    km = km.fit(df_pivot)

    print(km.labels_)

    #sum/aggregate all ts in each cluster column-wise


    #forecast next step for each cluster(dont need help with this part)

`

【问题讨论】:

    标签: python dataframe time-series k-means


    【解决方案1】:

    您可以访问每个集群的数据点,然后对它们的值求和。 像这样的:

    labels = km.labels_
    centroids = km.cluster_centers_
    cluster_sums_dict = {} # cluster number: sum of elements
    for i in range(k):
       # select 
       temp_cluster = df_pivot[np.where(labels==i)]
       cluster_sums_dict[i] = temp_cluster['ts'].sum() 
    

    顺便说一句,您可以使用每个集群的质心来进行预测,而不是聚合一个 cluster_values 吗?

    【讨论】:

    • 由于是时间戳,代码无法运行。对于您的旁注,不幸的是不,我需要集群值的总和
    • 您需要从某个旧日期中减去所有时间戳,并将时间转换为分钟/秒 (datetime.utcnow()-datetime.fromtimestamp(0)).total_seconds()
    猜你喜欢
    • 2015-04-11
    • 2011-03-31
    • 2020-08-28
    • 2016-05-29
    • 2011-08-13
    • 2013-08-08
    • 2013-02-14
    • 2018-01-14
    • 2018-11-11
    相关资源
    最近更新 更多