2017-06-19 9 views
2

私は、タイムスタンプ付きの2つのパンダシリーズをインデックスとして扱っています。 1つのシリーズは固定周波数の粗いモデルであり、もう1つは固定周波数のないデータです。データからモデルを減算し、モデルの値を(線形またはスプラインで)補間したいと思います。ここパンダの補間で不規則で定期的なタイムスタンプを持つ2つのシリーズを差し引く

は一例であり:

import numpy as np 
import pandas as pd 


# generate model with fixed freq 
model = pd.Series(range(5),index=pd.date_range('2017-06-19T12:05:00', '2017-06-19T12:25:00', freq="5 min")) 

# generate data and add more_data to make frequency irregular 
data = pd.Series(np.arange(10)+0.3,index=pd.date_range('2017-06-19T12:06:00', 
'2017-06-19T12:24:00', freq="2 min")) 
more_data = pd.Series([-10, -20], index=[pd.Timestamp('2017-06-19T12:07:35'), 
pd.Timestamp('2017-06-19T12:09:10')]) 
data = data.append(more_data).sort_index() 

Iは

data - model.interpolate()[data.index] 

を試みたが、それは唯一私モデルのタイムスタンプとデータ重複非NaN値を与えます。

モデルの頻度()に合わせてデータを再サンプリングすることはできますが、データから元のタイムスタンプでモデルを差し引いたデータを取得したいと思います。

答えて

1

thisの助けを借りて答私は実際に必要なポイントで補間し、私の問題への解決策を考え出した:

まず、dataのタイムスタンプでのNaNのシリーズを生成します。

na = pd.Series(None, data.index) 

とモデルと組み合わせる:

combi = model.combine_first(na) 
このシリーズは、現在のデータから補間し、差し引くことができる

(data - combi.interpolate(method='time'))[data.index] 

またはワンライナーとして

(data - model.combine_first(pd.Series(None, data.index)).interpolate(method='time'))[data.index] 
+1

私はこれが大好きです。私が追加したいのは私が編集するかもしれない、そしてここでは、 'method = 'time''を' interpolate'の引数として追加することです。そうすれば補間は私たちがそうしたdatetimeインデックスを実際に使用するようになります保存するように注意してください。 – EFT

+1

これをさらに調べてみましょう。実際には任意のオプションがありますが、デフォルトの 'method = 'linear''が使用されている限り、両方のアプローチで適切に動作します。 – EFT

+0

良い点、私は編集しました! – frankundfrei

1

アイデア:

あなたはデータの周波数に合わせてモデルを再サンプリング、その後、ナノ秒単位でdataのインデックスの値の最大公約数を見つけることができます。

方法:

方法を用いてnumpyのアレイのGCD関数を構築hereを見つけ、それをdata.index.astype(np.int64)フィード:

divisor = np.ufunc.reduce(np.frompyfunc(math.gcd, 2, 1), 
          data.index.astype(np.int64)) 
divisor 
Out[91]: 5000000000 

そしてmodelをリサンプリングし、前のように進行:

data - model.resample(str(divisor)+'ns').interpolate(method='time')[data.index] 
    Out[61]: 
2017-06-19 12:06:00  0.100000 
2017-06-19 12:07:35 -10.516667 
2017-06-19 12:08:00  0.700000 
2017-06-19 12:09:10 -20.833333 
2017-06-19 12:10:00  1.300000 
2017-06-19 12:12:00  1.900000 
2017-06-19 12:14:00  2.500000 
2017-06-19 12:16:00  3.100000 
2017-06-19 12:18:00  3.700000 
2017-06-19 12:20:00  4.300000 
2017-06-19 12:22:00  4.900000 
2017-06-19 12:24:00  5.500000 
dtype: float64 
+0

リサンプリングが遅い静かですが、これは、私の現在のデータセットのために動作します。私は大きなデータセットのためにMemoryErrorも実行しました。シリーズのチャンクを反復することはエレガントではありませんが、うまくいくはずです。 – frankundfrei

関連する問題