首页 > 解决方案 > 计算移动平均线

问题描述

我很难在我的函数中实现移动平均公式。我花了很长时间才知道代码现在在哪里。

有没有我可以带的图书馆?

输入:

ma([2,3,4,3,2,6,9,3,2,1], 4)

预期输出:

[None, None, None, 3.0, 3.0, 3.75, 5.0, 5.0, 5.0, 3.75]

我的输出:

[None, None, 0.0, 3.0, 3.75, 5.0, 5.0, None, None, None]

我遇到的问题是我的结果的中间部分是正确的,但其余部分是一个谜。

  1. 为什么它对列表中的最后三个值返回 None ?

def ma(价格,n):

ma = [] sums = [] s = 0 ave = 0

for idx, i in enumerate(prices):
    s += i
    sums.append(s)
    print('idx: ' + str(idx))
    print('list of sums ' + str(sums))
    #print('sum ' + str(s))

if i >= n+1:
    print('sums[idx] ' + str(sums[idx]))
    print('sums[idx-n] ' + str(sums[idx-n]))
    ave = (sums[idx] - sums[idx-n]) / n
    print('ave ' + str(ave))
    ma.append(ave)
    print('ma ' + str(ma))
else:
    m = None
    ma.append(m)
    print('ma ' + str(ma))

(对不起所有这些print函数调用,但我真的很想找到问题的根源)。

标签: pythonaveragedata-sciencemoving-average

解决方案


您的代码中还有其他几个逻辑错误。我试图纠正它以使其按您的意愿工作。以下只是 for 循环的修改版本。休息保持不变。添加/修改的行由注释突出显示

for idx, i in enumerate(prices):
    s += i
    sums.append(s)
    if idx == n-1: # Added
        ave = (sums[idx]) / n  # Added 
        ma.append(ave)  # Added
    elif idx >= n: # modified
        ave = (sums[idx] - sums[idx-n]) / n
        ma.append(ave)
    else:
        ma.append(None) # removed extra variable m

问题是您使用了错误的变量作为索引:

一个主要问题是您正在使用

if i >= n+1:

应该使用:

if idx >= n+1:

此外,我添加了一个 if 语句来处理前三个元素的平均值。

现在

moving_average([2,3,4,5,8,5,4,3,2,1], 3)

给出以下输出(您可以稍后四舍五入):

[None, None, 3.0, 4.0, 5.666666666666667, 6.0, 5.666666666666667, 4.0, 3.0, 2.0]

推荐阅读