【问题标题】:Keep getting IndexError Message?不断收到 IndexError 消息?
【发布时间】:2021-04-19 16:23:12
【问题描述】:

我正在尝试构建一个使用指数平滑来预测商品价格的项目。我从基本的指数平滑开始,并将逐步达到三倍指数平滑。但是,当我使用此代码时

with open('HistoricalData_1617379638571.csv', newline='') as f:
reader = csv.reader(f)
data = list(reader)
df = pd.read_csv('HistoricalData_1617379638571.csv')
df.columns = ['Date','Close/Last','Volume','Open','High','Low']
df.set_index('Date', inplace=True)
print(df)
x=df.loc[:,'Close/Last'].values
y=list(x)

z=[int(i) for i in y]
print(z)
alpha=0.9

def exp_smooth(alpha,z):
   for i in z:
      new_res=z.append((alpha * z[i] + (1 - alpha * z[i-1])))

   print(new_res)

exp_smooth(alpha,z)

我不断收到错误消息

Traceback (most recent call last):
  File "main.py", line 38, in <module>
    exp_smooth(alpha,z)
  File "main.py", line 34, in exp_smooth
    new_res=z.append((alpha * z[i] + (1 - alpha * z[i-1])))
IndexError: list index out of range

我做错了什么?如何解决此问题,以便我的指数平滑函数返回错误以外的内容?

【问题讨论】:

  • 请修正缩进。代码的哪些部分在 with 块内?
  • for i in z:z 设置为元素,而不是它们的索引。你为什么用z[i]
  • z.append() 修改列表,它不返回任何内容。所以new_res 将是None
  • 你可能想要的是for i in range(1, len(z)):,你需要从1开始,这样z[i-1]才有效。
  • 我怀疑你可以在 numpy 或 statpy 中找到内置的指数平滑函数。

标签: python dataframe forecasting


【解决方案1】:

当您尝试使用列表的值对列表进行索引时,您可能会得到一个不是列表有效索引的值。例如,如果列表是z=[100000]for 循环将尝试在索引1000000 处索引z,这显然不存在。

您可能希望使用range(len())

def exp_smooth(alpha, z):
    for i in range(len(z)):
        new_res=z.append((alpha * z[i] + (1 - alpha * z[i-1])))

或者,更好的是enumerate()

def exp_smooth(alpha, z):
    for index, value in enumerate(z):
        new_res = z.append((alpha * value + (1 - alpha * z[index-1])))

【讨论】:

  • 欣赏它,@Jacob Lee!
  • @WilliamDavidHiggsIII 没问题!
  • 在第一次迭代中,z[index-1] 将是z[-1],这是列表的最后一个元素。我怀疑他们是否希望平滑像这样环绕。
  • @Barmar 这就是原始代码中的内容,所以我同意了,尽管我同意:我认为使用列表中的最后一个元素也不会起到平滑作用。跨度>
  • 正如我在评论中所说,他可能想要range(1, len(z))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
  • 2019-01-09
  • 2019-04-15
  • 1970-01-01
  • 2014-04-12
相关资源
最近更新 更多