2014-03-28 67 views
2

我正試圖學習Julia語言,所以我試圖移植一些MATLAB和Octave代碼來幫助我學習。Julia:找到兩個向量和它們的索引的交集,以幫助連接兩個時間序列

特別是在這個例子中,我正在尋找一種方法來確定索引的原因是因爲我試圖水平連接兩個時間序列的日期,所以我可以測試協整,我已經使用相交函數作爲MATLAB/Ocatve中的中間步驟之一,以允許我在過去實現這一點。

Time series 1 example 
+------------+--------+ 
| Date  | Value | 
+------------+--------+ 
| 2014-03-01 |  11 | 
| 2014-03-02 |  12 | 
| 2014-03-03 |  13 | 
| 2014-03-04 |  14 | 
| 2014-03-05 |  15 | 
+------------+--------+ 

Time series 2 example 
+------------+--------+ 
| Date  | Value | 
+------------+--------+ 
| 2014-03-01 |  21 | 
| 2014-03-02 |  22 | 
| 2014-03-05 |  25 | 
| 2014-03-06 |  26 | 
+------------+--------+ 

Intermediate result desired 
+------------+----------------------+---------------------+ 
| Date  | Time series 1 value | Time series 2 value | 
+------------+----------------------+---------------------+ 
| 2014-03-01 |     11 |     21 | 
| 2014-03-02 |     12 |     22 | 
| 2014-03-03 |     13 |     NaN | 
| 2014-03-04 |     14 |     NaN | 
| 2014-03-05 |     15 |     25 | 
| 2014-03-06 |     NaN |     26 | 
+------------+----------------------+---------------------+ 

Final result desired 
+------------+----------------------+---------------------+ 
| Date  | Time series 1 value | Time series 2 value | 
+------------+----------------------+---------------------+ 
| 2014-03-01 |     11 |     21 | 
| 2014-03-02 |     12 |     22 | 
| 2014-03-05 |     15 |     25 | 
+------------+----------------------+---------------------+ 

MATLAB的和八度音的交叉函數可以返回相交集合元素的索引位置,以及交叉點集合,像這樣(MATLAB referenceOctave reference):

[C a_idx b_idx] = intersect(a_vector, b_vector) 

雖然Julia的交叉函數將只有從上面返回C的等效我可以告訴(Julia reference

C = intersect(a_vector, b_vector) 

如何在Julia中實現兩個時間序列的串聯,只有那些包含數據的日期纔會包含在最終結果中?

我已經玩了findin(),我可以得到一些指標,但也許我過去編寫MATLAB/Ocatave代碼的方式不能/不應該在Julia中複製,所以我很感興趣以最佳方式使用Julia以最準確和最有效的方式獲得最終時間序列結果。

(時間序列當然給出的例子只是爲了澄清我想實現,可以對數據進行數百萬數十億在第一維)

回答

2

這似乎是在那裏你DataFrames應該是一個任務這項工作的工具。我不確定它目前的工作情況如何,但documentation表明有一個join()方法可以根據您的請求執行innerouter連接。我已經看到了一些關於使DataFrames更像inMemory數據庫的問題,但我沒有仔細跟蹤討論。

當問題規模變得非常大時,我真的建議您考慮使用像MySQL或sqlite這樣的關係數據庫。他們被仔細地調整爲完成這些類型的操作,併爲您提供一種簡單的聲明性語言來表達您想要的結果,並讓系統以儘可能最快的方式解決這個問題。

2

同意ivarne是DataFrames是一個不錯的選擇:

using DataFrames 

timeseries1 = DataFrame(
    a = ["2014-03-01","2014-03-02","2014-03-03","2014-03-04","2014-03-05",], 
    b = @data([1,2,3,4,5]) 
) 
timeseries2 = DataFrame(
    a = ["2014-03-01","2014-03-02","2014-03-05","2014-03-06",], 
    c = @data([21,22,23,24]) 
) 
join(timeseries1, timeseries2, on=:a) 

3x3 DataFrame: 
       a b c 
[1,] "2014-03-01" 1 21 
[2,] "2014-03-02" 2 22 
[3,] "2014-03-05" 5 2 
相關問題