| 407 | return noisy_data, lower_distribution_bounds, upper_distribution_bounds |
| 408 | |
| 409 | def sample(self, |
| 410 | noise_types=('uniform', 'gaussian'), |
| 411 | noise_params=({'lower': 0, 'upper': 1}, {'std_ratio': 0.05}), |
| 412 | return_stacked_data = True, |
| 413 | plot_noisy=False, |
| 414 | days_to_plot=(0, 10), |
| 415 | verbose=False, |
| 416 | push_peak_val=False, |
| 417 | push_peak_ratio=0.5, |
| 418 | push_individual_vals=False, |
| 419 | push_individual_ratio=0.5, |
| 420 | **kwargs |
| 421 | ): |
| 422 | |
| 423 | # TODO add param to push peak toward actual peak |
| 424 | |
| 425 | potential_noises = {0: (None, 'uniform', 'triangular'), |
| 426 | 1: (None, 'gaussian')} |
| 427 | |
| 428 | noise_parameters = ({'lower': 0, 'upper': 1, 'mode':0.5}, {'std_ratio': 0.05}) |
| 429 | |
| 430 | for j, noise in enumerate(noise_types): |
| 431 | if noise not in potential_noises[j]: |
| 432 | raise ValueError('Noise ({}) not recognized in position ({}), must be one of {}'.format( |
| 433 | noise, j, potential_noises[j])) |
| 434 | |
| 435 | if not self.munged: |
| 436 | self.data_munge() |
| 437 | |
| 438 | if not self.interpolated: |
| 439 | self.max_min_curve_interpolate() |
| 440 | |
| 441 | if not self.interpolated: |
| 442 | raise RuntimeError('Must have an interpolating curve before adding noise. ' |
| 443 | 'Call max_min_curve_interpolate first.') |
| 444 | if len(noise_params) != 2: |
| 445 | raise TypeError('Unable to parse noise_params, must be array-like length 2') |
| 446 | |
| 447 | for j, v in enumerate(noise_params): |
| 448 | if v is not None and not isinstance(v, dict): |
| 449 | raise TypeError('Element ({}) in noise_params must be None or dict, is {}'.format(j, type(v))) |
| 450 | elif v is not None: |
| 451 | for key in noise_parameters[j].keys(): |
| 452 | if key in v.keys(): |
| 453 | noise_parameters[j][key] = v[key] |
| 454 | |
| 455 | if noise_types[0] is None: |
| 456 | if self.parabolic_baseline is None: |
| 457 | raise ValueError('noise_types[0] is None, but there is no stored baseline') |
| 458 | else: |
| 459 | noisy_data = self.parabolic_baseline.copy() |
| 460 | lower_distribution_bounds, upper_distribution_bounds = self.distribution_bounds |
| 461 | else: |
| 462 | noisy_data, lower_distribution_bounds, \ |
| 463 | upper_distribution_bounds = self._sample_parabola(noise_types[0], noise_parameters[0], verbose, |
| 464 | push_peak_val=push_peak_val, push_peak_ratio=push_peak_ratio) |
| 465 | |
| 466 | if noise_types[1] == 'gaussian': |