如何将Fitter拟合的最优分布传递给Scipy Stats计算各列CDF?
解决方案:将Fitter拟合的最优CDF应用到Pandas多列
核心思路
Fitter返回的最优分布信息可直接对接scipy.stats,通过调用对应分布的cdf方法并传入拟合参数,就能批量计算每列每个值的累积分布函数值。
具体实现步骤
1. 导入依赖库
确保已安装scipy,显式导入所需模块:
import numpy as np import pandas as pd from fitter import Fitter from scipy import stats
2. 定义通用拟合与CDF计算函数
封装单列数据的拟合逻辑,返回可直接计算CDF的函数:
def get_best_cdf_calculator(column_data): # 初始化Fitter,推荐用常用分布提升速度,也可替换为get_distributions() f = Fitter(column_data.dropna().values, distributions=['norminvgauss', 'norm', 'gamma', 'beta']) f.fit() # 获取最优分布名称与参数 best_dist = f.get_best(method='sumsquare_error') dist_name = list(best_dist.keys())[0] dist_params = best_dist[dist_name] # 获取scipy对应分布对象 dist_obj = getattr(stats, dist_name) # 返回绑定参数的CDF计算函数 return lambda x: dist_obj.cdf(x, **dist_params) if pd.notna(x) else np.nan
3. 批量处理所有Value列
遍历目标列,计算并新增CDF结果列:
# 读取数据集 dataset = pd.read_csv("econ.csv") # 筛选所有Value开头的列 value_cols = [col for col in dataset.columns if col.startswith('Value_')] for col in value_cols: # 获取当前列的CDF计算函数 cdf_calc = get_best_cdf_calculator(dataset[col]) # 新增CDF结果列 dataset[f'CDF_BestFit_{col}'] = dataset[col].apply(cdf_calc) # 可选:打印该列的最优分布信息 print(f"列 {col} 最优拟合分布: {list(f.get_best(method='sumsquare_error').keys())[0]}")
4. 最终结果示例
处理后的数据将新增对应CDF列,格式如下:
| ID | Value_1 | CDF_BestFit_Value_1 |
|---|---|---|
| n | 0.9 | 0.33 |
| n+1 | 0.7 | 0.07 |
注意事项
- 缺失值处理:代码中加入了缺失值判断,避免拟合与计算时出错
- 效率优化:使用
get_common_distributions()或手动指定常用分布,比遍历所有分布(get_distributions())速度快很多 - 参数兼容性:Fitter返回的参数与
scipy.stats分布参数完全匹配,直接解包即可使用
内容的提问来源于stack exchange,提问作者Mikal Fischer
相关产品推荐
相关产品推荐

