如何利用Pandas获取两个时间序列之间的相关性

2024-06-26 14:18:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两组温度数据,它们有固定(但不同)时间间隔的读数。我试图得到这两组数据之间的相关性。

我一直在和Pandas玩,试图做到这一点。我已经创建了两个timeseries,并且正在使用TimeSeriesA.corr(TimeSeriesB)。但是,如果两个timeSeries中的时间不完全匹配(它们通常以秒为单位),我将得到空值作为答案。如果我能得到一个体面的答案:

a)在每个时间序列中插入/填充缺失时间(我知道这在熊猫中是可能的,我只是不知道如何做到)

b)从python datetime对象中去掉seconds(将seconds设置为00,不更改minutes)。我会失去一定程度的准确性,但不会损失太多

c)在熊猫身上使用其他东西来获得两个时间序列之间的相关性

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

有人有什么建议吗?


Tags: 数据对象答案pandasdatetime间隔时间序列
1条回答
网友
1楼 · 发布于 2024-06-26 14:18:12

使用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函数允许您在填充正向值(获取“截止”值)时对齐数据:

    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)

希望这有帮助!

相关问题 更多 >