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

Pandas apply函数应用问题:分组执行ADF检验与差分处理

问题解决:分组应用ADF差分函数的报错处理

核心问题拆解

  • ValueError(样本量过小):分组后部分子组的时间序列长度未达ADF检验的最小要求(statsmodels的adfuller一般需要至少10个有效样本),直接触发检验报错。
  • TypeError(参数不匹配):分组对多列应用函数时,传递给test_diff的是DataFrame而非单个Series,原函数仅支持Series输入导致参数不兼容。

修正后的test_diff函数

加入样本量校验,同时兼容Series和DataFrame输入:

from statsmodels.tsa.stattools import adfuller
import pandas as pd

def test_diff(data, sig_level=0.05):
    # 处理多列DataFrame:递归调用函数处理每一列
    if isinstance(data, pd.DataFrame):
        return data.apply(test_diff, sig_level=sig_level)
    
    # 处理单列Series:先做数据清洗与样本量校验
    series = data.dropna()
    if len(series) < 10:  # 可根据数据情况调整最小样本阈值
        return series  # 样本量不足时返回原序列,也可按需求改为返回差分
    
    # 执行ADF检验
    adf_stat, p_value, _, _, crit_values, _ = adfuller(series)
    # 按用户逻辑:检验统计量小于5%临界值时返回差分,否则返回原序列
    if adf_stat < crit_values['5%']:
        return series.diff().dropna()
    else:
        return series

注:如果用户原逻辑中的stat_p指的是ADF检验的p值,可将判断条件改为if p_value < sig_level:,需根据实际业务需求调整。


分组应用的正确写法

直接调用修正后的函数即可处理多列分组场景:

# 处理后保持分组后的索引结构
processed_df = df.groupby('name')[['p1', 'p2']].apply(test_diff)

# 若需要保持原始数据的索引结构,改用transform
processed_df = df.groupby('name')[['p1', 'p2']].transform(test_diff)

关键注意事项

  • 样本量阈值:len(series) < 10是经验值,需根据数据实际情况调整,过小样本的ADF检验结果无统计意义。
  • 缺失值处理:先执行dropna()避免因缺失值触发额外报错。
  • 逻辑验证:确认ADF检验的判断逻辑匹配业务需求——通常ADF检验中,检验统计量小于临界值(或p值<0.05)代表序列平稳,若你的需求是非平稳才差分,需调整判断条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 00:05:21