小編最近入坑風控,在工作中需要對數據進行等頻率切分,也就是將數據划分成幾段,在每段中,數據的出現頻率,出現次數是大致相同的,讓數據集在每段上呈現出分布均勻的趨勢。
小編先是想到df.describe
cutlist = data[col].describe()
出來的結果是:
描述結果分別就是 計數,均值,標准差,最小,四分位數,最大值
我要的是十分位,那就要借助describe的參數percentiles 了,percentiles 中可以存放切分點的列表
cutlist = data[col].describe(percentiles = [1.0*i/k for i in range(k+1)])
這時候就有十分位數了,再將十分位數取出來,但這個時候會遇到一個問題,在 cutlist["0%":"100%"] 之中,有一些重復的值,比如0%到30%的分位數都是0 ,這樣子來做切分數據,是會出錯,所以應該對數據進行去重
cutdata = pd.DataFrame(pd.cut(data[score],cutlist["0%":"100%"],include_lowest=True))
后來小編發現一個更加好用的函數 quantile ,順便用drop_duplicates(keep="last") 去重並保留最后一個重復值
cutlist = data[col].quantile([1.0*i/k for i in range(k+1)],interpolation= "lower").drop_duplicates(keep="last")
quantile值得注意的是他的參數 interpolation ( 插值方法 當所需分位數位於兩個數據點i和j之間時,這個可選參數指定要使用的插值方法: ) ,可填選的值為 :‘linear’, ‘lower’, ‘higher’, ‘midpoint’, ‘nearest’
官方文檔的解釋是:
linear :i + (j - i) *分數,其中分數是索引中被 i 和 j 包圍的小數部分。
lower: i.
higher: j.
nearest: i or j 取最近的
midpoint: (i + j) / 2. 取中位數
如果不指定插值方法,當出現無法判斷的情況時,是不會進行插值的
linear的插值方法example:
比如0.166666 是介於 (0.000000,0.166667 ] 之間 ,索引中被 i 和 j 包圍的小數部分就是 0.3和0.4之間的小數部分0.4 ,那么
0.000000+(0.166667 - 0.000000)* 0.4 = 0.0666668
介於(0.000000,0.166667 ] 即被分到(0.000000,0.166667 ] 這段之間了。
以上是小編的想法,僅供參考,有任何新想法歡迎和我討論!