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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 15:45:33