Implement a new column distribution¶
You are not limited to use only the distributions that are currently
implemented in edo
.
Say, for example, you wanted to implement a triangular distribution class. The
first step would be to import the edo.distributions.Distribution
base
class:
>>> from edo.distributions import Distribution
Now, you define your class as normal, inheriting from the base class. The requirements on your class are as follows:
- There must be a class attribute
name
giving the name of the distribution. - There must be a class attribute
dtype
detailing the preferred data type of the distribution. - There must be a class attribute
hard_limits
that gives extreme limits on the parameters of the distribution. - There must be a class attribute
param_limits
that gives the original limits on the parameters of the distribution. - It must have a
sample
method that takes as argument: itself, an integer number of rowsnrows
and an instance ofnumpy.random.RandomState
. - The
__init__
takes only an instance ofnumpy.random.RandomState
. - The only attributes defined in the
__init__
are the parameters of that particular instance of the distribution and match the keys ofparam_limits
.
So, bearing that in mind, a triangular distribution class would look something like this:
>>> class Triangular(Distribution):
... """ A continuous column distribution given by the triangular
... distribution. """
...
... name = "Triangular"
... dtype = float
... hard_limits = {"bounds": [-10, 10]}
... param_limits = {"bounds": [-10, 10]}
...
... def __init__(self, random_state):
...
... left, mode, right = sorted(
... random_state.uniform(*self.param_limits["bounds"], size=3)
... )
... self.bounds = [left, mode, right]
...
... def sample(self, nrows, random_state):
... """ Take a sample of size ``nrows`` from the triangular
... distribution with the given bounds. """
...
... return random_state.triangular(*self.bounds, size=nrows)