初めて Python Pandas を使用しています。5 分遅れのトラフィック データが csv 形式で保存されています。
...
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')
観測の頻度を補間して正規化するにはどうすればよいでしょうか? ご協力ありがとうございました。
ベストアンサー1
s を NaN に変更します-1
。
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()