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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:45:29