Python中非标量对象分箱及事件A相对变量X的条件概率绘图方案
需求实现方案
你可以直接基于pandas原生功能实现需求,无需引入额外专用库,核心逻辑为分箱+分组聚合两步:
- 用
pandas.cut(等宽分箱)或pandas.qcut(等频分箱)生成X的分箱标签列 - 按分箱标签分组计算每个分箱的总样本数N、事件A发生数p,再按规则计算柱高即可
可运行示例代码
import pandas as pd import matplotlib.pyplot as plt # 示例数据构造,替换为你自己的数据集即可 df = pd.DataFrame({ "x": [1.2, 3.5, 2.1, 4.8, 5.2, 0.9, 3.3, 6.1, 2.9, 4.4]*10, "a": [1,0,1,0,1,0,1,0,1,0]*10 }) # 1. 对X做分箱,bins可传入整数(分箱数量)或自定义分箱边界列表 df["x_bin"] = pd.cut(df["x"], bins=5) # 2. 按分箱分组聚合计算指标 bin_result = df.groupby("x_bin")["a"].agg( N="count", p="sum" ).reset_index() # 3. 计算柱高,处理分母为0的边界情况 bin_result["height"] = bin_result.apply( lambda row: row["p"]/(row["N"] - row["p"]) if row["N"] != row["p"] else 999, # 全为正样本时可自定义填充值 axis=1 ) # 4. 绘制柱形图 plt.bar( x=bin_result["x_bin"].astype(str), height=bin_result["height"] ) plt.xlabel("X分箱区间") plt.ylabel("p/(N-p)") plt.xticks(rotation=30) plt.tight_layout() plt.show()
补充说明
如果有更复杂的分箱需求(比如按业务规则自定义分箱边界),直接修改pd.cut的bins参数即可,聚合逻辑也可以根据你的实际统计规则灵活调整。
内容的提问来源于stack exchange,提问作者Erran
相关产品推荐
相关产品推荐

