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