【问题标题】:Python - Zero-Order Hold Interpolation (Nearest Neighbor)Python - 零阶保持插值(最近邻)
【发布时间】:2016-08-01 16:03:50
【问题描述】:

如果没有一些标准库函数,尤其是在 numpy 或 scipy 中,我会感到震惊,但没有多少谷歌搜索能提供一个像样的答案。

我正在从 Poloniex 交易所获取数据 - 加密货币。可以将其想象为将股票价格(买卖订单)推送到您的计算机。所以我所拥有的是任何给定市场的价格时间序列。一个市场可能每天更新 10 次,而另一个市场每分钟更新 10 次 - 这完全取决于市场上有多少人在买卖。

所以我的时间序列数据最终会是这样的:

[1 0.0003234,
 1.01 0.0003233,
 10.0004 0.00033,
 124.23 0.0003334,
 ...]

第 1 列是时间值(我使用 Unix 时间戳到微秒,但认为在示例中没有必要。第 2 列将是价格之一 - 买入或卖出价格。

我想要的是把它转换成一个矩阵,在这个矩阵中,数据在一个固定的时间范围内被“采样”。所以插值(零阶保持)矩阵将是:

[1 0.0003234,
 2 0.0003233,
 3 0.0003233,
 ...
 10 0.0003233,
 11 0.00033,
 12 0.00033,
 13 0.00033,
 ...
 120 0.00033,
 125 0.0003334,
 ...]

我想以任何合理的时间步长执行此操作。现在我使用np.linspace(start_time, end_time, time_step) 来创建新的时间向量。

编写我自己的、公认的粗略的零阶保持插值器不会那么难。我将遍历原始时间向量并使用 np.nonzero 查找新时间向量中适合一个时间戳 (t0) 和下一个时间戳 (t1) 之间的所有索引,然后用时间 t0 的值填充这些索引。

目前,粗略的方法将起作用。价格矩阵没有那么大。但我必须考虑使用其中一个内置库的更快方法。我就是找不到。

此外,对于上面的示例,我仅使用 Nx2 矩阵(第 1 列:时间,第 2 列:价格),但最终市场有 6 或 8 个可能会更新的不同参数。可以在不同列中处理多个价格等的方法/库函数会很棒。

Windows 7 上通过 Anaconda 的 Python 3.5(希望没关系)。

TIA

【问题讨论】:

    标签: python numpy interpolation


    【解决方案1】:

    对于您的问题,您可以使用scipy.interpolate.interp1d。它似乎可以为所欲为。如果您指定kind="zero",它可以进行零阶保持插值。它还可以同时插值矩阵的多列。您只需指定适当的axisf = interp1d(xData, yDataColumns, kind='zero', axis=0) 然后将返回一个函数,您可以在插值范围内的任何点进行评估。然后,您可以通过调用 f(np.linspace(start_time, end_time, time_step) 来获取标准化数据。

    【讨论】:

    • 因为我将数据存储为一个 numpy 矩阵,所以我需要稍微调整一下代码。具体来说 - f = interpolate.interp1d(np.asarray(a[:, 0])[:, 0], a[:, 1], kind='zero', axis=0) 其中 a 将是上面的示例数据。我遇到的唯一其他问题是 linspace 输出了一个行向量,因此我需要将其提供给 f 为 new_y = f(new_x.T) 其中 new_x 是 linspace 的输出。
    • 另外,感谢 interp1d 上的示例。我在谷歌搜索中看到了很多,但我从未见过任何关于 kind 参数的参考或示例。
    • @gabe 很高兴我能帮上忙!
    猜你喜欢
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 2012-04-24
    • 2011-11-10
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    相关资源
    最近更新 更多