使用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
相关产品推荐
相关产品推荐

