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

