pandas groupby结合apply计算TA-Lib RSI并将结果添加为DataFrame列的问题
问题根因
合并失败的核心原因有两个:
- 自定义
calc_rsi函数返回了无索引绑定的原生numpy数组,groupby.apply返回结果的索引无法和原DataFrame的行索引一一匹配,后续如果做reset_index后再merge,会因为键不匹配出现值丢失、全列NaN、合并报错的问题 - 原示例代码中分组使用的列名
sym和实际数据的标的字段symbol不一致,存在KeyError的隐蔽风险
修正方案
- 调整
calc_rsi函数,计算完成后将RSI结果绑定原输入序列的索引,转为pandas Series返回,从根源保证索引对齐:
def calc_rsi(series): close_arr = series.values RSI = talib.RSI(close_arr, timeperiod=14) # 绑定原序列的索引,返回带索引的Series而非裸numpy数组 return pd.Series(RSI, index=series.index)
- 修正分组列名,直接将分组计算的结果赋值为原DataFrame的新列,无需额外做reset_index+merge的操作:
# 注意分组列名和实际字段symbol保持一致 quote_data["rsi_test"] = quote_data.groupby("symbol")["close"].apply(calc_rsi)
注意事项
不要沿用原逻辑中对分组apply结果做
reset_index(name='rsi_test')再合并的流程:当函数返回裸numpy数组时,pandas生成的MultiIndex第二层是组内的位置计数,而非原表的真实行索引,合并时必然出现匹配偏差。只要函数返回带原索引的Series,apply的结果会自动和原表索引对齐,直接赋值即可完成新列的添加,这种行为和之前你用pandas.rolling.mean()计算移动平均的逻辑完全一致,不会出现索引错位的问题。
内容的提问来源于stack exchange,提问作者tman
相关产品推荐
相关产品推荐

