淺談pandas.cut與pandas.qcut的使用方法及區別
pandas.cut:
pandas.cut(x,bins,right=True,labels=None,retbins=False,precision=3,include_lowest=False)
引數:
1. x,類array物件,且必須為一維,待切割的原形式
2. bins,整數、序列尺度、或間隔索引。如果bins是一個整數,它定義了x寬度範圍內的等寬面元數量,但是在這種情況下,x的範圍在每個邊上被延長1%,以保證包括x的最小值或最大值。如果bin是序列,它定義了允許非均勻bin寬度的bin邊緣。在這種情況下沒有x的範圍的擴充套件。
3. right,布林值。是否是左開右閉區間
4. labels,用作結果箱的標籤。必須與結果箱相同長度。如果FALSE,只返回整數指標面元。
5. retbins,布林值。是否返回面元
6. precision,整數。返回面元的小數點幾位
7. include_lowest,布林值。第一個區間的左端點是否包含
返回值:
若labels為False則返回整數填充的Categorical或陣列或Series
若retbins為True還返回用浮點數填充的N維陣列
demo:
>>> pd.cut(np.array([.2,1.4,2.5,6.2,9.7,2.1]),3,retbins=True) ... ([(0.19,3.367],(0.19,(3.367,6.533],... Categories (3,interval[float64]): [(0.19,3.367] < (3.367,6.533] ... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >>> pd.cut(np.array([.2,... 3,labels=["good","medium","bad"]) ... [good,good,medium,bad,good] Categories (3,object): [good < medium < bad] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >>> pd.cut(np.ones(5),4,labels=False) array([1,1,1])
pandas.qcut
pandas.qcut(x,q,duplicates='raise')
引數:
1.x
2.q,整數或分位陣列成的陣列。
3.labels,
4.retbins
5.precisoon
6.duplicates
結果中超過邊界的值將會變成NA
demo:
>>> pd.qcut(range(5),4) ... [(-0.001,1.0],(-0.001,(1.0,2.0],(2.0,3.0],(3.0,4.0]] Categories (4,interval[float64]): [(-0.001,1.0] < (1.0,2.0] ... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >>> pd.qcut(range(5),bad] Categories (3,object): [good < medium < bad] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ pd.qcut(range(5),labels=False) array([0,2,3])
補充拓展:解決 Python 中 qcut() 執行報錯: Bin edges must be unique和drop duplicate edges by setting 'duplicates' kwarg
本次糾錯背景,來源於互金領域信用風控建模中的變數分箱處理。(附在文末)
解決 Python 中 qcut() 函式執行報錯:
Bin edges must be unique和 You can drop duplicate edges by setting the ‘duplicates' kwarg
首先,報錯如下:
然後,在qcut() 函式中設定duplicates引數為“drop”(不能設定為“raise”),解決(如下)。
本次糾錯背景,來源於互金領域信用風控建模中的變數分箱處理。如下:
# 五、變數選擇 # 特徵變數選擇(排序)對於資料分析、機器學習從業者來說非常重要。 # 好的特徵選擇能夠提升模型的效能,更能幫助我們理解資料的特點、底層結構,這對進一步改善模型、演算法都有著重要作用。 # 至於Python的變數選擇程式碼實現可以參考結合Scikit-learn介紹幾種常用的特徵選擇方法。 # 在本文中,我們採用信用評分模型的變數選擇方法,通過WOE分析方法,即是通過比較指標分箱和對應分箱的違約概率來確定指標是否符合經濟意義。 # 首先我們對變數進行離散化(分箱)處理。
# 5.1 分箱處理 # 變數分箱(binning)是對連續變數離散化(discretization)的一種稱呼。 # 信用評分卡開發中一般有常用的等距分段、等深分段、最優分段。 # 其中等距分段(Equval length intervals)是指分段的區間是一致的,比如年齡以十年作為一個分段; # 等深分段(Equal frequency intervals)是先確定分段數量,然後令每個分段中資料數量大致相等; # 最優分段(Optimal Binning)又叫監督離散化(supervised discretizaion),使用遞迴劃分(Recursive Partitioning)將連續變數分為分段,背後是一種基於條件推斷查詢較佳分組的演算法。
# 我們首先選擇對連續變數進行最優分段,在連續變數的分佈不滿足最優分段的要求時,再考慮對連續變數進行等距分段。最優分箱的程式碼如下:
# 定義自動分箱函式 from scipy import stats def mono_bin(Y,X,n = 20): r = 0 good=Y.sum() bad=Y.count()-good while np.abs(r) < 1: d1 = pd.DataFrame({"X": X,"Y": Y,"Bucket": pd.qcut(X,n,duplicates="drop")}) # 後面報錯You can drop duplicate edges by setting the 'duplicates' kwarg,所以回到這裡補充duplicates引數 # pandas中使用qcut(),邊界易出現重複值,如果為了刪除重複值設定 duplicates=‘drop',則易出現於分片個數少於指定個數的問題 d2 = d1.groupby('Bucket',as_index = True) r,p = stats.spearmanr(d2.mean().X,d2.mean().Y) n = n - 1 d3 = pd.DataFrame(d2.X.min(),columns = ['min']) d3['min']=d2.min().X d3['max'] = d2.max().X d3['sum'] = d2.sum().Y d3['total'] = d2.count().Y d3['rate'] = d2.mean().Y d3['woe']=np.log((d3['rate']/(1-d3['rate']))/(good/bad)) d4 = (d3.sort_index(by = 'min')).reset_index(drop=True) print("=" * 60) print(d4) return d4 # 此定義函式暫未理解通透,暫且保留。這裡先直接使用。 # 原帖程式碼沒有匯入scipy.stats模組,會導致下一條語句執行報錯,上面補上,搞定。 # 原帖程式碼qcut()函式中沒有設定duplicates引數,上面補上,搞定。
# 自定義函式分箱RevolvingUtilizationOfUnsecuredLines時報錯You can drop duplicate edges by setting the 'duplicates' kwarg # 所以先回來刪除重複值。刪除後發現沒有解決問題,真正解決問題是在qcut()函式中沒有設定duplicates引數為“drop”(不能設定為“raise”) data=data.drop_duplicates(subset=None,keep='first',inplace=False) data.shape
(119703,11)
# 針對我們將使用最優分段對於資料集中的RevolvingUtilizationOfUnsecuredLines、age、DebtRatio和MonthlyIncome進行分類。
mono_bin(data.SeriousDlqin2yrs,data.RevolvingUtilizationOfUnsecuredLines)
============================================================ min max sum total rate woe 0 0.000000 0.035034 29333 29926 0.980184 1.298275 1 0.035037 0.176771 29205 29926 0.975907 1.098457 2 0.176777 0.577036 28305 29925 0.945865 0.257613 3 0.577040 50708.000000 24607 29926 0.822262 -1.071254
min | max | sum | total | rate | woe | |
---|---|---|---|---|---|---|
0 | 0.000000 | 0.035034 | 29333 | 29926 | 0.980184 | 1.298275 |
1 | 0.035037 | 0.176771 | 29205 | 29926 | 0.975907 | 1.098457 |
2 | 0.176777 | 0.577036 | 28305 | 29925 | 0.945865 | 0.257613 |
3 | 0.577040 | 50708.000000 | 24607 | 29926 | 0.822262 | -1.071254 |
mono_bin(data.SeriousDlqin2yrs,data.age)
============================================================ min max sum total rate woe 0 21 30 7913 8885 0.890602 -0.506093 1 31 34 6640 7383 0.899363 -0.412828 2 35 38 7594 8386 0.905557 -0.342447 3 39 41 7131 7849 0.908523 -0.307262 4 42 43 4890 5362 0.911973 -0.265031 5 44 46 8163 8868 0.920501 -0.153830 6 47 48 5776 6274 0.920625 -0.152133 7 49 51 8545 9280 0.920797 -0.149768 8 52 53 5454 5901 0.924250 -0.101453 9 54 56 7922 8463 0.936075 0.080980 10 57 59 7517 7946 0.946011 0.260466 11 60 61 4942 5200 0.950385 0.349567 12 62 64 7464 7776 0.959877 0.571844 13 65 68 6968 7212 0.966167 0.748916 14 69 75 7911 8141 0.971748 0.934931 15 76 103 6620 6777 0.976833 1.138606
min | max | sum | total | rate | woe | |
---|---|---|---|---|---|---|
0 | 21 | 30 | 7913 | 8885 | 0.890602 | -0.506093 |
1 | 31 | 34 | 6640 | 7383 | 0.899363 | -0.412828 |
2 | 35 | 38 | 7594 | 8386 | 0.905557 | -0.342447 |
3 | 39 | 41 | 7131 | 7849 | 0.908523 | -0.307262 |
4 | 42 | 43 | 4890 | 5362 | 0.911973 | -0.265031 |
5 | 44 | 46 | 8163 | 8868 | 0.920501 | -0.153830 |
6 | 47 | 48 | 5776 | 6274 | 0.920625 | -0.152133 |
7 | 49 | 51 | 8545 | 9280 | 0.920797 | -0.149768 |
8 | 52 | 53 | 5454 | 5901 | 0.924250 | -0.101453 |
9 | 54 | 56 | 7922 | 8463 | 0.936075 | 0.080980 |
10 | 57 | 59 | 7517 | 7946 | 0.946011 | 0.260466 |
11 | 60 | 61 | 4942 | 5200 | 0.950385 | 0.349567 |
12 | 62 | 64 | 7464 | 7776 | 0.959877 | 0.571844 |
13 | 65 | 68 | 6968 | 7212 | 0.966167 | 0.748916 |
14 | 69 | 75 | 7911 | 8141 | 0.971748 | 0.934931 |
15 | 76 | 103 | 6620 | 6777 | 0.976833 | 1.138606 |
mono_bin(data.SeriousDlqin2yrs,data.MonthlyIncome)
============================================================ min max sum total rate woe 0 0.0 3400.0 27355 30073 0.909620 -0.293996 1 3401.0 5400.0 27655 30008 0.921588 -0.138884 2 5401.0 8200.0 27925 29725 0.939445 0.138736 3 8201.0 49750.0 28515 29897 0.953775 0.423899
min | max | sum | total | rate | woe | |
---|---|---|---|---|---|---|
0 | 0.0 | 3400.0 | 27355 | 30073 | 0.909620 | -0.293996 |
1 | 3401.0 | 5400.0 | 27655 | 30008 | 0.921588 | -0.138884 |
2 | 5401.0 | 8200.0 | 27925 | 29725 | 0.939445 | 0.138736 |
3 | 8201.0 | 49750.0 | 28515 | 29897 | 0.953775 | 0.423899 |
以上這篇淺談pandas.cut與pandas.qcut的使用方法及區別就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。