質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

1387閲覧

外れ値除去を特定の時系列ごとに行いたい

shin_shin

総合スコア96

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2018/05/22 04:19

IQR(四分位範囲)の概念を使って、外れ値を除去したいのですが、その除去を特定の期間ごと[ex)60分ごと]に実行したいです。

【前提】
データフレーム:IndexがTimestamp('2017-07-01 00:00:00'から'2018-02-28 23:59:00')で、Columnが237個のデータフレーム。

【やりたいことのイメージ】

Python

1#関数の定義 2def drop_outlier(df): 3 for i, col in df.iteritems(): 4 # IQR 5 q1 = col.describe()['25%'] 6 q3 = col.describe()['75%'] 7 iqr = q3 - q1 8 9 # Lower 1.5*IQR whisker & Upper 1.5*IQR whisker 10 outlier_min = q1 - (iqr) * 1.5 11 outlier_max = q3 + (iqr) * 1.5 12 13 # Fill the oulier with NaN 14 col[col < outlier_min] = None 15 col[col > outlier_max] = None

Python

1# 7月の外れ値処理 2drop_outlier(df['2017-07-01 00:00:00':'2017-07-31 12:59:00']) 3# 8月の外れ値処理 4drop_outlier(df['2017-08-01 00:00:00':'2017-08-30 12:59:00']) 5. 6. 7. 8# 2月の外れ値処理 9drop_outlier(df['2017-02-01 00:00:00':'2017-02-28 12:59:00'])

このように、一つ一つ処理することは可能ですが、全然スマートじゃないし、応用可能範囲も狭いと思いました。
より抽象的で、スマートなやり方をご教授願いたいです。

どうぞよろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

年/月毎に groppby して Groupby.apply() から drop_outlier() を呼ぶと良いかと思います。

drop_outlier() は Groupby.apply() から使用するため、return文を追加しております。

Python

1import numpy as np 2import pandas as pd 3 4def drop_outlier(df): 5 for i, col in df.iteritems(): 6 # IQR 7 q1 = col.describe()['25%'] 8 q3 = col.describe()['75%'] 9 iqr = q3 - q1 10 11 # Lower 1.5*IQR whisker & Upper 1.5*IQR whisker 12 outlier_min = q1 - (iqr) * 1.5 13 outlier_max = q3 + (iqr) * 1.5 14 15 # Fill the oulier with NaN 16 col[col < outlier_min] = None 17 col[col > outlier_max] = None 18 # applyにて使用するので 戻り値を追加する 19 return df 20 21# 適当なデータを生成 22N = 365 23df = pd.DataFrame( 24 {'A': np.random.normal(0, 10, N),'B': np.random.normal(0, 10, N)}, 25 index = pd.date_range('2018/1/1 12:00', freq='1d', periods=N)) 26 27# 年/月毎に groppby して drop_outlier を呼ぶ 28df = df.groupby(pd.Grouper(freq='M')).apply(drop_outlier) 29# 以下の処理でも同じ 30#df = df.groupby([df.index.year, df.index.month]).apply(drop_outlier) 31 32 33print(df)

投稿2018/05/22 05:11

編集2018/05/22 06:08
magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問