python 等頻率切分數據


小編最近入坑風控,在工作中需要對數據進行等頻率切分,也就是將數據划分成幾段,在每段中,數據的出現頻率,出現次數是大致相同的,讓數據集在每段上呈現出分布均勻的趨勢。

小編先是想到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 ]  這段之間了。

以上是小編的想法,僅供參考,有任何新想法歡迎和我討論!

 










免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM