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

使用Statsmodels adfuller执行ADF检验时遇NaN/Inf报错排查

解决statsmodels adfuller的ValueError: array must not contain infs or NaNs问题

我之前也踩过完全一样的坑!明明用np.isnan和pd.isnull检查过都没问题,但adfuller还是报错,后来排查出几个容易忽略的细节,给你整理了可行的解决步骤:

1. 排查「隐性异常值」

表面的全局检查可能漏掉局部问题,试试这些更细致的方法:

  • 逐列精准排查,避免整表检查的盲区:
    import numpy as np
    for col in df.columns:
        has_nan = df[col].isna().any()
        has_inf = df[col].isin([np.inf, -np.inf]).any()
        print(f"列 {col}: 存在NaN={has_nan}, 存在Inf={has_inf}")
    
  • 查看数据统计极值,有没有接近Inf的超大/超小数值(比如1e308这类临界值,会被adfuller判定为Inf):
    print(df.describe())
    
  • 强制转换为数值类型,避免object类型藏着字符串格式的异常值:
    df = df.astype('float64')
    

2. 补全NaN填充逻辑

你提到的填充规则可能有遗漏,比如开头连续多个NaN时,前向填充(ffill)无法覆盖,需要反向填充兜底:

# 先前向填充,再用反向填充补全开头的NaN
df = df.fillna(method='ffill').fillna(method='bfill')

同时直接把Inf替换为NaN后统一处理:

df = df.replace([np.inf, -np.inf], np.nan).fillna(method='ffill').fillna(method='bfill')

3. 确认adfuller的输入格式

adfuller要求传入一维数值数组,确保你传的不是带索引的Series,而是纯数值序列:

from statsmodels.tsa.stattools import adfuller

# 正确的传入方式:提取列的数值数组
result = adfuller(df['你的时间序列列'].values)

4. 用断言强制验证清理结果

最后加个断言,确保数据真的没有异常值,避免后续踩坑:

assert not df.isnull().any().any(), "数据中仍存在未清理的NaN值!"
assert not np.isinf(df).any().any(), "数据中仍存在未清理的Inf值!"

如果断言触发,就说明还有遗漏的异常值,再针对性排查即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:16:52