Pandas遍历DataFrame报错:'float'对象无'MACD'属性如何解决?
问题报错原因分析
- 核心错误出在
row[i - 1].MACD这行写法:row是遍历过程中当前行的Series对象,你用下标i-1取row的值,实际取到的是当前行第i-1列的浮点型数值,并不是你以为的上一行的Series对象,自然不存在MACD属性,触发AttributeError。 - 次要错误:最后的
print语句直接拼接字符串和int类型的buy/sell变量,也会触发类型错误。
修正后的遍历版本代码
buy = 0 sell = 0 for i, row in df.iterrows(): if i == 0: continue # 上一行数据需要从原DataFrame中取,不能从当前行row取 prev_row = df.iloc[i-1] if row.MACD > row.SIGNAL and prev_row.MACD < prev_row.SIGNAL: if row.HIST < 0 and row.MACD > row['200EMA'] and row.SIGNAL > row['200EMA']: buy += 1 elif row.MACD < row.SIGNAL and prev_row.MACD > prev_row.SIGNAL: if row.HIST > 0 and row.MACD < row['200EMA'] and row.SIGNAL < row['200EMA']: sell += 1 # 用f-string格式化输出,避免类型拼接错误 print(f"BUY: {buy} SELL: {sell}")
更高效的向量化实现(推荐)
Pandas内置的shift方法可以直接偏移行获取上一行数据,不需要手动遍历,性能比iterrows高多个数量级,适合数据量较大的场景:
# 生成上一行对应的MACD和SIGNAL序列 prev_macd = df['MACD'].shift(1) prev_signal = df['SIGNAL'].shift(1) # 统计符合条件的买入信号数 buy_condition = ( (df['MACD'] > df['SIGNAL']) & (prev_macd < prev_signal) & (df['HIST'] < 0) & (df['MACD'] > df['200EMA']) & (df['SIGNAL'] > df['200EMA']) ) buy = buy_condition.sum() # 统计符合条件的卖出信号数 sell_condition = ( (df['MACD'] < df['SIGNAL']) & (prev_macd > prev_signal) & (df['HIST'] > 0) & (df['MACD'] < df['200EMA']) & (df['SIGNAL'] < df['200EMA']) ) sell = sell_condition.sum() print(f"BUY: {buy} SELL: {sell}")
内容的提问来源于stack exchange,提问作者Erwin109
相关产品推荐
相关产品推荐

