from abc import ABC, abstractmethod
from typing import List, Optional, Union
import numpy as np
[docs]class DurationDistribution(ABC):
"""Base class for a duration distribution."""
[docs] @abstractmethod
def sample(self, size: int) -> np.ndarray:
"""Sample from the duration distribution.
:param size: amount of samples to draw.
:returns: samples from the distribution
"""
raise NotImplementedError
[docs]class EmpiricalBootstrap(DurationDistribution):
"""This distribution will bootstrap from an empirical
distribution.
:param replace: if sample w/ replacement or not
"""
def __init__(self, samples: Union[List[int], np.ndarray],
replace: bool = True):
self.samples = np.asarray(samples)
self.replace = replace
[docs] def sample(self, size: Optional[int] = None) -> np.ndarray:
"""Sample from the duration distribution.
:param size: amount of samples to draw.
:returns: samples from the distribution
"""
size = size or len(self.samples)
samples = np.random.choice(self.samples,
size=size,
replace=self.replace)
return samples