使用Pandas计算滚动平均时遇list索引错误,求解决方案
解决Pandas滚动平均值计算时的"list indices must be integers or slices, not str"错误
嘿,我一眼就揪出问题所在啦!咱们来一步步拆解:
错误根源
你初始化了ma_data = []——这是个列表,但后面却试图像字典一样用字符串键(比如'MA_' + str(ma))去赋值:
ma_data['MA_' + str(ma)] = pd.rolling_mean(df['close'], window=ma)
列表只能用整数索引(比如ma_data[0])或者切片,用字符串当索引自然会触发这个报错~
修正方案(两种可选)
方案1:改用字典存储滚动平均数据,最后合并到DataFrame
把ma_data改成字典,循环赋值后再合并到原df中:
for file in filename_day: df = pd.read_csv(path_day + file) # 把ma_data从列表改成字典 ma_data = {} ma_list = [5,10,20,30,60] for ma in ma_list: # 注意:pd.rolling_mean是旧版API,新版本pandas建议用rolling().mean() # ma_data[f'MA_{ma}'] = pd.rolling_mean(df['close'], window=ma) ma_data[f'MA_{ma}'] = df['close'].rolling(window=ma).mean() # 把字典转成DataFrame并合并到原df df = pd.concat([df, pd.DataFrame(ma_data)], axis=1) df.to_csv('C:/20180424_DD/MA/'+file)
方案2:直接在原DataFrame上添加滚动平均列(更简洁)
其实没必要单独用ma_data存储,直接给df新增列就行:
for file in filename_day: df = pd.read_csv(path_day + file) ma_list = [5,10,20,30,60] for ma in ma_list: # 直接在df中创建新列 df[f'MA_{ma}'] = df['close'].rolling(window=ma).mean() df.to_csv('C:/20180424_DD/MA/'+file)
额外注意点
- Pandas版本兼容:
pd.rolling_mean()是Pandas 0.18.0之前的旧函数,现在已经被弃用了,建议用df['close'].rolling(window=ma).mean()来替代,避免后续版本报错。 - 空值处理:滚动平均的前
ma-1行会是NaN,如果需要可以用df[f'MA_{ma}'].fillna(method='bfill')或者其他方式填充,根据你的需求调整。
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

