CFADataTest类用于时间序列数据的统计检验,主要应用于:
pip install FreeAeon-ML
或手动安装依赖包:
pip install numpy pandas matplotlib scipy statsmodels
CFADataTest是一个静态方法类,提供三个核心检验方法,无需实例化即可使用。
检验时间序列是否为平稳序列,用于判断是否可以使用ARIMA模型。
| 参数名 | 类型 | 说明 |
|---|---|---|
| timeSeries | pd.Series | 时间序列数据 |
返回pd.Series,包含以下指标: - Test Statistic: ADF检验统计量 - p-value: 显著性水平(越接近0越平稳) - Critical Value (1%/5%/10%): 临界值
满足以下条件时,序列为平稳序列: 1. Test Statistic < Critical Value (1%, 5%, 10%) 2. p-value ≈ 0 (接近0)
import pandas as pd
import numpy as np
from FreeAeonML.FADataEDA import CFADataTest
# 生成测试数据
np.random.seed(42)
data = np.random.randn(100)
ts = pd.Series(data)
# 平稳性检验
result = CFADataTest.stationarity_test(ts)
print(result)
# 输出示例:
# Test Statistic -9.876543
# p-value 0.000000
# Critical Value (1%) -3.496960
# Critical Value (5%) -2.890611
# Critical Value (10%) -2.582128
绘制自相关函数(ACF)和偏自相关函数(PACF)图,用于分析时间序列的相关性特征。
| 参数名 | 类型 | 说明 |
|---|---|---|
| timeSeries | pd.Series | 时间序列数据 |
无返回值,直接显示ACF和PACF图形。
ACF图(自相关系数): - 横轴: 滞后阶数(lag) - 纵轴: 自相关系数 - 显著性: 超过置信区间表示该滞后阶数有显著相关性 - 截尾特性: 系数逐渐趋于0表示序列平稳,可用ARMA模型
PACF图(偏自相关系数): - 横轴: 滞后阶数(lag) - 纵轴: 偏自相关系数 - 截尾特性: 在某个滞后阶数截尾,后续快速衰减,可用AR模型 - 模型阶数: 截尾位置即为AR模型的阶数
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from FreeAeonML.FADataEDA import CFADataTest
# 生成时间序列数据
np.random.seed(42)
data = np.cumsum(np.random.randn(100)) # 随机游走
ts = pd.Series(data)
# 显示ACF和PACF图
CFADataTest.show_acf_pacf(ts)
plt.show()
检验一个时间序列是否对另一个时间序列有预测能力(因果关系)。
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| ds_result | pd.Series | - | 结果序列(因变量,必须为平稳序列) |
| ds_source | pd.Series | - | 原因序列(自变量,必须为平稳序列) |
| maxlag | int/list | - | 最大滞后阶数,整数时遍历所有lag |
| p_value | float | 0.05 | 显著性水平 |
返回一个元组,包含4个元素: 1. min_lag_p (float): 最小的p值 2. best_lag (int): 最佳滞后阶数 3. approve_list (list): 通过检验的lag列表 4. detail (dict): 详细检验结果
import pandas as pd
import numpy as np
from FreeAeonML.FADataEDA import CFADataTest
# 生成两个相关的时间序列
np.random.seed(42)
n = 100
source = np.random.randn(n)
result = np.zeros(n)
for i in range(2, n):
result[i] = 0.5 * source[i-1] + 0.3 * source[i-2] + np.random.randn()
ds_source = pd.Series(source)
ds_result = pd.Series(result)
# 格兰杰因果检验
min_p, best_lag, approve_list, detail = CFADataTest.granger_test(
ds_result=ds_result,
ds_source=ds_source,
maxlag=5,
p_value=0.05
)
print(f"最小p值: {min_p}")
print(f"最佳滞后阶数: {best_lag}")
print(f"通过检验的lag: {approve_list}")
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from FreeAeonML.FADataEDA import CFADataTest
# 1. 生成测试数据
np.random.seed(42)
n = 200
# 平稳序列
stationary_series = pd.Series(np.random.randn(n))
# 非平稳序列(随机游走)
non_stationary_series = pd.Series(np.cumsum(np.random.randn(n)))
# 2. 平稳性检验
print("=" * 50)
print("平稳序列检验结果:")
result1 = CFADataTest.stationarity_test(stationary_series)
print(result1)
print("\n" + "=" * 50)
print("非平稳序列检验结果:")
result2 = CFADataTest.stationarity_test(non_stationary_series)
print(result2)
# 3. 自相关和偏自相关分析
print("\n" + "=" * 50)
print("绘制ACF和PACF图:")
CFADataTest.show_acf_pacf(stationary_series)
# 4. 格兰杰因果检验
# 构造因果关系: result[t] = 0.7*source[t-1] + noise
source = np.random.randn(n)
result_ts = np.zeros(n)
for i in range(1, n):
result_ts[i] = 0.7 * source[i-1] + 0.1 * np.random.randn()
ds_source = pd.Series(source)
ds_result = pd.Series(result_ts)
print("\n" + "=" * 50)
print("格兰杰因果检验:")
min_p, best_lag, approve_list, detail = CFADataTest.granger_test(
ds_result=ds_result,
ds_source=ds_source,
maxlag=10,
p_value=0.05
)
print(f"最小p值: {min_p:.6f}")
print(f"最佳滞后阶数: {best_lag}")
print(f"通过检验的lag列表:")
for item in approve_list:
print(f" lag={item['lag']}, max p-value={item['max p-value']:.6f}")
plt.show()