如何解决pandas循环计算股票EMA时dataframe自动追加数据的问题
问题根因
你贴出的check_for_ema_validity校验函数逻辑本身没有问题,数据持续累加的根源来自你调用的make_time_series函数实现:
- 最常见的情况是
make_time_series内部使用了全局DataFrame变量存储拉取的时序数据,每次调用新股票代码时没有清空原有数据,直接将新股票的数据追加到全局变量后返回,导致返回的结果行数持续累加 - 另一种高频错误场景是
make_time_series使用了可变默认参数作为结果容器(比如def make_time_series(ticker, res=pd.DataFrame()):),Python的可变默认参数仅在函数定义时初始化一次,后续所有调用都会复用同一个对象,也会出现数据累加的问题
解决方案
优先修改make_time_series的实现即可解决问题,两种修改方式二选一:
- 移除函数内部的全局DataFrame变量,每次调用时都初始化一个全新的空DataFrame来存储当前股票的时序数据,处理完成后返回新的DataFrame对象
- 如果是可变默认参数导致的问题,将默认值改为
None,在函数内部初始化结果容器,示例修改如下:
# 错误写法(可变默认参数) def make_time_series(ticker, result=pd.DataFrame()): # 拉取数据、拼接数据到result的逻辑 return result # 正确写法 def make_time_series(ticker, result=None): # 每次调用都初始化新的空容器 if result is None: result = pd.DataFrame() # 拉取数据、拼接数据到result的逻辑 return result
如果暂时不方便修改make_time_series的实现,可以在校验函数中临时做切片处理,比如已知单只股票的时序数据固定为186行,就每次取返回结果的最后186行使用:
required_data = make_time_series(ticker).drop_duplicates().iloc[-186:]
该方案仅作临时验证使用,长期还是建议修改make_time_series的实现从根源解决问题。
内容的提问来源于stack exchange,提问作者pillai
相关产品推荐
相关产品推荐

