ADF 测试(计算时间序列数据是否平稳)
·
原理
单位根检验
单位根检验是一种统计检验方法,用于判断时间序列数据是否平稳。平稳的时间序列在统计特性上不随时间变化,而非平稳的时间序列可能存在趋势、季节性等因素。在时间序列分析中,很多模型(如 ARIMA 模型)要求数据是平稳的,因此在建模之前需要进行单位根检验。
ADF 检验(Augmented Dickey - Fuller test)
ADF 检验是一种常用的单位根检验方法,它通过检验时间序列是否存在单位根来判断其平稳性。原假设 H0 是时间序列存在单位根,即序列非平稳;备择假设 H1 是时间序列不存在单位根,即序列平稳。通过比较检验统计量和临界值,或者查看 p 值来决定是否拒绝原假设。
calculate_ADF函数:读取指定路径下的 CSV 文件,对除date列之外的所有列数据分别进行 ADF 检验(使用statsmodels库的adfuller函数),并将每次检验的结果存储在列表中,最后将列表转换为numpy数组返回。calculate_target_ADF函数:读取指定路径下的 CSV 文件,根据传入的目标列名(以逗号分隔的字符串形式)筛选出相应的列数据,对这些列数据分别进行 ADF 检验(同样使用statsmodels库的adfuller函数),并将每次检验的结果存储在列表中,最后将列表转换为numpy数组返回。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 检验统计量的平均值。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)