statsmodels InfeasibleTestError问题:代码在Python文件执行失败
解决statsmodels的InfeasibleTestError:移除全常量列
错误原因
报错statsmodels.tools.sm_exceptions.InfeasibleTestError: 输入的x值包含全常量列,无法计算检验统计量的核心原因是:格兰杰因果检验要求输入变量必须有取值波动,全常量列(所有行值完全相同)无法提供有效统计信息,导致检验无法执行。
问题分析
你代码里注释的移除常量列逻辑写反了——原来的df.loc[:, df.apply(pd.Series.nunique) == 1]是只保留全常量列,反而会加剧问题。另外Jupyter能运行大概率是因为缓存了之前处理过的数据集,而Python脚本每次重新读取原始Excel文件,直接暴露了数据里的常量列问题。
修复后的代码
@app.route('/gct',methods=['POST','GET']) def gct(): df = pd.read_excel('data.xlsx') nobs = -15 # 移除所有全常量列(仅保留唯一值数量大于1的列) df = df.loc[:, df.apply(pd.Series.nunique) != 1] # 清理列名前后空白,避免潜在的列名匹配问题 df.columns = df.columns.str.strip() # 划分训练集和测试集 X_train, X_test = df[0:-nobs], df[-nobs:] # 执行格兰杰因果检验 result = granger.granger_causation_matrix(X_train, variables=X_train.columns) print("gct") return render_template("gct.html",output=X_train)
额外检查建议
- 执行
print(df.nunique())可以查看各列的唯一值数量,确认所有列都不是全常量; - 如果仍有报错,检查是否存在近乎常量的列(比如仅1-2个不同值),这类列也可能影响检验结果,可根据业务需求决定是否移除。
内容的提问来源于stack exchange,提问作者Neha Khairnar
相关产品推荐
相关产品推荐

