朱莉娅:找到两个向量及其索引的交集,以帮助连接两个时间序列

时间:2014-03-28 02:04:40

标签: matlab octave julia

我正在尝试学习Julia语言,所以我试图移植一些MATLAB和Octave代码来帮助我学习。

特别是在这种情况下,我寻找确定索引的方法的原因是因为我尝试按日期水平连接两个时间序列,所以我可以测试协整,而我&# 39; ve使用交叉函数作为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和Octave的交叉函数可以返回相交集元素的索引位置以及交集,如下所示(MATLAB referenceOctave reference):

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

虽然朱莉娅的交叉函数只会从我所知道的Julia reference)返回C以上的等价物

C = intersect(a_vector, b_vector)

如何在Julia中实现两个时间序列的连接,只有那些有数据的日期都包含在最终结果中?

我已经和findin()一起玩了,我可以得到一些索引,但也许我以前编写的MATLAB / Ocatave代码的方式可能不会/不应该'在Julia中复制,所以我对使用Julia以最准确和最有效的方式获得最终时间序列结果的最佳方式感兴趣。

(给出的时间序列示例当然只是为了澄清我想要实现的目标,第一维中的数据可能是数百万到数十亿)

2 个答案:

答案 0 :(得分:2)

这似乎是DataFrames应该成为工作工具的任务。我不确定它目前的效果如何,但documentation表明有一种join()方法可以同时执行innerouter联接请求。我已经看到了一些关于使DataFrame更像inMemory数据库的问题,但是我没有仔细地讨论这个问题。

当问题规模变得非常大时,我建议您考虑使用像MySQL或sqlite这样的关系数据库。它们经过精心调整,可以完成这些操作,并为您提供一种简单的声明性语言来表达您想要的结果,让系统以最快的方式解决这个问题。

答案 1 :(得分: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