2016-08-01 40 views
3

如果沒有一些標準的庫函數,特別是在numpy或scipy中,但沒有任何Google搜索提供正確的答案,我會感到震驚。Python - 零級保持插值(最近鄰居)

我從Poloniex交換 - cryptocurrency獲取數據。把它看作是把股票價格 - 買入和賣出訂單 - 推到你的電腦上。所以我所擁有的是任何特定市場的時間價格。一個市場可能每天更新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個可能更新的不同參數。一個方法/庫函數可以處理多個價格,並且在不同的列中會很好。

Python 3.5通過Windows 7上的蟒蛇(希望無所謂)。

TIA

回答

4

對於你的問題,你可以使用scipy.interpolate.interp1d。它似乎能夠做你想要的一切。如果您指定kind="zero",它可以執行零階保持插值。它也可以同時內插多列矩陣。您只需指定相應的axis即可。然後f = interp1d(xData, yDataColumns, kind='zero', axis=0)將返回一個函數,您可以在插值範圍內的任意點處評估該函數。然後,您可以致電f(np.linspace(start_time, end_time, time_step)來獲取標準化數據。

+0

因爲我將數據存儲爲一個numpy矩陣,所以我需要稍微調整一下代碼。具體來說,'''''''= f = interpolate.interp1d(np.asarray(a [:,0])[:,0],a [:, 1],kind ='zero',axis = 0)'上面的數據。我唯一遇到的其他問題是linspace輸出一個行向量,所以我需要將它提供給f'new_y = f(new_x.T)',其中new_x是linspace的輸出。 –

+0

另外,感謝interp1d上的例子。我在谷歌搜索中看到了很多,但我從來沒有看到任何參考或'kind'參數的例子。 –

+0

@gabe很高興能幫到你! – jotasi