Python 如何检查时间序列数据是否稳定
时间序列是一组在固定时间间隔记录的数据点。它用于研究趋势模式,变量在定义的时间内的关系。时间序列的常见示例包括股票价格、天气模式和经济指标。
通过统计和数学技巧分析时间序列数据。时间序列的主要目的是通过以往数据的模式和趋势来预测未来值。
如果数据在时间上不发生变化,则称为稳定的数据。有必要检查数据是否稳定。有多种方法可以检查时间序列数据是否稳定,让我们逐个看看。
增广Dickey-Fuller(ADF)
增广Dickey-Fuller(ADF)是一种统计测试,用于检查时间序列数据中是否存在单位根。单位根是非稳定的数据。它返回测试统计量和p值作为输出。
在输出中,如果p值低于0.05,表示非稳定的时间序列数据。下面是ADF稳定数据的示例。我们可以使用Python中的函数adfuller(),它位于statsmodel包中,用于检查时间序列数据是否稳定。
示例
在这个示例中,我们使用Python的statsmodel包的adfuller()函数找出增广Dickey Fuller的ADF统计量和p值。
from statsmodels.tsa.stattools import adfuller
import pandas as pd
data = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv',parse_dates=['date'], index_col='date')
t_data = data.loc[:, 'value'].values
result = adfuller(t_data)
print("The result of adfuller function:",result)
print('ADF Statistic:', result[0])
print('p-value:', result[1])
输出
执行上述程序后产生的输出如下:
The result of adfuller function: (3.145185689306744, 1.0, 15, 188, {'1%': -3.465620397124192, '5%': -2.8770397560752436, '10%': -2.5750324547306476}, 549.6705685364172)
ADF Statistic: 3.145185689306744
p-value: 1.0
KPSS检验
用于检测单位根的另一种检验方法是 KPSS检验 ,其简称为 Kwiatkowski-Phillips-Schmidt-Shin检验 。statsmodels包中有一个名为 kpss()的函数 ,用于检验时间序列数据中是否存在单位根。
示例
下面是一个在时间序列数据中查找单位根的示例。
from statsmodels.tsa.stattools import kpss
import pandas as pd
data = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv',parse_dates=['date'], index_col='date')
t_data = data.loc[:, 'value'].values
from statsmodels.tsa.stattools import kpss
result = kpss(data)
print("The result of kpss function:",result)
print('KPSS Statistic:', result[0])
print('p-value:', result[1])
输出
下面是statsmodels包中 kpss() 函数的输出。
The result of kpss function: (2.0131256386303322, 0.01, 9, {'10%': 0.347, '5%': 0.463, '2.5%': 0.574, '1%': 0.739})
KPSS Statistic: 2.0131256386303322
p-value: 0.01
滚动统计
另一种检查时间序列数据平稳性的方法是通过绘制给定时间序列数据的移动平均和移动标准差,并检查数据是否保持恒定。如果数据在图中随着时间的变化而变化,则时间序列数据是非平稳的。
示例
以下是使用 matplotlib 库的 plot() 函数绘制移动平均和移动标准差以检查数据变化的示例。
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv('https://raw.githubusercontent.com/selva86/datasets/master/a10.csv',parse_dates=['date'], index_col='date')
t_data = data.loc[:, 'value'].values
moving_avg = t_data.mean()
moving_std = t_data.std()
plt.plot(data, color='green', label='Original')
plt.plot(moving_avg, color='red', label='moving average')
plt.plot(moving_std, color='black', label='moving Standard deviation')
plt.legend(loc='best')
plt.title('Moving Average & Moving Standard Deviation')
plt.show()
输出
下面是通过绘制移动平均线和移动标准差对时间序列数据进行标准化处理的结果。