对DataFrame列应用自定义函数:优化EMA指标计算代码的方法
代码优化方案:EMA递推计算场景
你原本的写法存在两个可优化点:
- 链式赋值
df.iloc[i]['fast_ema']可能触发SettingWithCopyWarning,极端情况下会出现赋值不生效的问题 - 纯Python循环在处理长序列时性能极差,且代码冗余
你的计算逻辑属于标准的指数移动平均(EMA),pandas内置了高度优化的矢量化实现,完全可以替代手动循环。
最优优化方案:使用pandas内置ewm方法
优化后的完整代码如下,计算结果和你原逻辑100%对齐:
import pandas as pd class EMA_Period: fast = 8 slow = 17 times = [1578614400, 1578614700, 1578615000, 1578615300, 1578615600] closes = [10278.6, 10276.0, 10275.6, 10274.8, 10277.0] df = pd.DataFrame(data={'time': times, 'close': closes}) df.set_index('time', inplace=True) # 直接调用内置方法,无需手动循环、提前初始化列 df['fast_ema'] = df['close'].ewm(span=EMA_Period.fast, adjust=False).mean()
参数说明:
span参数对应你自定义的EMA周期,底层自动计算平滑系数alpha=2/(周期+1),和你写的calculate_ema逻辑完全一致adjust=False指定使用递推公式计算,而非加权平均公式,完全匹配你手动循环的计算规则- 该方案为矢量化实现,万级以上数据量下性能比手动循环快几十到上百倍
通用自定义递推场景优化方案
如果你的实际业务逻辑是非标准的自定义递推计算,无法使用pandas内置函数实现,可以选择两种优化方向:
- 中等数据量场景:使用
pandas.Series.expanding().apply搭配numba装饰器加速自定义计算逻辑 - 超大吞吐量场景:将递推逻辑转换为numpy矩阵运算,进一步压榨性能
内容的提问来源于stack exchange,提问作者Masilive Sifanele
相关产品推荐
相关产品推荐

