首页 > 解决方案 > 从另一个类的方法动态创建 scipy.stats 分布

问题描述

我创建了一个代表统计模拟的类。其中一个方面是p值的分布,并且该类包含表征该分布的方法:

class Simulation:
    ...
    def pdf_p(self, p):
        ...
    def cdf_p(self, p):
        ...
    def ppf_p(self, P):
        ...
    def rvs_p(self, size):
        ...

我现在想将该分布也公开为scipy.stats-style 分布对象。为此__init__,我的类的方法包含一个语句

self.p = PValueDist(self.pdf_p, self.cdf_p, self.ppf_p, self.rvs_p)

其中类PValueDist定义为

from scipy.stats import rv_continuous

class PValueDist (rv_continuous):
    def __init__(self, pdf, cdf, ppf, rvs):
        self._pdf = pdf
        self._cdf = cdf
        self._ppf = ppf
        self._rvs = rvs
        super().__init__(self)

这似乎可行,但我想知道这是否是正确规范的方式?

当然,我也可以创建Simulation一个子类rv_continuous并重命名我的方法。然而,模拟包含几个不同的分布,用其中一个来识别模拟在语义上似乎不正确。

标签: pythonscipyscipy.stats

解决方案


似乎还可以。需要注意的几件事:1) scipy.stats 分发是实例,所以不要忘记创建一个,2) 如果支持不是默认的 ((0, inf) IIRC),请将它们设置在 __init__ 中。


推荐阅读