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

标签 python numpy interpolation

如果没有为此特别是在 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

最佳答案

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

关于Python - 零阶保持插值(最近邻),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38690747/

相关文章:

matlab - 如何在matlab中进行极坐标插值

flash - 将 alpha 值添加到双线性调整大小算法

Python POST 请求,无需重新加载页面

python - 我该如何压缩循环,否则

python - 有没有办法让这个 numpy 数组操作更快?

python - numpy 中的 3d 矩阵乘法

c - 尝试将 SDL_Surface 的大小加倍严重失败

python - SymPy 无法正确呈现多字符下标

python - pandas 对重复值进行排名

python - 检查 pandas 中的 'None' 值时排除 'NaN'