16

私は2セットの温度日付を持っており、それらは定期的な(しかし異なる)時間間隔で測定値を持っています。これら2つのデータセット間の相関関係を取得しようとしています。

私はこれをやろうとパンダと遊んでいます。2つの時系列を作成し、を使用してTimeSeriesA.corr(TimeSeriesB)います。ただし、2つの時系列の時間が正確に一致しない場合(通常は秒単位でずれています)、答えとしてNullが返されます。できれば、まともな答えを得ることができます。

a)各時系列の欠落時間を補間/埋めます(これはパンダで可能であることを私は知っています、私はそれを行う方法がわかりません)

b)Python datetimeオブジェクトから秒を削除します(分を変更せずに秒を00に設定します)。ある程度の精度は失われますが、それほど多くはありません

c)Pandasで他の何かを使用して、2つの時系列間の相関関係を取得します

d)Pythonで何かを使用して、floatの2つのリスト間の相関関係を取得します。各floatには、時間を考慮して、対応する日時オブジェクトがあります。

誰か提案がありますか?

4

2 に答える 2

17

パンダを使用するオプションは多数ありますが、同じ瞬間にデータが発生しないことを考えると、データを整列することがどのように理にかなっているのかを決定する必要があります。

time series のいずれかの「現在」の値を使用します。以下に例を示します。

    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 のみです!)。

すべての datetimes から秒を取り除きます。これを行う最良の方法は、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

rename によって日付が重複する場合は、Exceptionがスローされることに注意してください。

もう少し高度なものとして、1 分ごとの平均値を相関させたいとします (1 秒あたり複数の観測がある場合)。

    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 に答える