wangxishi

2020-09-15   阅读量: 11666

Python 数据分析师

求python做等宽分布

扫码加入数据分析学习群

求教,原始数据排序后做等宽分布,怎么实现呢,附文件,添加了所在省份一列,出来的效果想增加按照不同省份分布,效果如图

分布.xlsx

1.png

30.5326 2 15 关注作者 收藏

评论(15)

wangxishi
2020-09-18

好的,谢谢

0.0000 0 0 回复
wangxishi
2020-09-17

【需要数据没重复值才能近似做到】的意思是说,分数排序后,同一个分数只能有一个值吗,那如果同一个分数有2个值,只能用cut等频分?

0.0000 0 0 回复
hunter.Z
2020-09-17

比如有9个数,要分成4个箱,那肯定有一箱是3,所以只能近似做到哈。你的数据里面一共有5000个,但是只有20个取值。做不到等频。这是你数据的取值分布情况。

image.png

0.1133 1 0 回复
wangxishi
2020-09-16

我在往上看qcut是等频分箱,分出来每箱个数都一样,如图,网上这个跟您的代码有什么区别吗,您是怎么做到qcut出来是等距分箱的呢?1.png

0.0000 0 0 回复
hunter.Z
2020-09-17

我上次代码并没有实现等距分箱,如果想实现等距需要用cut方法,除非需要切分的数据没有重复值。

image.png

qcut 也不一定能实现等频(每个箱内数据一样),一般是需要数据没重复值才能近似做到

0.1133 1 0 回复
hunter.Z
2020-09-17

image.png


这段代码的含义如下

image.png

0.1133 1 0 回复
wangxishi
2020-09-16

最后的结果如果我不想除以总数5000,而是‘’北京‘’列下面的的数据显示北京总数的占比,黑龙江列的数据显示的是黑龙江总数的占比,就是分别显示两列总数的占比,怎么做呢

0.0000 0 0 回复
wangxishi
2020-09-16

1,是所有变量都要分箱,但是可能有的变量需要手动调整分箱,可以把不需要手动调整分箱的变量一次性分箱吗

2,之前这行代码temp = df.groupby(["注册时长_y","sf"]).count()['序号'].unstack(1)/5000里面的【注册时长_y】是在哪个位置命名的?【unstack(1)/5000】是什么意思?

3,qcut和cut有什么区别?

谢谢

0.0000 0 0 回复
hunter.Z
2020-09-16

1、从代码角度来说是可以的,只要你能想象出最终数据的样子就能写出代码来。但是分箱有时候还需要结合业务来处理。


2、“注册时长_y”是在执行merge操作时自动生成的,你可以将代码拆分,分步执行看看没执行一行代码带来什么变化。 最后/5000是除以总数,可以算出某种情况占总体的比例,这块可以设置为变量,根据实际总数变化而变化。


3、qcut 与 cut 的详细区别可以查看官方文档。qcut用来实现等宽分箱,cut是根据自己定义的切分点进行分箱。这是两个函数的主要区别。

0.1133 1 0 回复
wangxishi
2020-09-15

还有一个问题,可以一次性跑出所有列的分箱吗

0.0000 0 0 回复
hunter.Z
2020-09-15

1、上一个问题

代码如下

# 导入工具包

import pandas as pd

import numpy as np


# 导入原始数据

df = pd.read_excel("./data/1600139052_431496.xlsx")


# 数据转换

qc = pd.qcut(df.sort_values("注册时长")["注册时长"],q=4) #

df = pd.merge(df,qc,left_index=True,right_index=True) #

temp = df.groupby(["注册时长_y","所在省份"]).count()["序号"].unstack(1)/5000 #

temp["PSI"] = temp.apply(lambda x:(x[1]-x[0])*(np.log10(x[1]/x[0])/np.log10(np.e)),axis=1) # 计算PSI


# 数据存盘

temp.to_excel("result.xlsx")


2、一次性跑出来也是可以的,但不是所有变量都要分箱吧

30.4704 1 0 回复
wangxishi
2020-09-15

我想在最后一列加上每个分箱的psi指标和总的psi,请问怎么加呢

1.png

0.0000 0 0 回复
hunter.Z
2020-09-15

import pandas as pd

df = pd.read_excel("./data/1600139052_431496.xlsx")

qc = pd.qcut(df.sort_values("注册时长")["注册时长"],q=4) # 等宽分箱

df = pd.merge(df,qc,left_index=True,right_index=True) # 拼接数据集

df.groupby(["注册时长_y","所在省份"]).count()["序号"].unstack(1)/5000 #聚合转换


30.4704 1 0 回复
wangxishi
2020-09-15

对,就是这个效果,可以给我下完整代码吗

0.0000 0 0 回复
wangxishi
2020-09-15

之前的解答没有解决我这个区分各省市的问题

0.0000 0 0 回复
hunter.Z
2020-09-15

是类似这样的效果?分箱分的是注册时长image.png

0.0000 0 0 回复
wangxishi
2020-09-15

对,可以给我下完整的代码吗

0.0000 0 0
wangxishi
2020-09-15

想实现分箱后区分出省份的效果,原始数据里面有省份,如图,请问如何操作

1.png

0.0000 0 0 回复
wangxishi
2020-09-15

再补充一下,分箱出来想自动计算好每箱占比,请问怎么操作,如图

1.png


0.0000 0 0 回复
hunter.Z
2020-09-15

这个是想统计每箱的人数。代码可以按如下方式写:

qc.value_counts().sort_index()/5000 # 这里5000是总数量

效果如下:

image.png

如果不是等宽分箱可以自己手动指定宽度。这时需要使用pandas的cut方法。

0.0000 0 0 回复
wangxishi
2020-09-15

想请教下怎么一次性对两列进行分箱,我现在只能单独一列分箱,而且分箱出来每箱的分值从整数变成小数了,我想要整数

效果如图

1.png

0.0000 0 0 回复
hunter.Z
2020-09-15

左边是索引,不是人数。对于分箱后的结果展示,我还是不太懂。如果是想了解每个箱的人数分布可以使用value_counts()来实现。image.png

0.0000 0 0 回复
hunter.Z
2020-09-15

最终想实现的效果是?可以先使用pandas的 sort_values对数据进行排序,然后对排序后的数据使用 qcut 进行切分即可。

0.0000 0 0 回复
wangxishi
2020-09-15

原始文件里面有2列数据,想同时求2列的等宽分箱结果,不想一列一列运行

0.0000 0 0 回复
hunter.Z
2020-09-15

依据哪列数据排序?分箱后的结果想怎么呈现或者使用?

0.0000 0 0 回复

推荐课程