【发布时间】:2014-03-17 16:42:20
【问题描述】:
好的,所以我正在编写一个类来计算价格列表上的简单移动平均线。它计算每 N 个价格的平均值,而不计算前 N-1 天。这就是我所拥有的:
class Simplemovingaverage():
def __init__(self, Nday, list_of_prices):
self._Nday = Nday
self._list_of_prices = list_of_prices
def calculate(self):
for i in range(len(self._list_of_prices)):
if i < self._Nday:
average = 0
elif i == self._Nday:
average = sum(self._list_of_prices[:self._Nday])/self._Nday
else:
average = sum(self._list_of_prices[i-self._Nday:i])/self._Nday
print(average)
我通过在 shell 'x = Simplemovingaverage(3, [1,2,3,4,5,6,7,8,9,10])' 上创建一个类对象来测试它,然后通过 'x.calculate' 执行计算方法,我得到的输出是:
0
0
0
2.0
3.0
4.0
5.0
6.0
7.0
8.0
所以从我的数字列表中,它唯一计算到 7,8,9 最后一个数字应该是 9,因为这是 8,9,10 的平均值,而且应该只有 3 个零,因为 N 是 3。这是我正在寻找的输出:
0
0
2.0
3.0
4.0
5.0
6.0
7.0
8.0
9.0
【问题讨论】:
-
为什么要为此开设课程?似乎没有任何对象具有您正在建模的状态或行为;它只是在做一个计算。这作为一个函数会更好。
-
看看使用deque 对象作为移动平均线。它针对两端的追加和弹出以及固定大小(如果需要)进行了优化
-
只需使用来自
collections.deque的moving_average recipe。 -
我同意你为什么要使用一个类的问题,但更根本的是:你为什么要打印结果,而不是创建一个新列表并返回它?
-
输出应该是
0, 0, 2, 3, 4, 5, 6, 7, 8, 9,而不是0, 0, 0, ...
标签: python class methods average self