python - 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 标量
结论
至少有人可以给我一个建议我该怎么做。谢谢!
解决方案
(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]]
推荐阅读
- python - 在 Anaconda 中运行 matplotlib 时出错
- r - 计算条件累积和
- python - 如果有“显示更多”按钮,如何从网站上抓取信息?
- r - 机器学习项目:在探索性数据分析之前或之后拆分训练/测试集?
- c# - Console.WriteLine() 输出截断消息或顺序错误/不完整
- javascript - setInterval 有效但延迟了一个周期
- database - mongodb 按名称聚合组并显示每个名称的平均金额
- java - android studio 从 php 数据库中获取数据并填充活动
- javascript - 仅使用 Javascript 创建模态面板
- r - 使用 R 中从 amelia 或小鼠创建的插补模型获取新数据