web-dev-qa-db-ja.com

Python pandas時系列補間と正則化

Python Pandasを初めて使用しています。csv形式の5分のラグトラフィックデータがあります:

...
2015-01-04 08:29:05,271238
2015-01-04 08:34:05,329285
2015-01-04 08:39:05,-1
2015-01-04 08:44:05,260260
2015-01-04 08:49:05,263711
...

いくつかの問題があります:

  • 一部のタイムスタンプではデータが欠落しています(-1)
  • 欠落しているエントリ(これも2時間連続で3時間)
  • 観測の頻度は正確に5分ではありませんが、実際にはたまに数秒を失います

定期的な時系列を取得したいので、5分ごとに(正確に)エントリーを入力します(値の欠落はありません)。次のコードを使用して時系列を正常に補間し、このコードで-1の値を概算しました。

ts = pd.TimeSeries(values, index=timestamps)
ts.interpolate(method='cubic', downcast='infer')

観測の頻度を補間および正則化するにはどうすればよいですか?助けてくれてありがとう。

17
riccamini

変更 -1sからNaNへ:

ts[ts==-1] = np.nan

次に、データをリサンプリングして5分の頻度にします。

ts = ts.resample('5T')

デフォルトでは、2つの測定値が同じ5分の期間内にある場合、resampleは値を平均します。

最後に、時間に従って時系列を線形補間することができます。

ts = ts.interpolate(method='time')

データには既に約5分の頻度があるように見えるため、3次補間またはスプライン補間で曲線を滑らかにするために、より短い頻度でリサンプリングする必要がある場合があります。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

values = [271238, 329285, -1, 260260, 263711]
timestamps = pd.to_datetime(['2015-01-04 08:29:05',
                             '2015-01-04 08:34:05',
                             '2015-01-04 08:39:05',
                             '2015-01-04 08:44:05',
                             '2015-01-04 08:49:05'])

ts = pd.Series(values, index=timestamps)
ts[ts==-1] = np.nan
ts = ts.resample('T').mean()

ts.interpolate(method='spline', order=3).plot()
ts.interpolate(method='time').plot()
lines, labels = plt.gca().get_legend_handles_labels()
labels = ['spline', 'time']
plt.legend(lines, labels, loc='best')
plt.show()

enter image description here

25
unutbu