我在往上看qcut是等频分箱,分出来每箱个数都一样,如图,网上这个跟您的代码有什么区别吗,您是怎么做到qcut出来是等距分箱的呢?
wangxishi
2020-09-16
最后的结果如果我不想除以总数5000,而是‘’北京‘’列下面的的数据显示北京总数的占比,黑龙江列的数据显示的是黑龙江总数的占比,就是分别显示两列总数的占比,怎么做呢
wangxishi
2020-09-16
之前网上看到过关于该问题的解决方法,链接:https://www.jianshu.com/p/a1241683ae45
羊羊羊123#
2020-09-16
1、从代码角度来说是可以的,只要你能想象出最终数据的样子就能写出代码来。但是分箱有时候还需要结合业务来处理。
2、“注册时长_y”是在执行merge操作时自动生成的,你可以将代码拆分,分步执行看看没执行一行代码带来什么变化。 最后/5000是除以总数,可以算出某种情况占总体的比例,这块可以设置为变量,根据实际总数变化而变化。
3、qcut 与 cut 的详细区别可以查看官方文档。qcut用来实现等宽分箱,cut是根据自己定义的切分点进行分箱。这是两个函数的主要区别。
wangxishi
2020-09-16
1,是所有变量都要分箱,但是可能有的变量需要手动调整分箱,可以把不需要手动调整分箱的变量一次性分箱吗
2,之前这行代码temp = df.groupby(["注册时长_y","sf"]).count()['序号'].unstack(1)/5000里面的【注册时长_y】是在哪个位置命名的?【unstack(1)/5000】是什么意思?
3,qcut和cut有什么区别?
谢谢
wangxishi
2020-09-16
感觉应该是数据的问题,方便把数据以及代码发过来吗?
liunan-0226
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、一次性跑出来也是可以的,但不是所有变量都要分箱吧
wangxishi
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 #聚合转换
wangxishi
2020-09-15
这个是想统计每箱的人数。代码可以按如下方式写:
qc.value_counts().sort_index()/5000 # 这里5000是总数量
效果如下:
如果不是等宽分箱可以自己手动指定宽度。这时需要使用pandas的cut方法。
wangxishi
2020-09-15
一句话概括all 和all selected的区别:all 即是all,计算总合计值,使得所有筛选(包含维度筛选以及切片器筛选)失效
ged_2357
2020-09-15