python 等深分箱 等宽分箱结合二分箱的数据分析

等深分箱等宽分箱概述

Python里可以通过pcut(等深分箱即每箱的样本量基本一致)和cut(等宽分箱即样本量之间有相同的宽度)对样本进行分箱。

详见如下代码部分。本文的数据来自网络,部分代码也有所参照,这里做了注释和延伸,旨在技术交流,如有冒犯之处请联系博主及时处理。

代码演示

#coding:utf-8
import datetime
import pandas as pd
def RFM():trad_flow = pd.read_csv(r'../input/RFM_TRAD_FLOW.csv',encoding="GBK")trad_flow_new = trad_flow.copy()##trad_flow_new['time_new']=trad_flow_new['time'].apply(lambda x :timeFormat(x))trad_flow_new['time_format'] = trad_flow_new.time.apply(timeFormat)##pd.set_option('display.max_rows', 9)pd.set_option('precision', 2) #小数点保留位pd.set_option('display.max_columns', 18) #最大列数pd.set_option('expand_frame_repr', False) #不换行显示pd.set_option('display.width', 200)#横向最多显示的字符数##print(trad_flow_new.head(10))##对用户按照列cumid、type分组,列transID统计数量F = trad_flow_new.groupby(['cumid','type'])[['transID']].count()##print(F.head())##对DataFrame F按照type、transID进行pivot,即行列转换F_trans = pd.pivot_table(F, index='cumid', columns='type', values='transID')##print(F_trans.head())# 计算不包含Normal的数据## 查看returned_goods、Normal 列是否有空值,如果有则用0代替。shape[0]是行数,shape[1]是列数##print(F_trans[F_trans.returned_goods.isnull()].shape[0])#shape[1]## 仅仅对数据列里有NULL的用0来填充##F_trans=F_trans[F_trans.isnull().T.any()].fillna(0)F_trans = F_trans.fillna(0)##F_trans['Special_offer'] = F_trans['Special_offer'].fillna(0) ##单独对列FillNa## 计算兴趣比,这里是 特价/(特价+正常)F_trans['interest'] = F_trans.Special_offer/(F_trans.Special_offer+F_trans.Normal)##print(F_trans.head())#print(trad_flow_new[trad_flow_new['cumid']==19021]) #查看cumid等于19021的明细##顾客价值信息取向M = trad_flow_new.groupby(['cumid','type'])[['amount']].sum()M_trans = pd.pivot_table(M,index='cumid',columns='type',values='amount')M_trans = M_trans.fillna(0)M_trans['value']=M_trans.Normal + M_trans.Special_offer+M_trans.returned_goods##print(M_trans.head(10))trad_flow_new['time_new']=trad_flow_new.time.apply(to_time)R = trad_flow_new.groupby(['cumid'])[['time_new']].max()##print(R.head())from sklearn import preprocessing#这里是等深分箱q即quantile,这里参数是分成两箱。threshold = pd.qcut(F_trans['interest'], 2, retbins=True)[1][1]print("F 值二分类右边界:\t"+str(threshold))#对F dataframe做二分类转换binarizer = preprocessing.Binarizer(threshold=threshold) ## 定义二分类转换器single_row=F_trans['interest'].values.reshape(-1,1) ## 提取interest列到ndarray中,这里-1是指行数未知b_f_interest = pd.DataFrame(binarizer.transform(single_row)) ##通过二分类转换器转换单列并生成DataFrameb_f_interest.index = F_trans.indexb_f_interest.columns=['interest']#对M dataframe的二分类转换threshold = pd.qcut(M_trans['value'], 2, retbins=True)[1][1]print("M 值二分类右边界:\t" + str(threshold))binarizer = preprocessing.Binarizer(threshold=threshold)single_row = M_trans['value'].values.reshape(-1,1)b_m_value = pd.DataFrame(binarizer.transform(single_row))b_m_value.index = M_trans.indexb_m_value.columns=['value']##print(b_m_value.head())#对R dataframe的二分类转换threshold = pd.qcut(R['time_new'],2,retbins=True)[1][1]print("R 值二分类右边界:\t" + str(threshold))binarizer = preprocessing.Binarizer(threshold=threshold)single_row = R.time_new.values.reshape(-1,1)b_r_time= pd.DataFrame(binarizer.transform(single_row))b_r_time.index = R.indexb_r_time.columns=['time']total = pd.concat([b_f_interest,b_m_value,b_r_time],axis=1)##print(total.head())##定义标签,按照FMR 2*2*2 = 8种情况定义出客户标签label = {(0, 0, 0): '无兴趣-低价值-沉默',(1, 0, 0): '有兴趣-低价值-沉默',(1, 0, 1): '有兴趣-低价值-活跃',(0, 0, 1): '无兴趣-低价值-活跃',(0, 1, 0): '无兴趣-高价值-沉默',(1, 1, 0): '有兴趣-高价值-沉默',(1, 1, 1): '有兴趣-高价值-活跃',(0, 1, 1): '无兴趣-高价值-活跃'}total['label'] = total[['interest','value','time']].apply(lambda x:label[((x[0],x[1],x[2]))], axis = 1)print(total.head())def timeFormat(Str):import datetimereturn datetime.datetime.strptime(Str,'%d%b%y:%H:%M:%S')def to_time(t):import timeout_t=time.mktime(time.strptime(t, '%d%b%y:%H:%M:%S'))   ##转换为数字类型(即与1970-1-1 8:00:00的秒数差值)方便后面qcut分箱return out_tdef boxsplit():F_x = pd.DataFrame(data={'age': [18, 19, 23, 25, 27, 29,34,45]})''' Method 1 等宽分箱,宽度 w= (Max-Min)/N 即 (45-18)/3= 9,则每个分箱的右边界为 Min+(N-1)*w第一个分箱的边界是 18+9*1=27、第二个分箱的边界是 18+9*2=36、第三个分箱的边界是 18+9*3=45'''##print(pd.cut(F_x['age'], 3))print(pd.cut(F_x['age'], 3).value_counts())'''  Method 2 等深分箱(等频分箱),先通过分位数计算各个分位数对应的临界值,再"等"分数据'''print(F_x.age.quantile([0, 1 / 3, 2 / 3, 1]))#print(pd.qcut(F_x['age'], 3, retbins=True))print(pd.qcut(F_x['age'], 3).value_counts())'''通过观察不难发现等深分箱每组的数量基本一致 而等宽分箱每组的数量可能差距较大''''''卡方合并法(待补充)'''
def baseTime():import timet = (1970, 1, 1, 8, 0, 0, 3, 1, 0)secs = time.mktime(t)print("time.mktime(t) : %f" % secs)print("asctime(localtime(secs)): %s" % time.asctime(time.localtime(secs)))if __name__ == '__main__':#print(timeFormat('14MAY10:13:31:23'))RFM()#a="14JUN09:17:58:34"#print(to_time(a))boxsplit()baseTime()

执行结果:

"F:\Program Files\Python37\python.exe" E:/DevData/GiteePython/com/shenl/ml/RFM/RFM.py
F 值二分类右边界:    0.08333333333333333
M 值二分类右边界:    2944.5
R 值二分类右边界:    1284373750.0
       interest  value  time       label
cumid                                   
10001       1.0    1.0   1.0  有兴趣-高价值-活跃
10002       0.0    0.0   0.0  无兴趣-低价值-沉默
10003       0.0    1.0   0.0  无兴趣-高价值-沉默
10004       1.0    1.0   0.0  有兴趣-高价值-沉默
10005       0.0    0.0   0.0  无兴趣-低价值-沉默
(17.973, 27.0]    5
(27.0, 36.0]      2
(36.0, 45.0]      1
Name: age, dtype: int64
0.00    18.00
0.33    23.67
0.67    28.33
1.00    45.00
Name: age, dtype: float64
(28.333, 45.0]      3
(17.999, 23.667]    3
(23.667, 28.333]    2
Name: age, dtype: int64
time.mktime(t) : 0.000000
asctime(localtime(secs)): Thu Jan  1 08:00:00 1970

Process finished with exit code 0

python 等深分箱 等宽分箱结合二分箱的数据分析相关推荐

  1. 等距离分箱matlab代码,数据挖掘实验(二)数据预处理【等深分箱与等宽分箱】...

    本文代码均已在 MATLAB R2019b 测试通过,如有错误,欢迎指正. 一.分箱平滑的原理 (1)分箱方法 在分箱前,一定要先排序数据,再将它们分到等深(等宽)的箱中. 常见的有两种分箱方法:等深 ...

  2. python分箱代码_python分箱_python 分箱_python等宽分箱 - 云+社区 - 腾讯云

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我有一个数据框列与数字值: df.head()46. 544.2100.042. ...

  3. 等宽分箱_数据分析师-数据挖掘如何分箱以及对箱子中的数据进行平滑处理

    题干: 假定用于分析的数据包含属性age.数据元组中age的值如下(按递增序):13,15,16,16,19,20,20,21,22,22, 25,25,25,30,33,33,35,35,36,40 ...

  4. 机器学习特征工程之连续变量离散化:等宽分箱

    机器学习特征工程之连续变量离散化:等宽分箱 离散化,就是把无限空间中有限的个体映射到有限的空间中: 根据用户的听音乐的数据来预测哪些歌曲更受欢迎. 假设大部分人听歌都很平均,会不停的听新的歌曲,但是有 ...

  5. python woe分箱_python自动分箱,计算woe,iv的实例代码

    笔者之前用R开发评分卡时,需要进行分箱计算woe及iv值,采用的R包是smbinning,它可以自动进行分箱.近期换用python开发, 也想实现自动分箱功能,找到了一个woe包,地址https:// ...

  6. python决策树分箱_快速分箱方法

    python 分箱的一种方法 2018.08.02 R语言中有smbining可以进行最优分箱,python中分箱如果既要考虑箱体个数,分箱后信息量大小,也要考虑单调性等其他因素. 这里给出一种简单的 ...

  7. java设计一个立方体类box_实例1: 设计一个立方体类Box,定义三个属性,分别是长,宽,高。定义二个方法,分别计算并输出立方体的体积和表面积。_学小易找答案...

    [填空题]表达式 list(filter(lambda x:x>2, [0,1,2,3,0,0])) 的值为 _________ . [填空题]表达式 len(' 中国 '.encode('ut ...

  8. 特征工程之特征分箱(决策树分箱、卡方分箱、bestks以及评价标准WOE和IV)

    特征工程之特征分箱:决策树分箱.卡方分箱.bestks以及评价标准 1.WOE和IV 2.无监督分箱 2.1等频分箱 2.2等距分箱 3.有监督分箱 3.1决策树分箱 3.2best-ks分箱 3.3 ...

  9. 【教学类-06-03】20220327 X以内数字分合题(分)及生成word 打印docx纸(方法一)(Python VS )

    本代码价值: 终端生成的列表 通过TXT文本转换成docx文件 征文需求: 3月上海疫情隔离开启居家办公生涯.月底区教育局有一个"工具运用"的征文比赛,阿夏以<设计Pytho ...

最新文章

  1. 用python中函数输出杨辉三角_用Python输出一个杨辉三角的例子
  2. 如何发表顶级期刊论文
  3. 2小时撸完代码之后,所有程序员都逃不过的一天... (强共鸣)
  4. PHP WEB程序设计信息表,PHP WEB程序设计
  5. hdu 4738 桥
  6. 一行代码,揭开 CPU 执行原理!
  7. ROS 创建msg和srv 编写发布者和订阅者节点 编写服务端和客户端节点(python版本)
  8. iphonex如何关机_历时一个月,跨越一千里,我找回了在澳门被偷的iphoneX
  9. 姿态估计 | OpenPose Plus值得期待
  10. 等保2.0丨2021 必须了解的40个问题
  11. java pdf分页显示,java读取pdf(可分页读取)
  12. Spring.NET教程(三)——对象的创建(基础篇)
  13. Xcode 与 macOS 系统版本的兼容问题
  14. Android 串口蓝牙通信开发Java版本
  15. ubuntu20.04安装matlab2018b
  16. 形式语言与自动机 Part 3.有限自动机
  17. css 优惠券样式大全
  18. label标签 的使用与作用
  19. 解决Themida加壳程序在VMware虚拟机无法运行问题_HS_TMD 开游戏
  20. 大话铁道部12306订票系统云架构

热门文章

  1. vue element-ui引入第三方图标
  2. 校园网内两台PC无法ping通的问题
  3. 《SQL Server 2008从入门到精通》--20180717
  4. 2345PHP面试有几轮,2345的PHP面试题
  5. 阿里巴巴阿外:客服全链路智能解决方案
  6. Dalvik字节码类型对照表
  7. 使用手环代替NFC标签实现多屏协同
  8. 灵图天行者9 pc版_2019十款优化最佳的PC游戏!第一还是冷饭
  9. 页面下载器(我的Java爬虫之一)
  10. PLC 硬件接线扫盲篇