Python 继续收到索引器错误消息?
我正在尝试建立一个项目,我使用指数平滑法来预测商品的价格。我将从基本的指数平滑开始,然后逐步发展到三重指数平滑。但是,当我使用此代码时Python 继续收到索引器错误消息?,python,dataframe,forecasting,Python,Dataframe,Forecasting,我正在尝试建立一个项目,我使用指数平滑法来预测商品的价格。我将从基本的指数平滑开始,然后逐步发展到三重指数平滑。但是,当我使用此代码时 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','
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
回溯(最近一次呼叫最后一次):
文件“main.py”,第38行,在
exp_平滑(alpha,z)
文件“main.py”,第34行,exp\u平滑
new_res=z.append((alpha*z[i]+(1-alpha*z[i-1]))
索引器:列表索引超出范围
我做错了什么?如何修复此问题,使指数平滑函数返回的不是错误?当您尝试使用列表的值对列表进行索引时,可能会得到一个不是列表有效索引的值。例如,如果列表为
z=[100000]
,则For
循环将尝试在索引1000000
处索引z
,这显然是不存在的
您可能希望使用范围(len())
:
def exp_平滑(alpha,z):
对于范围内的i(len(z)):
new_res=z.append((alpha*z[i]+(1-alpha*z[i-1]))
或者,更好的是,enumerate()
:
def exp_平滑(alpha,z):
对于索引,枚举中的值(z):
new_res=z.append((alpha*value+(1-alpha*z[index-1]))
请修复缩进。代码的哪些部分在with
块中?for i in z:
将z
设置为元素,而不是它们的索引。为什么要使用z[i]
?z.append()
在适当的位置修改列表,它不会返回任何内容。所以new_res
将是None
。你可能想要的是范围内的i(1,len(z)):
你需要从1开始,这样z[i-1]
将是有效的。我怀疑你可以在numpy
或statpy中找到一个内置的指数平滑函数。谢谢你,@Jacob Lee@威廉戴维希格斯三没问题!在第一次迭代中,z[index-1]
将是z[-1]
,这是列表的最后一个元素。我怀疑他们是否希望平滑像这样结束。@Barmar这是原始代码中的内容,所以我同意了,尽管我同意:我认为使用列表中的最后一个元素也不适用于平滑。正如我在评论中所说,他可能想要范围(1,len(z))