【问题标题】:Python sum() is calculating same value for two different listsPython sum() 正在为两个不同的列表计算相同的值
【发布时间】:2022-01-03 06:16:48
【问题描述】:

我正在尝试使用 RSI 进行技术分析,其中包含 2 个收益和损失列表,然后获取 2 个列表的平均值。出于某种原因,当使用 sum() 时,我收到了 2 个列表的相同值。当手动添加列表的总和时,我看到了不同的结果。这就是我所拥有的:

def calculate_avg_gain(in_list : list) -> tuple:
gain_list = []
loss_list = []
for i, close in enumerate(in_list):
    try:
        change = close - in_list[i-1]
    except IndexError:
        change = 0.0
    if change >= 0.0:
        gain_list.append(change)
        loss_list.append(0.0)
    else:
        gain_list.append(0.0)
        loss_list.append(abs(change))
avg_gain = sum(gain_list) / 14
avg_loss = sum(loss_list) / 14
return avg_gain, avg_loss

当每个条目有 14 个条目时,我就进入了代码:

gain_list = [1.1800000000000068, 0.0, 0.0, 0.10000000000002274, 0.0, 0.44999999999998863, 0.030000000000001137, 0.0, 0.160000000000025, 0.0, 0.0, 0.15000000000000568, 0.0, 0.05000000000001137]
loss_list = [0.0, 0.19999999999998863, 0.10999999999998522, 0.0, 0.0, 0.0, 0.5, 0.3299999999999841, 0.0, 0.47999999999998977, 0.0, 0.10000000000002274, 0.25, 0.0]

avg_gain = 0.15142857142857583
avg_loss = 0.1407142857142836

两者的总和为 2.12,这是我得到 loss_list 总和的结果,而我得到 2.1799 的 gain_list。我错过了什么吗?

【问题讨论】:

  • 我计算了~1.969
  • 它们的总和为 1.97。也许您的数据不是您所期望的。
  • 我会将其更新为具有不同值的不同时间范围。这是一个不好的例子。
  • 您计算错误列表。请注意,在 for 循环的第一次迭代中,您如何访问第一个项目和索引 -1 中的项目。
  • 你用什么代码来求两者之和(结果为 2.12)?

标签: python list math technical-indicator


【解决方案1】:

如果您发现这里的问题是,无论何时执行in_list[-1],它都不会抛出IndexError,但它会使用最后一个元素in_list[len(list)-1]

In [4]: def calculate_avg_gain(in_list : list) -> tuple:
   ...:     gain_list = []
   ...:     loss_list = []
   ...:     for i, close in enumerate(in_list):
   ...:         try:
   ...:             change = close - in_list[i-1]
   ...:         except IndexError:
   ...:             change = 0.0
   ...:         if change >= 0.0:
   ...:             gain_list.append(change)
   ...:             loss_list.append(0.0)
   ...:         else:
   ...:             gain_list.append(0.0)
   ...:             loss_list.append(abs(change))
   ...:         print(gain_list, loss_list, change)
   ...:     avg_gain = sum(gain_list) / 14
   ...:     avg_loss = sum(loss_list) / 14
   ...:     return avg_gain, avg_loss
   ...:

In [5]: calculate_avg_gain(a)
[0.0] [4] -4
[0.0, 1] [4, 0.0] 1
[0.0, 1, 1] [4, 0.0, 0.0] 1
[0.0, 1, 1, 1] [4, 0.0, 0.0, 0.0] 1
[0.0, 1, 1, 1, 1] [4, 0.0, 0.0, 0.0, 0.0] 1
Out[5]: (0.2857142857142857, 0.2857142857142857)

您可以将代码更新为以下内容:

In [6]: def calculate_avg_gain(in_list : list) -> tuple:
   ...:     gain_list = []
   ...:     loss_list = []
   ...:     for i, close in enumerate(in_list):
   ...:         if i == 0:
   ...:             continue
   ...:         change = close - in_list[i-1]
   ...:         if change >= 0.0:
   ...:             gain_list.append(change)
   ...:             loss_list.append(0.0)
   ...:         else:
   ...:             gain_list.append(0.0)
   ...:             loss_list.append(abs(change))
   ...:         print(gain_list, loss_list, change)
   ...:     avg_gain = sum(gain_list) / 14
   ...:     avg_loss = sum(loss_list) / 14
   ...:     return avg_gain, avg_loss
   ...:

In [7]: calculate_avg_gain(a)
[1] [0.0] 1
[1, 1] [0.0, 0.0] 1
[1, 1, 1] [0.0, 0.0, 0.0] 1
[1, 1, 1, 1] [0.0, 0.0, 0.0, 0.0] 1
Out[7]: (0.2857142857142857, 0.0)

如果您想要单线进行更改,您可以执行以下操作

>>> [j-i for i, j in zip(t[:-1], t[1:])]
[2, 3]

如果变化> 0,则可以增加收益,如果不增加损失。

其他方式:

for i in range(1, len(in_list)):
    change = in_list[i] - in_list[i-1]

如果你已经在你的项目中使用NumPy,你可以这样做

import numpy as np
in_list = np.array([5, 4, 89, 12, 32, 45])
  
  
# Calculating difference list
diff_list = np.diff(in_list)

【讨论】:

  • 还可以将for 签名更改为:for i, close in enumerate(in_list[1:]):,以免超过第一项
  • @Adid 我们可以这样做,但我觉得这要好得多[j-i for i, j in zip(t[:-1], t[1:])]
  • 为了可读性,我可能会做for i in range(1, len(in_list)): change = in_list[i] - in_list[i-1],这很容易阅读
  • @DeepShah 我已经添加了其他你可以使用的方式,看看
  • 日常使用不需要NumPy,多用于科学计算。我使用 Python 已经 3 年多了,从未使用过 NumPy
猜你喜欢
  • 2019-09-14
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-25
相关资源
最近更新 更多