我有两组温度日期,它们以规则(但不同)的时间间隔读取读数。我正在尝试获取这两组数据之间的相关性。
我一直在玩Pandas来尝试做到这一点。我创建了两个时间序列,并且正在使用
TimeSeriesA.corr(TimeSeriesB)
。但是,如果两个 timeSeries 中的时间不完全匹配(它们通常相差几秒),我会得到 Null
作为答案。如果可以的话,我可以获得一个不错的答案:
a)在每个时间序列中插入/填充缺失的时间(我知道这在 Pandas 中是可能的,我只是不知道该怎么做)
b) 从 python
datetime
对象中删除秒(将秒设置为 00,而不更改分钟)。我会失去一定程度的准确性,但不会很大
c) 在 Pandas 中使用其他东西来获取两个时间序列之间的相关性
d) 使用 python 中的某些东西来获取两个浮点数列表之间的相关性,每个浮点数都有一个相应的
datetime
对象,同时考虑到时间。
大家有什么建议吗?
使用 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)
希望这有帮助!
通过改变时间戳,您可能会失去一些准确性。您可以对时间序列执行外连接,用 0 填充 NaN 值,然后您将获得整个时间戳(要么是共享时间戳,要么只属于其中一个数据集)。然后,您可能需要对新数据集的列执行相关函数,这将为您提供所需的结果,而不会损失准确性。这是我处理时间序列时的代码:
t12 = t1.join(t2, lsuffix='_t1', rsuffix='_t2', how ='outer').fillna(0)
t12.corr()
这样您将拥有所有时间戳。