2017-03-10 2 views
1

私はパンダDFで働いているとプロパティには、次のされている、外れ値関数を入力する前にパンダのDataFrameで外れ値の境界を選ぶには?

df.info()版画、

<class 'pandas.core.frame.DataFrame'> 
Int64Index: 6661 entries, 0 to 6660 
Data columns (total 4 columns): 
currency  6661 non-null object 
port   6661 non-null object 
supplier_id 6661 non-null int64 
value   6661 non-null float64 
dtypes: float64(1), int64(1), object(2) 
memory usage: 260.2+ KB 
None 

df.columns.values版画、

[u'currency' u'port' u'supplier_id' u'value'] 

データは前のようでしたcountryoutlier欄を追加すると、

currency port supplier_id value 
0   USD CNAQG   35 118.66 
1   USD CNAQG   19 120.83 
2   USD CNAQG   49 86.83 
3   USD CNAQG   54 112.15 
4   USD CNAQG   113 113.60 
5   USD CNAQG   5 114.32 
6   USD CNAQG   55 111.43 
7   USD CNAQG   81 117.22 
8   USD CNAQG   2 111.43 
9   USD CNAQG   10 119.39 
10  USD CNAQG   56 104.91 
11  USD CNAQG   14 119.39 
12  USD CNAQG   4 115.77 
13  USD CNAQG   7 119.39 
14  USD CNAQG   74 127.34 
15  USD CNAQG   15 112.15 
16  USD CNAQG   149 88.27 
17  USD CNAQG   20 144.71 
18  USD CNAQG   231 119.39 
19  USD CNBIH   19 140.00 

私は、外れ値を定義するための正しい値を選択する方法

CURRENCIES_DIC = {'CN':'CHINA', 'US':'USA'} 

LOW_Q = 0.05 
HIGH_Q = 0.95 



# mark the data for respective country as outlier 
def calculate_outliers(df): 

    df['country'] = df.port.str[:2].map(CURRENCIES_DIC) 
    df['outlier'] = 0 

    for c in df.country.unique(): 
     q = df.value[df.country==c].quantile([LOW_Q, HIGH_Q]) 
     df.loc[df.index[df.country==c], 'outlier'] = (df.value[df.country==c].apply(lambda x: 1 if x<q[LOW_Q] or x>q[HIGH_Q] else 0)) 

    return df 
  1. 、下使用し、上位四分位0.050.95それぞれと外れ値を除外するために式を使うのか?
  2. それぞれの目的のために異常値を定義する良い方法はありますか?

    私は別の式を参照してくださいdf[np.abs(df.Data-df.Data.mean())<=(3*df.Data.std())] #keep only the ones that are within +3 to -3 standard deviations in the column 'Data'.それを使用する方が良いですか?私の意見で

答えて

0

通常値と外れ値区別正しいしきい値を定義するための一般的なルールはありません。実際、アウトライヤーを検出するにはさまざまな方法があります。ウィキペディアは良い報道関係を持っていますhere

外れ値が実際に意味するものは、コンテキストに大きく依存します。データをプロットすると、データがどのように動作するかを視覚的に確認することができます。。データが正規分布していない場合は、データが対称的に分布していないため、標準偏差の基準が適切でない可能性があります。

クロスバリデーションについては、herehereを参照してください。

あなたは少しそれが少し読みやすくするためにコードを変更することができます

CURRENCIES_DIC = {'CN':'CHINA', 'US':'USA'} 
LOW_Q = 0.05 
HIGH_Q = 0.95 

def outlier_quant(series): 
    lower = series < series.quantile(LOW_Q) 
    upper = series > series.quantile(HIGH_Q) 
    return lower | upper 

def mark_outliers(sub_df) 
    sub_df["country"] = sub_df["port"].str[:2].map(CURRENCIES_DIC) 
    sub_df["outlier"] = sub_df.groupby("country")["value"].transform(outlier_quant) 

print(mark_outliers(df)) 
+0

これは、コードをリファクタリングするためにあなたの非常に親切です。 – Arefe

関連する問題