python - 计算移动平均线
问题描述
我很难在我的函数中实现移动平均公式。我花了很长时间才知道代码现在在哪里。
有没有我可以带的图书馆?
输入:
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]
我遇到的问题是我的结果的中间部分是正确的,但其余部分是一个谜。
- 为什么它对列表中的最后三个值返回 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
函数调用,但我真的很想找到问题的根源)。
解决方案
您的代码中还有其他几个逻辑错误。我试图纠正它以使其按您的意愿工作。以下只是 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]
推荐阅读
- jquery - 使用jquery在cakephp 3.5中的索引页面中弹出表单提交
- javascript - 从数据库显示谷歌图表未正确显示数据
- java - 9-patch 在 Java 和 Xml 中设置时表现不同
- javascript - 从一些人那里获得价值?
- android - Ionic 3 - 已发布的 apk 安装一次,但卸载后无法再次安装
- python-3.x - Peewee 迁移改变外键约束
- ios - Sinch iOS 应用程序:识别应用程序是否接收到视频或语音呼叫
- c# - 从不同的文件路径在内存中创建 Zip 文件并在 C# 中下载
- javascript - ios设备输入类型=“文本”值在我们输入值时未显示
- angular5 - Angular 5中的路由不起作用