-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscenarioGenerator.py
More file actions
93 lines (72 loc) · 2.65 KB
/
scenarioGenerator.py
File metadata and controls
93 lines (72 loc) · 2.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on: 2021.07.26
@author: Anthony D. Cho
"""
## Libraires dependencies
from numpy import array
from numpy.random import seed
from scipy.stats import norm
from pandas import read_excel
## Customized function
""" ********
Sampling from normal function
"""
def samplingFromNormal(mus, scale = 1.0, scenarios = 1, integer=True, random_seed=None):
"""
DESCRIPTION:
Sampling from normal distribution for each mu in mus
with a fixed standard deviation
INPUT:
@param mus: list of mu for gaussian distribution
@type mus: pandas.Series, list or numpy.ndarray
@param scale: standard deviation.
@type scale: float or array
@param scenarios: number of scenarios to generate (by default 1)
@type scenarios: int
@param random_seed: random seed
@type random_seed: int
OUTPUT:
@param samples: list of samples per scenario (scenario, samples)
@type samples: numpy.ndarray
"""
if random_seed is not None:
seed(random_seed)
## Probability function
prob = norm
## Samples allocation
samples = []
if isinstance(scale, int) | isinstance(scale, float):
## Generate scenarios
if integer:
for _ in range(scenarios):
samples.append( [int(max(prob.rvs(loc=mu, scale=scale), 0)) for mu in mus] )
else:
for _ in range(scenarios):
samples.append( [max(prob.rvs(loc=mu, scale=scale), 0) for mu in mus] )
else:
## Generate scenarios (both mus and scale as array)
if integer:
for _ in range(scenarios):
samples.append( [int(max(prob.rvs(loc=mu, scale=sigma), 0)) for mu, sigma in zip(mus, scale)] )
else:
for _ in range(scenarios):
samples.append( [max(prob.rvs(loc=mu, scale=sigma), 0) for mu, sigma in zip(mus, scale)] )
## return samples
return array(samples)
"""
Main program
"""
nComponents = 26
FILENAME = 'datasets.xls'
SHEET = f'Problem_{nComponents}'
## Load data
data = read_excel(io=FILENAME, sheet_name=SHEET)
## RUL-sampling from a normal distribution
num_scenarios = 100
RULs = samplingFromNormal(mus=data['RUL'],
scale=6, ## standard deviation
scenarios=num_scenarios,
integer=True, ## return as integer
random_seed=100)