1. 程式人生 > 程式設計 >基於python 等頻分箱qcut問題的解決

基於python 等頻分箱qcut問題的解決

在python 較新的版本中,pandas.qcut()這個函式中是有duplicates這個引數的,它能解決在等頻分箱中遇到的重複值過多引起報錯的問題;

在比較舊版本的python中,提供一下解決辦法:

import pandas as pd
 
def pct_rank_qcut(series,n):
  '''
  series:要分箱的列
  n:箱子數
  '''
  edages = pd.series([i/n for i in range(n)] # 轉換成百分比
  func = lambda x: (edages >= x).argmax() #函式:(edages >= x)返回fasle/true列表中第一次出現true的索引值
  return series.rank(pct=1).astype(float).apply(func) #series.rank(pct=1)每個值對應的百分位數,最終返回對應的組數;rank()函式傳入的資料型別若為object,結果會有問題,因此進行了astype

補充拓展:Python資料離散化:等寬及等頻

在處理資料時,我們往往需要將連續性變數進行離散化,最常用的方式便是等寬離散化,等頻離散化,在此處我們討論離散化的概念,只給出在python中的實現以供參考

1. 等寬離散化

使用pandas中的cut()函式進行劃分

import numpy as np
import pandas as pd
 
# Discretization: Equal Width #
# Datas: Sample * Feature
def Discretization_EqualWidth(K,Datas,FeatureNumber):
  DisDatas = np.zeros_like(Datas)
  for i in range(FeatureNumber):
    DisOneFeature = pd.cut(Datas[:,i],K,labels=range(1,K+1))
    DisDatas[:,i] = DisOneFeature
  return DisDatas

2. 等頻離散化

pandas中有qcut()可以使用,但是邊界易出現重複值,如果為了刪除重複值設定 duplicates=‘drop',則易出現於分片個數少於指定個數的問題,因此在此處不使用qcut()

import numpy as np
import pandas as pd
 
# Discretization: Equal Frequency #
# vector: single feature
def Rank_qcut(vector,K):
  quantile = np.array([float(i) / K for i in range(K + 1)]) # Quantile: K+1 values
  funBounder = lambda x: (quantile >= x).argmax()
  return vector.rank(pct=True).apply(funBounder)
 
# Discretization: Equal Frequency #
# Datas: Sample * Feature
def Discretization_EqualFrequency(K,FeatureNumber):
  DisDatas = np.zeros_like(Datas)
  w = [float(i) / K for i in range(K + 1)]
  for i in range(FeatureNumber):
    DisOneFeature = Rank_qcut(pd.Series(Datas[:,i]),K)
    #print(DisOneFeature)
    DisDatas[:,i] = DisOneFeature
  return DisDatas

以上這篇基於python 等頻分箱qcut問題的解決就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。