原理

单位根检验

单位根检验是一种统计检验方法,用于判断时间序列数据是否平稳。平稳的时间序列在统计特性上不随时间变化,而非平稳的时间序列可能存在趋势、季节性等因素。在时间序列分析中,很多模型(如 ARIMA 模型)要求数据是平稳的,因此在建模之前需要进行单位根检验。

ADF 检验(Augmented Dickey - Fuller test)

ADF 检验是一种常用的单位根检验方法,它通过检验时间序列是否存在单位根来判断其平稳性。原假设 H0​ 是时间序列存在单位根,即序列非平稳;备择假设 H1​ 是时间序列不存在单位根,即序列平稳。通过比较检验统计量和临界值,或者查看 p 值来决定是否拒绝原假设。

  1. calculate_ADF 函数:读取指定路径下的 CSV 文件,对除 date 列之外的所有列数据分别进行 ADF 检验(使用 statsmodels 库的 adfuller 函数),并将每次检验的结果存储在列表中,最后将列表转换为 numpy 数组返回。
  2. calculate_target_ADF 函数:读取指定路径下的 CSV 文件,根据传入的目标列名(以逗号分隔的字符串形式)筛选出相应的列数据,对这些列数据分别进行 ADF 检验(同样使用 statsmodels 库的 adfuller 函数),并将每次检验的结果存储在列表中,最后将列表转换为 numpy 数组返回。
  3. archADF 函数:读取指定路径下的 CSV 文件,对除第一列之外的所有列数据分别进行 ADF 检验(使用 arch 库的 ADF 类),计算每列数据 ADF 检验统计量的平均值并返回。

代码详细解释

calculate_ADF 函数
def calculate_ADF(root_path, data_path):
    # 读取指定路径下的 CSV 文件
    df_raw = pd.read_csv(os.path.join(root_path, data_path))
    # 获取数据框的列名列表
    cols = list(df_raw.columns)
    # 移除 'date' 列
    cols.remove('date')
    # 选取除 'date' 列之外的所有列数据
    df_raw = df_raw[cols]
    # 初始化一个空列表,用于存储 ADF 检验结果
    adf_list = []
    # 遍历每一列数据
    for i in cols:
        # 获取当前列的数据
        df_data = df_raw[i]
        # 对当前列数据进行 ADF 检验,指定最大滞后阶数为 1
        adf = adfuller(df_data, maxlag = 1)
        # 打印检验结果
        print(adf)
        # 将检验结果添加到列表中
        adf_list.append(adf)
    # 将列表转换为 numpy 数组并返回
    return np.array(adf_list)
calculate_target_ADF 函数
def calculate_target_ADF(root_path, data_path, target='OT'):
    # 读取指定路径下的 CSV 文件
    df_raw = pd.read_csv(os.path.join(root_path, data_path))
    # 将目标列名(以逗号分隔的字符串)拆分为列表
    target_cols = target.split(',')
    # 选取目标列的数据
    df_raw = df_raw[target_cols]
    # 初始化一个空列表,用于存储 ADF 检验结果
    adf_list = []
    # 遍历每一个目标列
    for i in target_cols:
        # 获取当前列的数据
        df_data = df_raw[i]
        # 对当前列数据进行 ADF 检验,指定最大滞后阶数为 1
        adf = adfuller(df_data, maxlag = 1)
        # 将检验结果添加到列表中
        adf_list.append(adf)
    # 将列表转换为 numpy 数组并返回
    return np.array(adf_list)
archADF 函数
def archADF(root_path, data_path):
    # 读取指定路径下的 CSV 文件
    df = pd.read_csv(os.path.join(root_path, data_path))
    # 获取除第一列之外的所有列名
    cols = df.columns[1:]
    # 初始化统计量总和为 0
    stats = 0
    # 遍历每一列数据
    for target_col in cols:
        # 获取当前列的数据并转换为 numpy 数组
        series = df[target_col].values
        # 使用 arch 库的 ADF 类对当前列数据进行 ADF 检验
        adf = ADF(series)
        # 获取检验统计量
        stat = adf.stat
        # 将检验统计量累加到总和中
        stats += stat
    # 计算所有列检验统计量的平均值并返回
    return stats / len(cols)

总结

这些代码的主要目的是对时间序列数据进行 ADF 检验,以判断数据的平稳性。calculate_ADF 函数对除 date 列之外的所有列进行检验,calculate_target_ADF 函数对指定的目标列进行检验,archADF 函数计算除第一列之外所有列 ADF 检验统计量的平均值。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐