在我的程序中,我有一部分代码使用Estimated Moving Average
(EMA
)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")
答案 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]
访问结果。