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

3

如果在numpy或scipy中没有一些标准库函数来处理这个问题,我会感到惊讶,但是无论我如何搜索都找不到一个合适的答案。

我从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)创建新的时间向量。
编写自己的,虽然粗糙但很实用的0阶保持插值器不会很难。我将循环遍历原始时间向量,并使用np.nonzero查找所有符合一个时间戳(t0)和下一个(t1)之间的新时间向量中的索引,然后使用来自时间t0的值填充这些索引。
就目前而言,这种粗略的方法有效。价格矩阵并不是很大。但我必须考虑是否有一种更快的方法可以使用其中一个内置库。只是我找不到它。
此外,对于上述示例,我只使用Nx2的矩阵(列1:时间,列2:价格),但最终市场有6或8个不同的参数可能需要更新。能够处理不同列中的多个价格等的方法/库函数将是很好的选择。
Python3.5通过Windows7的Anaconda安装(希望没有影响)。
1个回答

6

针对您的问题,您可以使用scipy.interpolate.interp1d方法。它看起来可以完成您想要的所有操作。如果您指定kind="zero",它能够执行零阶保持插值。它还可以同时插值矩阵的多个列。您只需指定相应的axis即可。

f = 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的输出。 - Gabe Spradlin
此外,感谢有关interp1d的示例。我在Google搜索中看到了很多,但从未看到过任何有关kind参数的参考或示例。 - Gabe Spradlin
@gabe 很高兴我能帮到你! - jotasi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接