You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 03:15:05