[SciPy-Dev] `a` and `b` attributes of the stats distributions

Ralf Gommers ralf.gommers at gmail.com
Sun Jul 7 17:18:20 EDT 2013


On Sun, Jul 7, 2013 at 8:36 PM, Warren Weckesser <warren.weckesser at gmail.com
> wrote:

> I've been working on a pull request for one of the distributions in the
> stats module, and as often happens, this has lead to the urge to do some
> more clean up.
>
> The distributions defined in stats/distributions.py have attributes `a`
> and `b` that give the lower and upper ends of the support of the
> distribution (i.e. outside of [a, b], the PDF is 0).  A problem with this
> API is that for many distributions, the support depends on the parameters.
> Currently, this is handled in many of the distributions by modifying self.a
> and self.b in the _argcheck() method (I guess under the assumption that any
> method that needs `a` and `b` will have called `_argcheck()` at some point).
>
> This leads to stateful behavior such as:
>
>     In [1]: from scipy.stats import genpareto
>
>     In [2]: genpareto.b     # Initially b is inf.
>     Out[2]: inf
>
>     In [3]: genpareto.cdf(0, -2)
>     Out[3]: 0.0
>
>     In [4]: genpareto.b     # Now b is 0.5 (as a scalar array)
>     Out[4]: array(0.5)
>
>     In [5]: genpareto.cdf(0, 1)
>     Out[5]: 0.0
>
>     In [6]: genpareto.b
>     Out[6]: array(inf)      # b is back to inf, but as a scalar array.
>
> This API is ugly, and I'd like to fix it.
>
> To start, I think there should be a method `_support`:
>
>     def _support(self, *args):
>         """Returns a tuple (a,b) that gives the support of the
> distribution."""
>         ...
>

The private methods shouldn't use ``*args``. Better would be to follow the
pattern of pdf & co: a public method support() which defaults to -inf/inf,
and an optional private method _support() which takes the correct fixed
shape parameters.



> All the distributions would be modified to call `self._support(...)` to
> get `a` and `b` instead of using the attributes `self.a` and `self.b`.
> (The method could be public--I just defaulted to private while working out
> the appropriate API.)
>
> It would be nice to get rid of `a` and `b` entirely, but they are
> currently public attributes, so I don't think we can simply remove them.
>

Backwards compatibility does seem to be a problem here. Not sure what the
best solution is.

Another issue is that self.a and self.b are used inside private methods,
which themselves may not have the correct info to call support() again.
Probably all fixable, but could be some work. The code will also become a
little more verbose.

Ralf
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/scipy-dev/attachments/20130707/a67f5100/attachment.html>


More information about the SciPy-Dev mailing list