python分箱函數(shù) python等頻分箱

python中的split函數(shù)的用法是什么?

class Calculator(Exception):

我們一直強(qiáng)調(diào)成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)對于企業(yè)的重要性,如果您也覺得重要,那么就需要我們慎重對待,選擇一個(gè)安全靠譜的網(wǎng)站建設(shè)公司,企業(yè)網(wǎng)站我們建議是要么不做,要么就做好,讓網(wǎng)站能真正成為企業(yè)發(fā)展過程中的有力推手。專業(yè)網(wǎng)站制作公司不一定是大公司,創(chuàng)新互聯(lián)作為專業(yè)的網(wǎng)絡(luò)公司選擇我們就是放心。

try:

x = input('Enter the first number:')

y = input('Enter the second number:')

print(int(x)/int(y))

except ZeroDivisionError:

print('The second number cannot be Zero')

except ValueError: #int方法拋出的是ValueError,所以使用TypeError是捕獲不到異常的

print('That wasn\'t a number')

執(zhí)行方法:

Python在執(zhí)行時(shí),首先會將.py文件中的源代碼編譯成Python的byte code(字節(jié)碼),然后再由Python Virtual Machine(Python虛擬機(jī))來執(zhí)行這些編譯好的byte code。這種機(jī)制的基本思想跟Java,.NET是一致的。

然而,Python Virtual Machine與Java或.NET的Virtual Machine不同的是,Python的Virtual Machine是一種更高級的Virtual Machine。

這里的高級并不是通常意義上的高級,不是說Python的Virtual Machine比Java或.NET的功能更強(qiáng)大,而是說和Java 或.NET相比,Python的Virtual Machine距離真實(shí)機(jī)器的距離更遠(yuǎn)。

python用卡方檢驗(yàn),自動分箱,結(jié)果是否可靠有待驗(yàn)證

def calc_chiSquare(sampleSet, feature, target):

'''

計(jì)算某個(gè)特征每種屬性值的卡方統(tǒng)計(jì)量

params:

? ? sampleSet: 樣本集

? ? feature: 目標(biāo)特征

? ? target: 目標(biāo)Y值 (0或1) Y值為二分類變量

return:

? ? 卡方統(tǒng)計(jì)量dataframe

? ? feature: 特征名稱

? ? act_target_cnt: 實(shí)際壞樣本數(shù)

? ? expected_target_cnt:期望壞樣本數(shù)

? ? chi_square:卡方統(tǒng)計(jì)量

'''

# 計(jì)算樣本期望頻率

target_cnt = sampleSet[target].sum()

sample_cnt = len(sampleSet[target])

expected_ratio = target_cnt * 1.0/sample_cnt

# 對變量按屬性值從大到小排序

df = sampleSet[[feature, target]]

col_value = list(set(df[feature]))?

# 計(jì)算每一個(gè)屬性值對應(yīng)的卡方統(tǒng)計(jì)量等信息

chi_list = []; target_list = []; expected_target_list = []

for value in col_value:

? ? df_target_cnt = df.loc[df[feature] == value, target].sum()

? ? df_cnt = len(df.loc[df[feature] == value, target])

? ? expected_target_cnt = df_cnt * expected_ratio

? ? chi_square = (df_target_cnt - expected_target_cnt)**2 / expected_target_cnt

? ? chi_list.append(chi_square)

? ? target_list.append(df_target_cnt)

? ? expected_target_list.append(expected_target_cnt)

# 結(jié)果輸出到dataframe, 對應(yīng)字段為特征屬性值, 卡方統(tǒng)計(jì)量, 實(shí)際壞樣本量, 期望壞樣本量

chi_stats = pd.DataFrame({feature:col_value, 'chi_square':chi_list,

? ? ? ? ? ? ? ? ? ? ? ? ? 'act_target_cnt':target_list, 'expected_target_cnt':expected_target_list})

return chi_stats[[feature, 'act_target_cnt', 'expected_target_cnt', 'chi_square']]

def chiMerge_maxInterval(chi_stats, feature, maxInterval=5):

'''

卡方分箱合并--最大區(qū)間限制法

params:

? ? chi_stats: 卡方統(tǒng)計(jì)量dataframe

? ? feature: 目標(biāo)特征

? ? maxInterval:最大分箱數(shù)閾值

return:

? ? 卡方合并結(jié)果dataframe, 特征分割split_list

'''

group_cnt = len(chi_stats)

split_list = [chi_stats[feature].min()]

# 如果變量區(qū)間超過最大分箱限制,則根據(jù)合并原則進(jìn)行合并

while(group_cnt maxInterval):

? ? min_index = chi_stats[chi_stats['chi_square']==chi_stats['chi_square'].min()].index.tolist()[0]

? ? # 如果分箱區(qū)間在最前,則向下合并

? ? if min_index == 0:

? ? ? ? chi_stats = merge_chiSquare(chi_stats, min_index+1, min_index)

? ? # 如果分箱區(qū)間在最后,則向上合并

? ? elif min_index == group_cnt-1:

? ? ? ? chi_stats = merge_chiSquare(chi_stats, min_index-1, min_index)

? ? # 如果分箱區(qū)間在中間,則判斷與其相鄰的最小卡方的區(qū)間,然后進(jìn)行合并

? ? else:

? ? ? ? if chi_stats.loc[min_index-1, 'chi_square'] chi_stats.loc[min_index+1, 'chi_square']:

? ? ? ? ? ? chi_stats = merge_chiSquare(chi_stats, min_index, min_index+1)

? ? ? ? else:

? ? ? ? ? ? chi_stats = merge_chiSquare(chi_stats, min_index-1, min_index)

? ? group_cnt = len(chi_stats)

chiMerge_result = chi_stats

split_list.extend(chiMerge_result[feature].tolist())

return chiMerge_result, split_list

def chiMerge_minChiSquare(chi_stats, feature, dfree=4, cf=0.1, maxInterval=5):

'''

卡方分箱合并--卡方閾值法

params:

? ? chi_stats: 卡方統(tǒng)計(jì)量dataframe

? ? feature: 目標(biāo)特征

? ? maxInterval: 最大分箱數(shù)閾值, default 5

? ? dfree: 自由度, 最大分箱數(shù)-1, default 4

? ? cf: 顯著性水平, default 10%

return:

? ? 卡方合并結(jié)果dataframe, 特征分割split_list

'''

threshold = get_chiSquare_distuibution(dfree, cf)

min_chiSquare = chi_stats['chi_square'].min()

group_cnt = len(chi_stats)

split_list = [chi_stats[feature].min()]

# 如果變量區(qū)間的最小卡方值小于閾值,則繼續(xù)合并直到最小值大于等于閾值

while(min_chiSquare threshold and group_cnt maxInterval):

? ? min_index = chi_stats[chi_stats['chi_square']==chi_stats['chi_square'].min()].index.tolist()[0]

? ? # 如果分箱區(qū)間在最前,則向下合并

? ? if min_index == 0:

? ? ? ? chi_stats = merge_chiSquare(chi_stats, min_index+1, min_index)

? ? # 如果分箱區(qū)間在最后,則向上合并

? ? elif min_index == group_cnt-1:

? ? ? ? chi_stats = merge_chiSquare(chi_stats, min_index-1, min_index)

? ? # 如果分箱區(qū)間在中間,則判斷與其相鄰的最小卡方的區(qū)間,然后進(jìn)行合并

? ? else:

? ? ? ? if chi_stats.loc[min_index-1, 'chi_square'] chi_stats.loc[min_index+1, 'chi_square']:

? ? ? ? ? ? chi_stats = merge_chiSquare(chi_stats, min_index, min_index+1)

? ? ? ? else:

? ? ? ? ? ? chi_stats = merge_chiSquare(chi_stats, min_index-1, min_index)

? ? min_chiSquare = chi_stats['chi_square'].min()

? ? group_cnt = len(chi_stats)

chiMerge_result = chi_stats

split_list.extend(chiMerge_result[feature].tolist())

return chiMerge_result, split_list

def get_chiSquare_distuibution(dfree=4, cf=0.1):

'''

根據(jù)自由度和置信度得到卡方分布和閾值

params:

? ? dfree: 自由度, 最大分箱數(shù)-1, default 4

? ? cf: 顯著性水平, default 10%

return:

? ? 卡方閾值

'''

percents = [0.95, 0.90, 0.5, 0.1, 0.05, 0.025, 0.01, 0.005]

df = pd.DataFrame(np.array([chi2.isf(percents, df=i) for i in range(1, 30)]))

df.columns = percents

df.index = df.index+1

# 顯示小數(shù)點(diǎn)后面數(shù)字

pd.set_option('precision', 3)

return df.loc[dfree, cf]

def merge_chiSquare(chi_result, index, mergeIndex, a = 'expected_target_cnt',

? ? ? ? ? ? ? ? b = 'act_target_cnt', c = 'chi_square'):

'''

params:

? ? chi_result: 待合并卡方數(shù)據(jù)集

? ? index: 合并后的序列號

? ? mergeIndex: 需合并的區(qū)間序號

? ? a, b, c: 指定合并字段

return:

? ? 分箱合并后的卡方dataframe

'''

chi_result.loc[mergeIndex, a] = chi_result.loc[mergeIndex, a] + chi_result.loc[index, a]

chi_result.loc[mergeIndex, b] = chi_result.loc[mergeIndex, b] + chi_result.loc[index, b]

chi_result.loc[mergeIndex, c] = (chi_result.loc[mergeIndex, b] - chi_result.loc[mergeIndex, a])**2 /chi_result.loc[mergeIndex, a]

chi_result = chi_result.drop([index])

chi_result = chi_result.reset_index(drop=True)

return chi_result

for col in bin_col:

chi_stats = calc_chiSquare(exp_f_data_label_dr, col, 'label')

chiMerge_result, split_list = chiMerge_maxInterval(chi_stats, col, maxInterval=5)

print(col, 'feature maybe split like this:', split_list)

如何用python編寫一個(gè)求分段函數(shù)的值的程序

1、首先打開python的編輯器軟件,編輯器的選擇可以根據(jù)自己的喜好,之后準(zhǔn)備好一個(gè)空白的python文件:

2、接著在空白的python文件上編寫python程序,這里假設(shè)當(dāng)x>1的時(shí)候,方程為根號下x加4,當(dāng)x-1時(shí),方程為5乘以x的平方加3。所以在程序的開始需要引入math庫,方便計(jì)算平方和開方,之后在函數(shù)體重寫好表達(dá)式就可以了,最后調(diào)用一下函數(shù),將結(jié)果打印出來:

3、最后點(diǎn)擊軟件內(nèi)的綠色箭頭,運(yùn)行程序,在下方可以看到最終計(jì)算的結(jié)果,以上就是python求分段函數(shù)的過程:

【Python】split()函數(shù)

Python中有split()和os.path.split()兩個(gè)函數(shù),具體作用如下:

split():拆分字符串,通過指定分隔符對字符串進(jìn)行切片,并返回分割后的字符串列表(list)

os.path.split():按照路徑將文件名和路徑分割開

一、函數(shù)說明

1、split()函數(shù)

語法:str.split(str="",num=string.count(str))[n]

參數(shù)說明:

str:表示為分隔符,默認(rèn)為空格,但是不能為空('')。若字符串中沒有分隔符,則把整個(gè)字符串作為列表的一個(gè)元素

num:表示分割次數(shù)。如果存在參數(shù)num,則僅分隔成 num+1 個(gè)子字符串,并且每一個(gè)子字符串可以賦給新的變量

[n]:表示選取第n個(gè)分片

注意:當(dāng)使用空格作為分隔符時(shí),對于中間為空的項(xiàng)會自動忽略

2、os.path.split()函數(shù)

語法:os.path.split('PATH')

參數(shù)說明:

1.PATH指一個(gè)文件的全路徑作為參數(shù):

2.如果給出的是一個(gè)目錄和文件名,則輸出路徑和文件名

3.如果給出的是一個(gè)目錄名,則輸出路徑和為空文件名

二、分離字符串

string = ""

1.以'.'為分隔符

print(string.split('.'))

['www', 'gziscas', 'com', 'cn']

2.分割兩次

print(string.split('.',2))

['www', 'gziscas', 'com.cn']

3.分割兩次,并取序列為1的項(xiàng)

print(string.split('.',2)[1])

gziscas

4.分割兩次,并把分割后的三個(gè)部分保存到三個(gè)文件

u1, u2, u3 =string.split('.',2)

print(u1)——?www

print(u2)——?gziscas

print(u3) ——com.cn

三、分離文件名和路徑

import os

print(os.path.split('/dodo/soft/python/'))

('/dodo/soft/python', '')

print(os.path.split('/dodo/soft/python'))

('/dodo/soft', 'python')

四、實(shí)例

str="hello boy[]byebye"

print(str.split("[")[1].split("]")[0])

python最優(yōu)分箱中woe計(jì)算(求大圣)

list =[None,None,None,None,"a","b","c",None,"d",12,None,2,4,5,4] list = list[4:] len(list)11 list['a', 'b', 'c', None, 'd', 12, None, 2, 4, 5, 4]#如果你的list 格式是相同的 比如前面4個(gè)都是None,這個(gè)格式是固定的,那么切片很容易解決

如何在python中實(shí)現(xiàn)數(shù)據(jù)的最優(yōu)分箱

Monotonic Binning with Python

Monotonic binning is a data preparation technique widely used in scorecard development and is usually implemented with SAS. Below is an attempt to do the monotonic binning with python.

Python Code:

# import packages

import pandas as pd

import numpy as np

import scipy.stats.stats as stats

# import data

data = pd.read_csv("/home/liuwensui/Documents/data/accepts.csv", sep = ",", header = 0)

# define a binning function

def mono_bin(Y, X, n = 20):

# fill missings with median

X2 = X.fillna(np.median(X))

r = 0

while np.abs(r) 1:

d1 = pd.DataFrame({"X": X2, "Y": Y, "Bucket": pd.qcut(X2, n)})

d2 = d1.groupby('Bucket', as_index = True)

r, p = stats.spearmanr(d2.mean().X, d2.mean().Y)

n = n - 1

d3 = pd.DataFrame(d2.min().X, columns = ['min_' + X.name])

d3['max_' + X.name] = d2.max().X

d3[Y.name] = d2.sum().Y

d3['total'] = d2.count().Y

d3[Y.name + '_rate'] = d2.mean().Y

d4 = (d3.sort_index(by = 'min_' + X.name)).reset_index(drop = True)

print "=" * 60

print d4

mono_bin(data.bad, data.ltv)

mono_bin(data.bad, data.bureau_score)

mono_bin(data.bad, data.age_oldest_tr)

mono_bin(data.bad, data.tot_tr)

mono_bin(data.bad, data.tot_income)

Output:

============================================================

min_ltv max_ltv bad total bad_rate

0 0 83 88 884 0.099548

1 84 92 137 905 0.151381

2 93 98 175 851 0.205640

3 99 102 173 814 0.212531

4 103 108 194 821 0.236297

5 109 116 194 769 0.252276

6 117 176 235 793 0.296343

============================================================

min_bureau_score max_bureau_score bad total bad_rate

0 443 630 325 747 0.435074

1 631 655 242 721 0.335645

2 656 676 173 721 0.239945

3 677 698 245 1059 0.231350

4 699 709 64 427 0.149883

5 710 732 73 712 0.102528

6 733 763 53 731 0.072503

7 764 848 21 719 0.029207

============================================================

min_age_oldest_tr max_age_oldest_tr bad total bad_rate

0 1 59 319 987 0.323202

1 60 108 235 975 0.241026

2 109 142 282 1199 0.235196

3 143 171 142 730 0.194521

4 172 250 125 976 0.128074

5 251 588 93 970 0.095876

============================================================

min_tot_tr max_tot_tr bad total bad_rate

0 0 8 378 1351 0.279793

1 9 13 247 1025 0.240976

2 14 18 240 1185 0.202532

3 19 25 165 1126 0.146536

4 26 77 166 1150 0.144348

============================================================

min_tot_income max_tot_income bad total bad_rate

0 0.00 2000.00 323 1217 0.265407

1 2002.00 2916.67 259 1153 0.224631

2 2919.00 4000.00 226 1150 0.196522

3 4001.00 5833.33 231 1186 0.194772

4 5833.34 8147166.66 157 1131 0.138815

網(wǎng)站名稱:python分箱函數(shù) python等頻分箱
網(wǎng)頁地址:http://muchs.cn/article38/doodspp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計(jì)公司、搜索引擎優(yōu)化、網(wǎng)站建設(shè)做網(wǎng)站、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)