如果没有一些标准的库函数,我会感到震惊,尤其是在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
答案 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)
来获取规范化数据。