首页 > 解决方案 > Numpy 对象的时间序列聚类

问题描述

每一个想法或建议将不胜感激!我有几个“相同风格”的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() 参数必须是字符串或数字,而不是“时间戳”

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

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

结论

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

标签: pythonpandasnumpyscikit-learncluster-analysis

解决方案


(1) 你的第一个错误意味着Timestamp必须转换成字符串或数字。只需将它们转换为数字 by .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]]

推荐阅读