使用group_by时Pandas TA库计算EMA失效的问题排查
问题描述
我有如下5分钟周期的OHLC数据:
timestamp open high ... symbol volume_10_day last_high_volume_high 0 2022-09-09 11:20:00+00:00 1.4000 1.4000 ... AMAM NaN 0.50 1 2022-09-09 13:30:00+00:00 1.4100 1.4100 ... AMAM NaN 0.50 2 2022-09-09 14:05:00+00:00 1.4749 1.4749 ... AMAM NaN 0.50 3 2022-09-09 16:45:00+00:00 1.4700 1.4702 ... AMAM NaN 0.50 4 2022-09-09 17:10:00+00:00 1.4300 1.4300 ... AMAM NaN 0.50 ... ... ... ... ... ... ... ... 281476 2022-12-03 00:35:00+00:00 1.3300 1.3300 ... ZH 31921.4 1.07 281477 2022-12-03 00:40:00+00:00 1.3300 1.3300 ... ZH 31921.4 1.07 281478 2022-12-03 00:45:00+00:00 1.3200 1.3300 ... ZH 31921.4 1.07 281479 2022-12-03 00:50:00+00:00 1.3250 1.3250 ... ZH 31921.4 1.07 281480 2022-12-03 00:55:00+00:00 1.3300 1.3300 ... ZH 31921.4 1.07
我尝试按symbol分组计算72周期EMA(为测试问题,临时设置length=2),代码如下:
import pandas as pd import pandas_ta as ta df["EMA72"] = ta.ema(df.groupby('symbol')['close'], length=2) # length设为2用来验证问题
但运行后EMA72列全部为None:
timestamp open high low ... vwap symbol volume_10_day EMA72 0 2022-09-09 11:20:00+00:00 1.4000 1.4000 1.4000 ... 1.400000 AMAM NaN None 1 2022-09-09 13:30:00+00:00 1.4100 1.4100 1.4100 ... 1.410000 AMAM NaN None 2 2022-09-09 14:05:00+00:00 1.4749 1.4749 1.4749 ... 1.474900 AMAM NaN None 3 2022-09-09 16:45:00+00:00 1.4700 1.4702 1.4100 ... 1.445265 AMAM NaN None 4 2022-09-09 17:10:00+00:00 1.4300 1.4300 1.4100 ... 1.413117 AMAM NaN None ... ... ... ... ... ... ... ... ... ... 281476 2022-12-03 00:35:00+00:00 1.3300 1.3300 1.3300 ... 1.330000 ZH 31921.4 None 281477 2022-12-03 00:40:00+00:00 1.3300 1.3300 1.3300 ... 1.330000 ZH 31921.4 None 281478 2022-12-03 00:45:00+00:00 1.3200 1.3300 1.3200 ... 1.322804 ZH 31921.4 None 281479 2022-12-03 00:50:00+00:00 1.3250 1.3250 1.3250 ... 1.325000 ZH 31921.4 None 281480 2022-12-03 00:55:00+00:00 1.3300 1.3300 1.3200 ... 1.326081 ZH 31921.4 None
请问我哪里操作出错了?
问题原因与修复方案
错误原因
ta.ema()函数无法直接处理groupby对象,它需要接收单个Series类型的数据。直接将分组对象传入函数,会导致函数无法正确解析计算,最终返回无效值。
修复代码
需要通过groupby().apply()遍历每个分组,对每个分组单独计算EMA后再合并回原DataFrame:
import pandas as pd import pandas_ta as ta # 定义分组计算EMA的函数 def calculate_ema(group): group['EMA72'] = ta.ema(group['close'], length=2) return group # 按symbol分组应用函数,恢复原索引结构 df = df.groupby('symbol').apply(calculate_ema).reset_index(drop=True)
说明
groupby().apply()会逐个处理每个symbol对应的子数据集,确保每个分组的EMA计算独立进行。reset_index(drop=True)用于消除分组后产生的多级索引,让DataFrame回到原始的索引结构。- 测试用的
length=2可以直接替换为实际需求的72,计算逻辑完全一致。
内容的提问来源于stack exchange,提问作者a7dc
相关产品推荐
相关产品推荐

