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

使用pct_change()触发FutureWarning的问题排查

问题:pct_change() 触发FutureWarning的排查

我在使用pct_change()时遇到了FutureWarning问题。代码运行结果看似正确,但每次循环调用时都会出现64条如下警告:

... .py:1171: FutureWarning: The 'fill_method' and 'limit' keywords in DataFrame.pct_change are deprecated and will be removed in a future version. Call ffill before calling pct_change instead. c13_34minus = df_filled.pct_change(periods=34, fill_method=None) <= -0.13

我尝试过添加/移除fill_method=None和limit=None参数,也按照警告提示在调用pct_change前执行了ffill,甚至去掉df_filled = df_close.ffill()语句,警告依然存在。用df_filled = df_close.fillna(method='bfill')替代df_filled = df_close.bfill()也会出现相同警告。

用户代码片段:

def movers(df_close, idx, df_close_idx):
    # df_close是包含多个标的价格的时间序列DataFrame,早期日期可能存在NaN值
    # 计算涨跌幅前,用后续首个非NaN值填充早期NaN
    df_filled = df_close.bfill()
    # 填充后续可能存在的NaN值
    df_filled = df_close.ffill()
    # 定义条件
    c4plus = df_filled.pct_change(fill_method=None) >= 0.04
    c4minus = df_filled.pct_change(fill_method=None) <= -0.04
    c25_3plus = df_filled.pct_change(periods=63, fill_method=None) >= 0.25
    c25_3minus = df_filled.pct_change(periods=63, fill_method=None) <= -0.25
    c25_1plus = df_filled.pct_change(periods=21, fill_method=None) >= 0.25
    c25_1minus = df_filled.pct_change(periods=21, fill_method=None) <= -0.25
    c50_1plus = df_filled.pct_change(periods=21, fill_method=None) >= 0.50
    c50_1minus = df_filled.pct_change(periods=21, fill_method=None) <= -0.50
    c13_34plus = df_filled.pct_change(periods=34, fill_method=None) >= 0.13
    c13_34minus = df_filled.pct_change(periods=34, fill_method=None) <= -0.13
解决方案
  • 填充NaN的逻辑错误
    你先执行了df_filled = df_close.bfill(),但紧接着又把df_filled重新赋值为df_close.ffill(),这等于之前的bfill操作完全没生效,相当于只做了ffill填充。正确的做法是链式填充,先向后填充早期NaN,再向前填充剩余NaN:

    df_filled = df_close.bfill().ffill()
    
  • pct_change的参数问题
    警告的核心原因是你在调用pct_change时传递了fill_method=None参数——不管这个参数的值是什么,只要显式传了这个已被弃用的参数,就会触发警告。既然已经提前完成了NaN填充,直接调用pct_change时不要带这个参数即可。

修复后的代码:

def movers(df_close, idx, df_close_idx):
    # df_close是包含多个标的价格的时间序列DataFrame,早期日期可能存在NaN值
    # 计算涨跌幅前,先向后填充早期NaN,再向前填充剩余NaN
    df_filled = df_close.bfill().ffill()
    # 定义条件,调用pct_change时不再传fill_method参数
    c4plus = df_filled.pct_change() >= 0.04
    c4minus = df_filled.pct_change() <= -0.04
    c25_3plus = df_filled.pct_change(periods=63) >= 0.25
    c25_3minus = df_filled.pct_change(periods=63) <= -0.25
    c25_1plus = df_filled.pct_change(periods=21) >= 0.25
    c25_1minus = df_filled.pct_change(periods=21) <= -0.25
    c50_1plus = df_filled.pct_change(periods=21) >= 0.50
    c50_1minus = df_filled.pct_change(periods=21) <= -0.50
    c13_34plus = df_filled.pct_change(periods=34) >= 0.13
    c13_34minus = df_filled.pct_change(periods=34) <= -0.13

内容的提问来源于stack exchange,提问作者AndysPythonStuff

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 18:51:03