16

我有两组温度日期,它们有规律(但不同)时间间隔的读数。我试图获得这两组数据之间的相关性。

我一直在和Pandas一起玩,试图做到这一点。我创建了两个时间序列,并且正在使用TimeSeriesA.corr(TimeSeriesB). 但是,如果 2 timeSeries 中的时间不完全匹配(它们通常相差几秒钟),我会得到 Null 作为答案。如果可以的话,我可以得到一个体面的答案:

a)在每个 TimeSeries 中插入/填充缺失的时间(我知道这在 Pandas 中是可能的,我只是不知道该怎么做)

b) 从 python 日期时间对象中去除秒数(将秒数设置为 00,不更改分钟数)。我会失去一定程度的准确性,但不会很大

c) 在 Pandas 中使用其他东西来获取两个 timeSeries 之间的相关性

d)在python中使用一些东西来获取两个浮点数列表之间的相关性,每个浮点数都有一个对应的日期时间对象,同时考虑到时间。

有人有什么建议吗?

4

2 回答 2

17

您有许多使用 pandas 的选项,但您必须决定对齐数据的意义,因为它们不会同时发生。

在时间序列之一中使用“截至”时间的值,这是一个示例:

    In [15]: ts
    Out[15]: 
    2000-01-03 00:00:00    -0.722808451504
    2000-01-04 00:00:00    0.0125041039477
    2000-01-05 00:00:00    0.777515530539
    2000-01-06 00:00:00    -0.35714026263
    2000-01-07 00:00:00    -1.55213541118
    2000-01-10 00:00:00    -0.508166334892
    2000-01-11 00:00:00    0.58016097981
    2000-01-12 00:00:00    1.50766289013
    2000-01-13 00:00:00    -1.11114968643
    2000-01-14 00:00:00    0.259320239297



    In [16]: ts2
    Out[16]: 
    2000-01-03 00:00:30    1.05595278907
    2000-01-04 00:00:30    -0.568961755792
    2000-01-05 00:00:30    0.660511172645
    2000-01-06 00:00:30    -0.0327384421979
    2000-01-07 00:00:30    0.158094407533
    2000-01-10 00:00:30    -0.321679671377
    2000-01-11 00:00:30    0.977286027619
    2000-01-12 00:00:30    -0.603541295894
    2000-01-13 00:00:30    1.15993249209
    2000-01-14 00:00:30    -0.229379534767

你可以看到这些关闭了 30 秒。该reindex函数使您能够在填充前向值的同时对齐数据(获取“as of”值):

    In [17]: ts.reindex(ts2.index, method='pad')
    Out[17]: 
    2000-01-03 00:00:30    -0.722808451504
    2000-01-04 00:00:30    0.0125041039477
    2000-01-05 00:00:30    0.777515530539
    2000-01-06 00:00:30    -0.35714026263
    2000-01-07 00:00:30    -1.55213541118
    2000-01-10 00:00:30    -0.508166334892
    2000-01-11 00:00:30    0.58016097981
    2000-01-12 00:00:30    1.50766289013
    2000-01-13 00:00:30    -1.11114968643
    2000-01-14 00:00:30    0.259320239297

    In [18]: ts2.corr(ts.reindex(ts2.index, method='pad'))
    Out[18]: -0.31004148593302283

请注意,“pad”也是“ffill”的别名(但目前仅在 GitHub 上最新版本的 pandas 中!)。

从您的所有日期时间中去除秒数。最好的方法是使用rename

    In [25]: ts2.rename(lambda date: date.replace(second=0))
    Out[25]: 
    2000-01-03 00:00:00    1.05595278907
    2000-01-04 00:00:00    -0.568961755792
    2000-01-05 00:00:00    0.660511172645
    2000-01-06 00:00:00    -0.0327384421979
    2000-01-07 00:00:00    0.158094407533
    2000-01-10 00:00:00    -0.321679671377
    2000-01-11 00:00:00    0.977286027619
    2000-01-12 00:00:00    -0.603541295894
    2000-01-13 00:00:00    1.15993249209
    2000-01-14 00:00:00    -0.229379534767

请注意,如果重命名导致重复日期,Exception则会抛出一个。

对于更高级的东西,假设您想关联每分钟的平均值(每秒有多个观察值):

    In [31]: ts_mean = ts.groupby(lambda date: date.replace(second=0)).mean()

    In [32]: ts2_mean = ts2.groupby(lambda date: date.replace(second=0)).mean()

    In [33]: ts_mean.corr(ts2_mean)
    Out[33]: -0.31004148593302283

如果您没有来自https://github.com/wesm/pandas的最新代码,这些最后的代码片段可能不起作用。如果按照上述尝试.mean()对对象不起作用GroupBy.agg(np.mean)

希望这可以帮助!

于 2011-06-24T14:01:15.623 回答
2

通过改变你的时间戳,你可能会失去一些准确性。您可以对时间序列执行外部联接,用 0 填充 NaN 值,然后您将拥有整个时间戳(它是共享的或仅属于其中一个数据集)。然后,您可能希望对新数据集的列执行相关函数,这将为您提供您正在寻找的结果而不会丢失准确性。这是我使用时间序列时的代码:

t12 = t1.join(t2, lsuffix='_t1', rsuffix='_t2', how ='outer').fillna(0)

t12.corr()

这样,您将拥有所有时间戳。

于 2020-09-07T05:11:03.263 回答