Python 基于类别的方向指示器

Python 基于类别的方向指示器,python,list,class,append,range,Python,List,Class,Append,Range,我正在创建一个基于类的方向指示器,它给出了一个天数n_天和一个数字列表,它给出了最近n_天中数字高于前一个数字的数字减去前n_天中数字下降的n_天。因此,如果列表中的数字增加,我希望它返回+1,如果它减少,我希望它返回-1,否则它应该是0,所以第一个数字应该始终是0,因为你不能将它与任何东西进行比较。然后基于n_天,我基本上想要取最近n_天的总和,例如在[1,2,2,1,2,1]列表中,变化应该是[0,+1,0,-1,1,-1],如果我想要每天两个最近数字的变化之和,那么它应该是[0,+1,-1

我正在创建一个基于类的方向指示器,它给出了一个天数n_天和一个数字列表,它给出了最近n_天中数字高于前一个数字的数字减去前n_天中数字下降的n_天。因此,如果列表中的数字增加,我希望它返回+1,如果它减少,我希望它返回-1,否则它应该是0,所以第一个数字应该始终是0,因为你不能将它与任何东西进行比较。然后基于n_天,我基本上想要取最近n_天的总和,例如在[1,2,2,1,2,1]列表中,变化应该是[0,+1,0,-1,1,-1],如果我想要每天两个最近数字的变化之和,那么它应该是[0,+1,-1,0,+1,0],因为第一天只有0,第二天取最近两天的总和0++1=1,第三天+1+0=+1,第四天0+-1=-1,依此类推。以下是我的代码,它不起作用:

class Directionalindicator():
    def __init__(self, n_days, list_of_prices):
        self.n_days = n_days
        self.list_of_prices = list_of_prices

    def calculate(self):
        change = []
        for i in range(len(self.list_of_prices)):
            if self.list_of_prices[i-1] < self.list_of_prices[i]:
                change.append(1)
            elif self.list_of_prices[i-1] > self.list_of_prices[i]:
                change.append(-1)
            else:
                change.append(0)
        directional = []
        for i in range(len(change)):
            directional.append(sum(change[i+1-self.n_days:i+1]))
        return directional
应返回:

[0,+1,+1,-1,0,0]
确实如此

但用以下方法进行测试:

y = Directionalindicator(2,[1,2,2,1,2,1])

y.calculate()
y = Directionalindicator(3, [1,2,3,4,5,6,7,8,9,10])

y.calculate()
应该回来

[0, 0, 2, 3, 3, 3, 3, 3, 3, 3]
但它又回来了

[0, 0, 1, 3, 3, 3, 3, 3, 3, 3]
我打印了更改以查看它在做什么,第一个值是-1而不是0。另外,其中一个答案中的代码可以使用zip,但我不明白为什么我的代码不适用于1-10的列表。

您的比较

i > i-1
永远都是真的。您将每个价格与自身进行比较,减去1,后者将始终较小。相反,你应该比较成对的价格。zip在这方面很有用:

change = [0] # first price always zero change
for a, b in zip(self.list_of_prices, self.list_of_prices[1:]):
    if a < b: # price went up
        change.append(1)
    elif a > b: # price went down
        change.append(-1)
    else: # price stayed the same
        change.append(0)
你会得到:

change == [0, 1, 0, -1, 1, -1]
directional == [0, 1, 1, -1, 0, 0]
根据您最初对规则的陈述,这似乎是正确的,但由于某些原因,与您在问题末尾的预期输出[0,1,-1,0,1,0]不匹配


您的编辑不起作用的原因是您正在列表上使用索引i。当i==0时,i-1=-1。当用作价格[-1]的索引列表时,这将为您提供列表中的最后一个元素。因此,更改包含[-1,1,1,1,1,1,1,1,1,1],因为它将1与10进行比较,而不是像您预期的那样[0,1,1,1,1,1,1,1,1,1,1]。

您不工作是什么意思?+您能修正缩进吗?我编辑了我的答案,以反映您问题的更改。如果您评论说您在实现解决方案时遇到问题,我会更早地添加这一点。若你们觉得我的答案很有用,那个么投票或者接受我的答案会很好。那个么我应该用zip吗?尽管使用了索引,但它仍然让我困惑,它在第一次测试中是如何工作的。它在第一次测试中很幸运地工作了——因为第一次测试的开始和结束都是1!您可以使用zip或从1开始索引:对于范围1中的i,len…:
change == [0, 1, 0, -1, 1, -1]
directional == [0, 1, 1, -1, 0, 0]