Отдельный завод может быть либо подключен к сети, либо отключен. Мне нужно создать временной ряд для каждого завода, показывающий его доступность (0 = офлайн, 1 = онлайн).
Каждый завод имеет характерные данные, показывающие его среднюю продолжительность простоя (обычно в днях). около 3), а также среднюю долю времени, в течение которого он находится в автономном режиме в любой заданной продолжительности (в %, около 5%).
У меня есть решение, использующее собственный Python, которое рисует серию продолжительность простоев и дни между отключениями, как из геометрического распределения. Однако это довольно медленно при создании большого количества серий. Есть ли способ ускорить это с помощью Pandas?
Код: Выделить всё
mean_outage_length = 3
forced_outage_derating = 0.95
# Forced Outage Derating is percentage of time you would expect a plant to be online allowing for unplanned outages only
outage_length_mu = np.log(1 - 1 / (mean_outage_length + 1))
between_outages_probability = (1 - forced_outage_derating) * (1 / (mean_outage_length + 1)) / (forced_outage_derating)
if between_outages_probability >= 0.9999999999999999:
between_outages_mu = -40
else:
between_outages_mu = np.log(1 - between_outages_probability)
sum_of_days = 0
days_in_between_outages = []
outage_lengths = []
days_in_simulation_window = 1000
while True:
outage_length = math.floor(np.log(1 - random.random()) / outage_length_mu)
days_until_next_outage = math.ceil(np.log(1 - random.random()) / between_outages_mu)
if first_pass:
first_pass = False
if random.random() > forced_outage_derating:
days_until_next_outage = 0
sum_of_days += (days_until_next_outage + outage_length)
if sum_of_days > days_in_simulation_window:
break
outage_lengths.append(outage_length)
days_in_between_outages.append(days_until_next_outage)
if sum_of_days - outage_length
Подробнее здесь: [url]https://stackoverflow.com/questions/78754508/efficient-random-outage-simulation-using-pandas[/url]