🐕

telemanom(NASAの時系列データセット)を使う

2022/07/03に公開

2022年時点において、時系列データの異常検知について調べてるとたびたび目にするtelemanomについて、データセットとして使う際に調べたメモ。
基本的にはREADMEをちゃんと読もう。

どんなデータか

NASAの宇宙機のテレメトリデータ

  • Soil Moisture Active Passive satellite (SMAP)
  • Curiosity Rover on Mars (MSL)

ファイルフォーマット

npy(numpyのバイナリファイル)

匿名化されている

値は(-1,1)の範囲に正規化され、匿名化(anonymize)されている。
82個(SMAP/55, MSL/27)のデータがあるが、どんなセンサーのデータかも匿名化されている。ただしファイル名の先頭の文字でどの系か(電源系ならPowerのP)は判断できる。

ライセンス

Apache 2.0 license

入手

データの諸元(異常値の位置とか)を知るためにはlabeled_anomalies.csvを入手する。

curl -O https://github.com/khundman/telemanom/labeled_anomalies.csv

データ本体はzipを入手する。

curl -O https://s3-us-west-2.amazonaws.com/telemanom/data.zip && unzip data.zip && rm data.zip

中身を確認

labeled_anomalies.csv

df = pd.read_csv('labeled_anomalies.csv')

それぞれのデータの異常値の位置(anomaly_sequences)や異常値の性質(class)がわかる。

A-1の異常値の位置を確認

df[df['chan_id']=='A-1']['anomaly_sequences']

15 [[4690, 4774]]

data

dataディレクトリの下はtestとtrainで分けられている。

data/
├── 2018-05-19_15.00.10
├── test
│   ├── A-1.npy
│   ├── A-2.npy
│   ├── A-3.npy
│   ...
└── train
    ├── A-1.npy
    ├── A-2.npy
    ├── A-3.npy
    ...

A-1を確認

import numpy as np
a1 = np.load('data/test/A-1.npy')
print(a1.shape)

(8640, 25)

ただし8640ステップの25次元データというわけではなく
The actual telemetry values should be along the first dimension とのことなので、センサーの値は以下のように抜き出す。

values = a1[:,0]

グラフにしてみる。

import matplotlib.pyplot as plt
start = 0
end = values.shape[0]

fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111)
x = np.linspace(start, end, end - start)
ax.plot(x,a1[start:end, 0])
plt.show()

異常値の範囲([4690, 4774])を拡大してみる。

まとめ

異常値がラベリングされている時系列データセット助かる。

Discussion