Этот итератор вместо возврата N элементов возвращает всегда 4. Что происходит?
@jit(nopython=True, fastmath=True)
def my_sum_for_numba(data_list): # equal to python's sum() but compilable by numba in nopython
_sum = 0
for i in data_list:
_sum += i
return _sum
@jit(nopython=True, fastmath=True)
def ema(ema_length, data_list):
data_list = data_list[::-1]
sma = my_sum_for_numba(data_list[:ema_length]) / ema_length
multiplier = (2 / (ema_length + 1))
first_ema_value = (data_list[(ema_length + 1)] - sma) * multiplier + sma
ema_list = [sma, first_ema_value]
for i in data_list[:2]:
i = ((i - ema_list[-1]) * multiplier + ema_list[-1])
ema_list.append(float(i))
return ema_list
Независимо от того, как долго data_list
это всегда дает ema_list
с 4 номерами. Я также попробовал это для цикла, но дает то же самое:
for i in data_list[:2]:
zz = ((i - ema_list[-1]) * multiplier + ema_list[-1])
ema_list.append(float(zz))
return ema_list
Любая подсказка?
Редактировать: первая функция равна встроенной в Python sum(), вторая функция должна вычислять экспоненциальное скользящее среднее (ema). Вот как рассчитывается:
https://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:moving_averages
2 ответа
data_list[:2] выдаст первые 2 элемента массива.
data_list [2:] пропустит первые 2 элемента массива и выдаст оставшиеся элементы.
Обратите внимание на положение ":" в срезе массива.
Я не совсем уверен, что эти функции пытаются сделать, было бы неплохо, если бы вы могли дать объяснение. Чтобы ответить на ваш вопрос о длине списка ema_list, мы можем проверить, действительно ли вы его меняете.
Здесь вы инициализируете ema_list двумя значениями:
ema_list = [sma, first_ema_value]
После этого вы повторяете два шага в цикле
for i in data_list[:2]:
Итак, чтобы ответить на ваш вопрос: причина, по которой результирующий ema_list имеет длину 4, состоит в том, что вы инициализируете его двумя значениями, а затем добавляете еще 2 значения. Если вы хотите перебрать все значения в data_list, измените
for i in data_list[:2]:
в
for i in data_list:
Удачи!