Создание цикла с определенным поведением в зависимости от длины данных - PullRequest
0 голосов
/ 06 октября 2018

В моей программе есть часть кода, которая использует Estimated Moving Average (EMA) 4 раза, но каждый раз с разной длиной.Программа использует один или несколько EMA с в зависимости от того, сколько данных она получает.

Пока код не зациклен, просто скопируйте его, вставив незначительные изменения.Это затрудняет внесение изменений, потому что я должен изменить все 4 раза.

Может ли кто-нибудь помочь мне зациклить код таким образом, чтобы он не потерял модель поведения.Код макета представлен здесь:

import random
import numpy as np

zakres=[5,10,15,20]
data=[]

def SI_sma(data, zakres):
    weights=np.ones((zakres,))/zakres
    smas=np.convolve(data, weights, 'valid')
    return smas

def SI_ema(data, zakres):
    weights_ema = np.exp(np.linspace(-1.,0.,zakres))
    weights_ema /= weights_ema.sum()
    ema=np.convolve(data,weights_ema)[:len(data)]
    ema[:zakres]=ema[zakres]
    return ema

while True:
    data.append(random.uniform(0,100))
    print(len(data))
    if len(data)>zakres[0]:
        smas=SI_sma(data=data, zakres=zakres[0])
        ema=SI_ema(data=data, zakres=zakres[0])
        print(smas[-1]) #calc using smas
        print(ema[-1])  #calc using ema1
    if len(data)>zakres[1]:
        ema2=SI_ema(data=data, zakres=zakres[1])
        print(ema2[-1]) #calc using ema2
    if len(data)>zakres[2]:
        ema3=SI_ema(data=data, zakres=zakres[2])
        print(ema3[-1]) #calc using ema3
    if len(data)>zakres[3]:
        ema4=SI_ema(data=data, zakres=zakres[3])
        print(ema4[-1]) #calc using ema4
    input("press a key")

1 Ответ

0 голосов
/ 07 октября 2018

Переменное число переменных обычно является плохой идеей.Как вы обнаружили, это может сделать обслуживание кода громоздким и подверженным ошибкам.Вместо этого вы можете определить dict результатов и использовать цикл for для итерации сценариев, определяя len(data) только один раз.

ema = {}

while True:
    data.append(random.uniform(0,100))
    n = len(data)
    for i, val in enumerate(zakres):
        if n > val:
            if i == 1:
                smas = SI_sma(data=data, zakres=val)
            ema[i] = SI_ema(data=data, zakres=val)

Затем вы можете получить доступ к результатам через ema[0], ..., ema[3] по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...