如何在Pandas中动态计算前X日收盘价均值并写入新增列
Pandas动态计算X日收盘价均值实现方案
核心实现直接调用Pandas内置的滚动窗口方法即可,无需手动写循环,支持动态传入天数参数,性能远高于自行实现的循环逻辑。
两种常用计算场景实现
1. 计算包含当前交易日在内的最近X日收盘价均值(和你原有硬编码2日均值效果完全一致)
核心代码:
df['avg'] = df['Close'].rolling(window=days).mean()
2. 计算不含当前交易日的纯前X日收盘价均值
核心代码:
df['avg'] = df['Close'].rolling(window=days).mean().shift(1)
如果你需要的是指数移动平均(EMA,和你方法名GetEMA对应)
核心代码:
df['avg'] = df['Close'].ewm(span=days, adjust=False).mean()
修正后的完整可运行代码
import pandas as pd import os import sys import NasdaqTickerSymbols as nts class MY_PANDA_INDICATORS(): def __init__(self, days, csvFile): self.days = days self.csvFile = csvFile self.df = self.GetDataFrame() # 初始化时直接读取数据存入实例属性 def GetDataFrame(self): modpath = os.path.dirname(os.path.abspath(sys.argv[0])) datapath = os.path.join(modpath, "CSV", self.csvFile + ".csv") # 用os.path.join拼接路径适配多系统 df = pd.read_csv(datapath) return df def GetSMA(self): # 简单移动平均,和你原来的计算逻辑匹配 self.df['avg'] = self.df['Close'].rolling(window=self.days).mean() return self.df def GetEMA(self): # 指数移动平均,对应方法名原本的用途 self.df['avg'] = self.df['Close'].ewm(span=self.days, adjust=False).mean() return self.df myD = MY_PANDA_INDICATORS(2, nts.matches[0]) print(myD.GetSMA()) # 调用后输出的结果和你贴的样例完全一致
效果验证
当传入days=2调用GetSMA时,输出结果和你原有硬编码实现的结果完全匹配:
- 第0行数据不足2个,返回
NaN - 第1行均值为
(1.12+1.13)/2=1.125 - 后续行计算逻辑完全符合你原有的预期,修改
days参数即可直接计算任意天数的均值。
内容的提问来源于stack exchange,提问作者Rick Perez
相关产品推荐
相关产品推荐

