Python - для цикла (две параллельные итерации) - PullRequest
0 голосов
/ 07 декабря 2018

Я работаю над модулем оценки прототипа.Цель состоит в том, чтобы отправить правильные параметры изменения сезонности в модуль прогнозирования.

Первоначально при оценке кривой бронирования мы использовали формулу для дня года в год - тригонометрическая функция с 5 заказами (фиксированная).Это выглядит так:

doy_seasonality = np.exp(z[0]*np.sin(2*np.pi*doy/365.)+z[1]*np.cos(2*np.pi*doy/365.)
                       +z[2]*np.sin(4*np.pi*doy/365.)+ z[3]*np.cos(4*np.pi*doy/365.)
                       +z[4]*np.sin(6*np.pi*doy/365.)+ z[5]*np.cos(6*np.pi*doy/365.)
                       +z[6]*np.sin(8*np.pi*doy/365.)+ z[7]*np.cos(8*np.pi*doy/365.)
                       + z[8]*np.sin(10*np.*pi*doy/365.)+ z[9]*np.cos(10*np.pi*doy/365.))

т.е. у нас было 5 фиксированных заказов [2, 4, 6, 8, 10]

Теперь мы нашли лучший способ получить заказы с помощью быстрого преобразования Фурье.В зависимости от ключа оценки, который мы используем в качестве входных данных для моделирования, массив заказов может иметь различное количество значений.

Например, допустим, массив заказов выглядит следующим образом:

orders = [2, 6, 10, 24]

Соответствуетдля каждого значения заказа будет два значения z (это тригонометрический параметр - одно значение для части SIN и одно значение для части COS).Например, это может выглядеть так:

z = [0.08 0.11 0.25 0.01 0.66 0.19 0.45 0.07]

. Для этого мне нужно определить цикл for с двумя параллельными итерациями:

z[0] to z[2*length(orders)-1]      i.e. `z[0] to z[7]`

и orders[0] to orders[length(orders)-1] i.e. orders[0] to orders[3]* 1021.*

в конечном итоге формула должна вычислить это:

doy_seasonality = np.exp(z[0]*np.sin(orders[0]*np.pi*doy/365.)+z[1]*np.cos(orders[0]*np.pi*doy/365.)
                       +z[2]*np.sin(orders[1]*np.pi*doy/365.)+ z[3]*np.cos(orders[1]*np.pi*doy/365.)
                       +z[4]*np.sin(orders[2]*np.pi*doy/365.)+ z[5]*np.cos(orders[2]*np.pi*doy/365.)
                       +z[6]*np.sin(orders[3]*np.pi*doy/365.)+ z[7]*np.cos(orders[3]*np.pi*doy/365.))

Я не могу разработать соответствующий синтаксис для этого.

doy (день года) - вектор, принимающий одинаковоинтервальные значения: 1, 2, 3 ... 364, 365

1 Ответ

0 голосов
/ 07 декабря 2018
orders = np.array([2, 6, 10, 24])
z = np.array([0.08, 0.11, 0.25, 0.01, 0.66, 0.19, 0.45, 0.07])
doy = np.arange(365) + 1

s = 0
for k in range(len(orders)):
    s += z[2 * k    ] * np.sin(orders[k] * np.pi * doy / 365.)
    s += z[2 * k + 1] * np.cos(orders[k] * np.pi * doy / 365.) 
s = np.exp(s)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...