python初心者です。
前提・実現したいこと
1秒ごとに皮下血流量の測定を行っております。
血流低下をアラートするシステムの実装を目指しております。
専用のセンサーにて血流量測定を行なっておりますが、体動によるノイズで流量がたまに異常高値となってしまうため、外れ値の検出と除外を行いたいと考えています。
[https://qiita.com/hoto17296/items/d337fe0215907432d754#%E5%81%8F%E5%B7%AE%E3%81%8B%E3%82%89%E5%A4%96%E3%82%8C%E5%80%A4%E3%82%92%E6%A4%9C%E5%87%BA%E3%81%99%E3%82%8B]
こちらのサイトを参考に、指数加重移動標準偏差による外れ値の検出と除外を計画しました。
血流量の列をyに格納した状態で以下を実行しました。
df_csv_ewm = y.ewm(span=90).mean() ts=pd.Series(y) fig, ax=plt.subplots() ax.plot(ts, label="original") ax.plot(df_csv_ewm, label="ewma") ax.legend() def plot_outlier(ts, ewm_span=90, threshold=3.0): assert type(ts) == pd.Series fig, ax = plt.subplots() ewm_mean = ts.ewm(span=ewm_span).mean() # 指数加重移動平均 ewm_std = ts.ewm(span=ewm_span).std() # 指数加重移動標準偏差 ax.plot(ts, label='original') ax.plot(ewm_mean, label='ewma') ax.fill_between(ts.index, ewm_mean - ewm_std * threshold, ewm_mean + ewm_std * threshold, alpha=0.2) outlier = ts[(ts - ewm_mean).abs() > ewm_std * threshold] ax.scatter(outlier.index, outlier, label='outlier') ax.legend() return fig plot_outlier(ts)
これにより標準偏差から3.0倍以上外れているデータを外れ値として検出、描画を行うことができました。
次に外れ値の除外を行おうと考えました。
調べたところ「drop」「clear」などが使えるのではないかと思ったのですが、どの位置で実行すべきか構文の理解の問題かわかりませんでした。
outlierの定義の次に
ts.drop(outlier)など入力するのですが
AttributeError: 'Series' object has no attribute 'drop'
と表示されてしまいます。
外れ値を除外した状態のグラフ描画、また除外した状態にして他値との相関評価ができればと考えております。
ご意見いただければ幸いです。