优化每日周度指数移动平均计算代码,提升执行效率
高效实现每日周度指数移动平均(线性时间复杂度)
你的原代码核心问题是每个交易日都重复遍历整个时间序列、重新生成周度数据并计算EMA,时间复杂度为O(n²),数据量越大效率越低。下面是线性时间(O(n))的优化实现,完全保留原逻辑但效率大幅提升:
优化思路
- 一次性生成所有周度数据(和原逻辑一致,取每周最后一个交易日的收盘价)
- 仅计算一次周度数据的EMA,这一步的时间复杂度仅和周数相关(远小于交易日数)
- 将周度EMA值映射回每个交易日,通过向前填充的方式,让每个交易日自动取到截至当天的最新周度EMA值
优化后的代码
import pandas as pd from typing import Optional def weekly_exponential_moving_average(data: pd.DataFrame, window: int, column: Optional[str] = 'Close_Price') -> pd.Series: # 1. 一次性生成所有周度收盘价(每周最后一个交易日的数据) weekly_closes = data[column].resample('W').last() # 2. 计算周度数据的EMA,仅执行一次 weekly_ema = weekly_closes.ewm(span=window, adjust=False).mean() # 3. 将周度EMA映射到每个交易日,向前填充缺失值(取最新的周度EMA) daily_weekly_ema = weekly_ema.reindex(data.index, method='ffill') return daily_weekly_ema
效率说明
- 整个流程仅对原始数据遍历一次,所有操作(重采样、EMA计算、重索引填充)都是线性时间复杂度,整体为O(n)
- 完全匹配原代码的逻辑:每个交易日的取值都是截至当天的最新周度EMA结果,你可以用小数据集对比验证结果一致性
内容的提问来源于stack exchange,提问作者Question1010
相关产品推荐
相关产品推荐

