在分组股票DataFrame中应用TA-Lib KAMA报错,求解决方法
问题修复:分组应用KAMA函数的错误解决
错误原因
你写的分组应用代码存在两个关键问题:
- 直接执行
tb.KAMA(close, timeperiod=3)并把结果传给apply,但apply需要的是能接收分组后Series的函数,不是已经计算好的Series对象,这直接触发了TypeError: 'Series' objects are mutable, thus they cannot be hashed错误。 - 你传入的
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
相关产品推荐
相关产品推荐

