2016-08-30 2 views
6

私はhdf5ファイルからインポートしているデータを持っています。したがって、次のようになります。系列のローカル時間微分を計算する

import pandas as pd 
tmp=pd.Series([1.,3.,4.,3.,5.],['2016-06-27 23:52:00','2016-06-27 23:53:00','2016-06-27 23:54:00','2016-06-27 23:55:00','2016-06-27 23:59:00']) 
tmp.index=pd.to_datetime(tmp.index) 

>>>tmp 
2016-06-27 23:52:00 1.0 
2016-06-27 23:53:00 3.0 
2016-06-27 23:54:00 4.0 
2016-06-27 23:55:00 3.0 
2016-06-27 23:59:00 5.0 
dtype: float64 

データのローカルスロープを検索したいと思います。私がちょうどtmp.diff()を行うと、私は値のローカル変更を取得します。しかし、私は2番目あたりの値の変化(時間微分) を取得したい私はこのような何かをしたいと思いますが、これはそれを行うには間違った方法であるとエラーを与える:

tmp.diff()/tmp.index.diff() 

私が考え出してきました私はすべてのデータをDataFrameに変換することでそれを行うことができますが、それは非効率的です。特に、大容量のディスクファイルをチャンクで扱わなければならないので、 はこれ以外にそれを行うには良い方法があります:

df=pd.DataFrame(tmp) 
df['secvalue']=df.index.astype(np.int64)/1e+9 
df['slope']=df['Value'].diff()/df['secvalue'].diff() 

答えて

4

使用numpy.gradient

import numpy as np 
import pandas as pd 

slope = pd.Series(np.gradient(tmp.values), tmp.index, name='slope') 

不平等な時間的指標に対処するために、私は分を超えるリサンプリングして補間すると思います。それから私の勾配は等間隔になります。

tmp_ = tmp.resample('T').interpolate() 

slope = pd.Series(np.gradient(tmp_.values), tmp_.index, name='slope') 

df = pd.concat([tmp_.rename('values'), slope], axis=1) 
df 

enter image description here

df.plot() 

enter image description here

+0

私はリサンプリングしようとすると、実際のデータに、私はNaNでの全体の束を取得します。データが私のリサンプリング周波数についてのものであっても(例えば、実際のデータは約15秒であり、私は15秒でリサンプリングする)。代わりに、より高い周波数でリサンプリングすると、これはうまくいくように見えます。助言がありますか?このアプローチのもう1つの問題は、リサンプリングが比較的遅いことです。 – Adam

+0

@ Adamいくつかのサンプルデータがより役に立ちます。あなたの質問にいくつかを提供できる場合、私はあなたの特定の問題を見てみることができます。 – piRSquared

+0

私はエチケットについてはわかりませんが、データが長すぎてコメントできません。だから、私はいくつかをpastebinに入れます:http://pastebin.com/vK59kN0e – Adam