使用滚动窗口应用Scipy独立样本ttest的实现问题咨询 - 第2部分
Pandas滚动窗口执行独立样本t检验的修正方案
错误原因
原代码无法运行主要有两个核心问题:
- pandas
rolling.apply默认按单列迭代处理,传入函数的参数是一维Series,无法同时读取bias和score两列数据,调用字段索引会直接报错 - 自定义函数返回的是二元组,而
rolling.apply默认要求返回单个标量,直接赋值给两个新列会出现维度不匹配问题
修正方案
我们可以通过对索引做滚动遍历的方式,让每个窗口能读取到完整的行数据,同时调整函数返回格式为Pandas Series,实现多结果列的直接赋值,完整可运行代码如下:
import pandas as pd from scipy.stats import ttest_ind # 独立性检验辅助函数,调整返回格式为Series def conduct_ttest(data, variable_1="bias", variable_2="score", nan_policy="omit"): test_result = ttest_ind(data[variable_1], data[variable_2], nan_policy=nan_policy) test_statistic = test_result[0] p_value = test_result[1] return pd.Series([test_statistic, p_value], index=["test_statistic", "p_value"]) window_size = 5 # 对索引做滚动处理,保证每个窗口可以获取对应行的全量字段 data[["test_statistic", "p_value"]] = ( data.index.to_series() .rolling(window_size) .apply(lambda idx_range: conduct_ttest(data.loc[idx_range])) )
结果说明
- 前
window_size-1行(也就是前4行)由于窗口数据不足,计算结果为NaN,符合滚动计算的常规逻辑 - 新生成的
test_statistic和p_value列会直接追加到原DataFrame中,无需额外拼接操作
内容的提问来源于stack exchange,提问作者john_mon
相关产品推荐
相关产品推荐

