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

时间:2016-08-01 03:51:46

标签: python numpy interpolation

如果没有一些标准的库函数,我会感到震惊,尤其是在numpy或scipy中,但没有任何数量的Google搜索能够提供合适的答案。

我从Poloniex交换中获取数据 - 加密货币。可以把它想象成股票价格 - 买入和卖出订单 - 推送到你的电脑。所以我所拥有的是任何特定市场的价格时间序列。一个市场可能每天更新10次而另一个市场每分钟更新10次 - 这一切都取决于市场上有多少人在买卖。

所以我的时间序列数据最终会像:

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

第一列是时间值(我使用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,
 ...]

我想在任何合理的时间步骤中这样做。现在我使用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

1 个答案:

答案 0 :(得分:4)

对于您的问题,您可以使用scipy.interpolate.interp1d。它似乎能够做你想要的一切。如果指定kind="zero",则可以执行零阶保持插值。它还可以同时插入矩阵的多列。您只需指定相应的axis即可。然后f = interp1d(xData, yDataColumns, kind='zero', axis=0)将返回一个函数,您可以在插值范围内的任何点进行求值。然后,您可以通过调用f(np.linspace(start_time, end_time, time_step)来获取规范化数据。