Python中为DataFrame列的自相关系数添加显著性星号的方法
修复并实现自相关系数加显著性星号的功能
原代码存在几个关键问题,导致无法正确生成带星号的自相关系数表,下面是修正后的完整实现:
原代码的问题点
- 初始化
autocorr_df时错误引用了pd.DataFrame类而非创建实例,应该用pd.DataFrame() - 仅处理了最后一列的p值:星号计算逻辑放在列遍历循环外,导致所有列都用最后一列的显著性结果
- p值索引错误:
acf()带qstat=True返回的第四项才是p值(索引3),原代码用了索引2(对应Q统计量) - 数组拼接维度不匹配:星号列表的结构没有和自相关系数的行列对应
修正后的完整代码
import pandas as pd import numpy as np from statsmodels.tsa.stattools import acf def autocorr_with_asterisks(df, nlags=9): """ 计算时间序列各列的自相关系数,并添加显著性星号 参数: df (DataFrame): 输入的时间序列DataFrame nlags (int): 计算自相关的滞后阶数,默认9阶 返回: DataFrame: 带显著性星号的自相关系数表,行是滞后阶数,列是原数据列名 """ # 初始化存储自相关系数和星号的列表 autocorr_data = [] asterisks_data = [] for col in df.columns: # 计算自相关系数、置信区间、Q统计量和p值 acf_vals, _, _, p_vals = acf(df[col], nlags=nlags, qstat=True, fft=False) autocorr_data.append(acf_vals) # 根据p值生成对应星号 col_asterisks = [] for p_val in p_vals: if p_val < 0.01: col_asterisks.append('***') elif p_val < 0.05: col_asterisks.append('**') elif p_val < 0.1: col_asterisks.append('*') else: col_asterisks.append('') asterisks_data.append(col_asterisks) # 转换为DataFrame,行索引为滞后阶数 autocorr_df = pd.DataFrame(np.array(autocorr_data).T, columns=df.columns) autocorr_df.index.name = 'Lag' autocorr_df.index = [f"Lag_{i}" for i in range(nlags+1)] # 合并自相关系数和星号,保留4位小数保证可读性 asterisks_df = pd.DataFrame(np.array(asterisks_data).T, columns=df.columns) autocorr_with_stars = autocorr_df.round(4).astype(str) + asterisks_df return autocorr_with_stars
测试示例数据
# 生成AR(1)风格的测试数据 np.random.seed(42) # 设置随机种子保证结果可复现 data = np.zeros((200, 5)) drift = 0.1 for col in range(5): for i in range(1, 200): data[i, col] = data[i - 1, col] + drift + np.random.randn() df = pd.DataFrame(data, columns=['Column_1', 'Column_2', 'Column_3', 'Column_4', 'Column_5']) # 调用函数生成结果 result_df = autocorr_with_asterisks(df) print(result_df)
关键说明
- 用
fft=False避免快速傅里叶变换可能带来的精度问题,适配常规时间序列场景 - 自相关系数保留4位小数后转字符串,再拼接星号,兼顾精度和可读性
- 行索引设置为
Lag_0到Lag_9,清晰标识滞后阶数 - 显著性规则:p<0.01加***,0.01≤p<0.05加**,0.05≤p<0.1加*,p≥0.1不加星号
内容的提问来源于stack exchange,提问作者pinpss
相关产品推荐
相关产品推荐

