2011-06-24 9 views
10

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

私はPandasでこれを試してみました。私は2つのtimeseriesを作成し、TimeSeriesA.corr(TimeSeriesB)を使用しています。しかし、2つのtimeSeriesの時刻が正確に一致しない場合(通常は秒単位でオフになります)、答えとしてNullを取得します。私ができる場合、私はまともな答えを得ることができます:

a)の補間は/各なTimeSeriesに欠け回を埋める(私はこれはパンダで可能です知っている、私はちょうどそれを行う方法がわからない)

B) pythonのdatetimeオブジェクトから数秒を削除します(分を変更せずに秒を00に設定します)。私は、正確さの度合いを失うことはなく、膨大な量に

c)の2時系列

dとの相関関係を取得するにはパンダに何か他のものを使用)の二つのリスト間の相関関係を取得するにはPythonで何かを使用したいです各フロートは対応する日時オブジェクトを持ち、時刻を考慮に入れます。

誰もが何か提案がありますか?

答えて

12

パンダを使用していくつかのオプションがありますが、同じインスタントで発生していないことを考慮して、データを整列させるのが適切な方法を決定する必要があります。

は、時系列の一つに回「のとして」値を使用し、ここでは例です:

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秒で、これらはオフになって見ることができます。 「パッド」がも(だけの非常に最新バージョンの「ffill」にエイリアスされていること

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 

ノート:フォワード値(値「のように」取得)を充填しながらreindex機能を使うには、データを揃えることができます今回のGitHubのパンダ!)。

あなたのすべてのdatetimeのうちの秒数秒。これを行うための最善の方法は、名前の変更が重複した日付があることが原因となる場合Exceptionがスローされることを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 

注意を使用することです。もう少し高度なものについては

、あなたは(あなたが毎秒複数の観測値を持っている)毎分の平均値を相関させるために望んでいたとします

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

ハ、私ができる前にそれを持っています: - )... –

+0

最後の部分を読んでいる場合、最後の部分は00〜60秒(XX:XX:00ではなくXX:XX:30の平均)の平均値を計算し、XX:XXに代入します:00。この周りの簡単な方法は、 'date.replace(second = 30)'となります。毎分の平均を得るための非常に複雑な方法は次のようになります: 'ts_mean = seriesT.groupby(lambda date:date.replace(second = 0)if date.second <30 else date.replace(秒= 0)+ timedelta(分= 1))。 – user814005

関連する問題