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

在分组股票DataFrame中应用TA-Lib KAMA报错,求解决方法

问题修复:分组应用KAMA函数的错误解决

错误原因

你写的分组应用代码存在两个关键问题:

  1. 直接执行tb.KAMA(close, timeperiod=3)并把结果传给apply,但apply需要的是能接收分组后Series的函数,不是已经计算好的Series对象,这直接触发了TypeError: 'Series' objects are mutable, thus they cannot be hashed错误。
  2. 你传入的close是整个DataFrame的CLOSE列,不是每个分组后的单独序列——就算没报错,结果也是错误的,相当于把所有股票的行情连在一起算KAMA,而非每只股票独立计算。

修正代码

方法一:用lambda快速包装

让分组后的每个CLOSE序列作为参数传入KAMA函数:

import numpy as np
import pandas as pd
import talib as tb

df = pd.DataFrame()
df['NAME'] = ['A']*20 + ['B']*20
df['CLOSE'] = np.random.randint(1,100,df.shape[0])
df['NameNumber']=df.groupby('NAME').cumcount()
cols = ['NAME', 'NameNumber']
df['CN_PK'] = df[cols].apply(lambda row: '_'.join(row.values.astype(str)), axis=1)

# 全局计算KAMA(原代码正确部分)
df['KAMA'] = tb.KAMA(df['CLOSE'], timeperiod = 3)
# 分组计算KAMA(修正后的代码)
df['GrpKAMA'] = df.groupby('NAME')['CLOSE'].apply(lambda x: tb.KAMA(x, timeperiod=3))

df.head(50)

方法二:单独定义函数(更易维护)

如果后续要调整参数或增加逻辑,单独定义函数会更清晰:

def calc_kama_for_group(close_series):
    return tb.KAMA(close_series, timeperiod=3)

df['GrpKAMA'] = df.groupby('NAME')['CLOSE'].apply(calc_kama_for_group)

验证结果

修正后,GrpKAMA列会针对股票A和B各自独立计算KAMA:

  • 股票A的前2行GrpKAMA会是NaN(KAMA需要至少timeperiod个数据点初始化)
  • 股票B的前2行同样是NaN,和全局计算的KAMA列结果完全区分开,符合分组计算的需求。

内容的提问来源于stack exchange,提问作者Flint

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 04:00:18