【问题标题】:numpy time series data - vectorized fill gaps and calculate deltasnumpy 时间序列数据 - 矢量化填充间隙并计算增量
【发布时间】:2017-05-10 14:45:31
【问题描述】:

我已经使用 genfromtxthstack 从 csv 中读取了一些数据以连接数据,从而形成 (5413260,) 的形状(大约需要 17 分钟,~1GB .npy 保存文件)

数据格式为:

timedelta64 1, temp1A, temp 1B, temp1C, ...
timedelta64 2, temp2A, temp 2B, temp2C, ...


>>> data[1:3]
array([ ('2009-01-01T18:41:00', 755, 855, 755, 855, 743, 843, 743, 843, 2),
       ('2009-01-01T18:43:45', 693, 793, 693, 793, 693, 793, 693, 793, 1)],
      dtype=[('datetime', '<M8[s]'), ('sensorA', '<u4'), ('sensorB', '<u4'), ('sensorC', '<u4'), ('sensorD', '<u4'), ('sensorE', '<u4'), ('sensorF', '<u4'), ('sensorG', '<u4'), ('sensorH', '<u4'), ('signal', '<u4')])

我想对 temps 做增量:

timedelta64 1, temp1A - temp1B, temp 1B - temp1C, ...

并填充:

timedelta64 2 - timedelta64 1

timedelta64 1 + shift, 0, 0, 0, CONSTANT, ...

我现在是:

  1. 遍历 numpy arrayA (arrayA[i], arrayA[i+1])
  2. 计算 row_i 的增量,追加到 numpy arrayB
  3. 计算row_i+1和row_i的时间差
  4. 迭代添加到时间戳,用零/常量填充,追加到 numpy arrayB

这是非常低效的 - 到目前为止已经花费了 12 多个小时,我预计需要 100 多天才能完成。

什么是矢量化方法?

我正在考虑一个向量操作来首先计算增量,然后我不确定如何快速批处理并插入缺失时间戳的填充。

另外,reshape -> diff -> fill 或 reshape -> fill -> diff 是否更快?

除此之外:这是用于使用 TensorFlow 进行机器学习的数据预处理,有没有比 numpy 更好的工具?

【问题讨论】:

    标签: python arrays numpy tensorflow


    【解决方案1】:

    由于我使用的是genfromtxt 和异构dtypes,因此矢量化操作是通过命名列完成的:to slice columns in a tuple present in a numpy array

    生成一个numpy.datetime64的范围:How can I make a python numpy arange of datetime

    在 numpy 中连接大数组很慢,最好使用预分配数组并使用切片填充:How to add items into a numpy array

    然后如何根据匹配的 datetime64 合并两个结构化/记录数组并屏蔽相应的字段。可以在这里找到:Compare two numpy arrays by first Column and create a third numpy array by concatenating two arrays

    总体加速看起来像 100 多天 =>

    【讨论】:

    • 这似乎不是一个答案。有关您的问题的其他信息应添加到问题本身。
    • 它最肯定的答案是复制和粘贴我的数据独有的所有代码。我希望我在这里收集的信息对其他刚接触 numpy 的人在预处理时间序列数据时遇到困难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    相关资源
    最近更新 更多