根据数据长度创建具有特定行为的循环

时间:2018-10-06 14:05:46

标签: python loops

在我的程序中,我有一部分代码使用Estimated Moving AverageEMA)4次,但是每次使用不同的长度。该程序使用一个或多个EMA,具体取决于它获取的数据量。

目前,代码没有循环,只是复制粘贴了较小的tweeks。这使更改变得困难,因为我必须将所有内容更改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 :(得分:0)

可变数量的变量通常是个坏主意。如您所见,它会使维护代码变得繁琐且容易出错。相反,您可以定义一个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]访问结果。