【问题标题】:Time Series Clustering of Numpy ObjectsNumpy 对象的时间序列聚类
【发布时间】:2021-02-01 17:44:26
【问题描述】:

我们将不胜感激每一个想法或建议!我有几个“相同风格”的 numpy 对象(u1,u2,u3...),每个对象都是:

对象 1:

   [[Timestamp('2004-02-28 00:59:16'), 19.9884],
   [Timestamp('2004-02-28 01:03:16'), 19.3024],
   ...
   [Timestamp('2004-02-28 01:06:16'), 19.1652]]

对象 2:

   [[Timestamp('2004-02-28 01:08:17'), 19.567],
   [Timestamp('2004-02-28 01:10:16'), 19.5376],
    ...
   [Timestamp('2004-02-28 01:26:47'), 19.4788]]

我想通过聚类来找出这些对象中的哪些在时间序列中具有相同的“趋势”。我尝试了几种方法,包括:

from sklearn.neighbors import NearestNeighbors
X = np.array([u1, u2, u3])
nbrs = NearestNeighbors(n_neighbors=2, algorithm='ball_tree').fit(X)
distances, indices = nbrs.kneighbors(X)
print(distances)

我的一些错误:

TypeError: float() 参数必须是字符串或数字,而不是 'Timestamp'

ValueError: 使用序列设置数组元素。

TypeError:只有 size-1 的数组可以转换为 Python 标量

结论

至少有人可以给我一个建议我该怎么做。谢谢!

【问题讨论】:

    标签: python pandas numpy scikit-learn cluster-analysis


    【解决方案1】:

    (1) 您的第一个错误意味着Timestamp 必须转换为字符串或数字。只需通过.value 将它们转换为数字,这意味着自 Unix 纪元时间 (1970-01-01) 以来的纳秒。列表中的操作:

    u1 = list(map(lambda el: (el[0].value / 1e9, el[1]), u1))
    u2 = list(map(lambda el: (el[0].value / 1e9, el[1]), u2))
    ...
    

    (2) np.array([u1, u2, u3]) 生成 3D 数组,而不是通常预期的 2D。这可能是第二个错误的原因(期望一个数字,但由于冗余维度而得到一个序列)。将其替换为以下之一:

    X = np.array(u1 + u2 + ...)  # for lists
    X = pd.concat([u1, u2, ...], axis=0)  # for dataframes
    

    修改后的代码可以运行。使用您的样本数据输出:

    [[  0.         240.00098041]
     [  0.         180.00005229]
     [  0.         121.00066712]
     [  0.         119.00000363]
     [  0.         119.00000363]
     [  0.         991.00000174]]
    

    【讨论】:

    • 谢谢,这解决了我的错误,我采取了不同的方法,重新采样了我的数据,只记录了温度,我为每个人制作了 [19.4333, 19.23111 ...] 类型的列表(删除时间戳)目的。然后再次执行 numpy obj -> 以相同方式计算 knn。这给了我一个不同对象之间相似性的矩阵-> 这就是我要找的。谢谢!看:stackoverflow.com/questions/58358110/…
    猜你喜欢
    • 2018-05-18
    • 2016-04-28
    • 2015-07-22
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 2012-02-27
    • 2015-04-02
    相关资源
    最近更新 更多