Python - 零阶保持插值(最近邻)

Gab*_*lin 3 python interpolation numpy

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

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

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

[1 0.0003234,
 1.01 0.0003233,
 10.0004 0.00033,
 124.23 0.0003334,
 ...]
Run Code Online (Sandbox Code Playgroud)

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

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

[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,
 ...]
Run Code Online (Sandbox Code Playgroud)

我想以任何合理的时间步长来做到这一点。现在我np.linspace(start_time, end_time, time_step)用来创建新的时间向量。

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

现在,粗略的方法会奏效。价格矩阵并不是那么大。但是我必须考虑使用其中一个内置库的更快方法。我就是找不到。

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

Python 3.5 通过 Windows 7 上的 Anaconda(希望无关紧要)。

TIA

jot*_*asi 5

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