2016-09-03 10 views
0

私はデータのセット、およびビンを作成するためのしきい値のセットがあります。binsの要素のそれぞれについて、数値データからビンのパーセンタイルを計算しますか?

data = np.array([0.01, 0.02, 1, 1, 1, 2, 2, 8, 8, 4.5, 6.6]) 
thresholds = np.array([0,5,10]) 
bins = np.digitize(data, thresholds, right=True) 

は、私は基本パーセンタイルを知りたいです。たとえば、binsでは、最も小さいビンは0パーセンタイルから開始する必要があります。次に、次のビン、例えば、20パーセンタイル。したがって、dataの値がdataの0〜20パーセンタイルの間にある場合、それは最初のbinに属します。

パンダrank(pct=True)を調べましたが、これが正しく行われていないようです。

提案?

答えて

2

以前のStackOverflow質問(Map each list value to its corresponding percentile)で説明したように、データ配列内の各要素のパーセンタイルを計算できます。

import numpy as np 
from scipy import stats 
data = np.array([0.01, 0.02, 1, 1, 1, 2, 2, 8, 8, 4.5, 6.6]) 

方法1:scipy.stats.percentileofscoreを使用して:

data_percentile = np.array([stats.percentileofscore(data, a) for a in data]) 
data_percentile 
Out[1]: 
array([ 9.09090909, 18.18181818, 36.36363636, 36.36363636, 
     36.36363636, 59.09090909, 59.09090909, 95.45454545, 
     95.45454545, 72.72727273, 81.81818182]) 

方法2:(速い)100からscipy.stats.rankdataと正規化を使用して:あなたはパーセンタイルのリストを持っていることを今

ranked = stats.rankdata(data) 
data_percentile = ranked/len(data)*100 
data_percentile 
Out[2]: 
array([ 9.09090909, 18.18181818, 36.36363636, 36.36363636, 
     36.36363636, 59.09090909, 59.09090909, 95.45454545, 
     95.45454545, 72.72727273, 81.81818182]) 

、あなたを前と同じようにビンに入れることができますnumpy.digitize

bins_percentile = [0,20,40,60,80,100] 
data_binned_indices = np.digitize(data_percentile, bins_percentile, right=True) 
data_binned_indices 
Out[3]: 
array([1, 1, 2, 2, 2, 3, 3, 5, 5, 4, 5], dtype=int64) 

これは、選択したパーセンタイルリストのインデックスに従ってデータを格納します。必要に応じて、numpy.take

を使用して、実際の
関連する問題