You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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列,格式如下:

IDValue_1CDF_BestFit_Value_1
n0.90.33
n+10.70.07

注意事项

  • 缺失值处理:代码中加入了缺失值判断,避免拟合与计算时出错
  • 效率优化:使用get_common_distributions()或手动指定常用分布,比遍历所有分布(get_distributions())速度快很多
  • 参数兼容性:Fitter返回的参数与scipy.stats分布参数完全匹配,直接解包即可使用

内容的提问来源于stack exchange,提问作者Mikal Fischer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:24:27