Этот итератор вместо возврата 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

https://www.tradingview.com/wiki/Moving_Average

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:

Удачи!

Другие вопросы по тегам