自相关图是什么?
自相关图(ACF)是用于检查给定数据集中随机性的常用工具。它主要用于进行时间序列分析和预测。它用于在时间序列中总结关系的强度,并在以前的时间步长中进行观察。
Python自相关应用:
- 模式识别
- 估计音高
- 信号检测
- 股票技术分析
- 信号处理
自相关图的特征:
- 从 +1 到 -1 不等。
- +1:如果时间序列 1 的值增加,则时间序列 2 也会增加
- -1:如果时间序列 1 的值增加,则时间序列 2 减小
语法:
matplotlib.pyplot.acorr(x, *, data=None, **kwargs)
参数:
- x:标量序列。
- detrend:可选参数。
- 默认值:mlab.detrend_none。
- normed:具有布尔值的可选参数。
- 默认值: 真。
- usevlines:具有布尔值的可选参数。
- 默认值: 真。
- maxlags:具有整数值的可选参数。
- 默认值:10
- linestyle:当 usevlines 为 False 时,用于绘制数据点的可选参数。
- marker:具有字符串值的可选参数。
- 默认值:'o'
示例1
在Python中,可以使用matplotlib库来绘制自相关图。
以下是一个使用statsmodels库中的plot_acf函数绘制自相关图的例子:
import pandas as pd
import statsmodels.api as sm
from statsmodels.graphics.tsaplots import plot_acf
import matplotlib.pyplot as plt # 导入matplotlib.pyplot模块
# 假设df是一个包含时间序列数据的DataFrame
df = pd.DataFrame({
'data': [0.776, 0.818, 0.819, 0.815, 0.805, 0.793, 0.786, 0.777, 0.767, 0.759]
})
# 使用plot_acf绘制自相关图
plot_acf(df['data'], use_vlines=True, lags=40)
plt.subplots_adjust(hspace=0.35) # 调整子图之间的空间,但在这个上下文中可能不是必需的
plt.show() # 显示图形
在这个例子中,df是包含时间序列数据的DataFrame。plot_acf函数绘制了数据的自相关图,use_vlines=True表示使用垂直线表示95%置信区间,lags参数设置了需要计算的延迟次数。最后使用show()显示图形。
示例2
import matplotlib.pyplot as plt
import numpy as np
data = np.array([1.0,20,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0,20.0])
plt.title("Autocorrelation Plot")
plt.xlabel("Lags")
plt.acorr(data, maxlags = 10)
plt.show()
输出:
在此示例中,我们首先使用 Python 的 NumPy 模块将数据创建为元素数组。然后,我们指定了图表的标题和标签。最后,我们使用 matplotlib 模块的 acorr() 方法绘制定义数据的 Python 自相关图。
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(30)
data = np.random.randn(20)
plt.title("Autocorrelation Plot")
plt.xlabel("Lags")
plt.acorr(data, maxlags = 10)
plt.show()
输出:
在这个例子中,我们使用随机函数来获取数据,并使用该数据在 Python 中绘制我们的自相关图。
时间序列的自相关:
from pandas import read_csv
from matplotlib import pyplot
data = read_csv('data.csv', header=0, index_col=0)
data.plot()
pyplot.show()
data.csv
"Date","Temp"
"1981-01-01",20.7
"1981-01-02",17.9
"1981-01-03",18.8
"1981-01-04",14.6
"1981-01-05",15.8
"1981-01-06",15.8
"1981-01-07",15.8
"1981-01-08",17.4
"1981-01-09",21.8
"1981-01-10",20.0
"1981-01-11",16.2
"1981-01-12",13.3
"1981-01-13",16.7
"1981-01-14",21.5
"1981-01-15",25.0
"1981-01-16",20.7
"1981-01-17",20.6
"1981-01-18",24.8
"1981-01-19",17.7
"1981-01-20",15.5
"1981-01-21",18.2
"1981-01-22",12.1
"1981-01-23",14.4
"1981-01-24",16.0
"1981-01-25",16.5
"1981-01-26",18.7
"1981-01-27",19.4
"1981-01-28",17.2
"1981-01-29",15.5
"1981-01-30",15.1
"1981-01-31",15.4
"1981-02-01",15.3
"1981-02-02",18.8
"1981-02-03",21.9
"1981-02-04",19.9
"1981-02-05",16.6
"1981-02-06",16.8
"1981-02-07",14.6
"1981-02-08",17.1
"1981-02-09",25.0
"1981-02-10",15.0
"1981-02-11",13.7
"1981-02-12",13.9
"1981-02-13",18.3
"1981-02-14",22.0
"1981-02-15",22.1
"1981-02-16",21.2
"1981-02-17",18.4
"1981-02-18",16.6
"1981-02-19",16.1
"1981-02-20",15.7
"1981-02-21",16.6
"1981-02-22",16.5
"1981-02-23",14.4
"1981-02-24",14.4
"1981-02-25",18.5
"1981-02-26",16.9
"1981-02-27",17.5
"1981-02-28",21.2
"1981-03-01",17.8
"1981-03-02",18.6
"1981-03-03",17.0
"1981-03-04",16.0
"1981-03-05",13.3
"1981-03-06",14.3
当我们执行上述代码时,它会创建一个时间序列的折线图。
现在,我们将使用 plot_acf() 来计算和绘制最低日温度的自相关图。
from statsmodels.graphics.tsaplots import plot_acf
plot_acf(data)
pyplot.show()
执行上述代码将创建一个 2D 图,显示沿 x 轴的滞后值以及 y 轴上 -1 和 1 之间的相关性。
自相关大型数组的最快方法:
numpy.correlate()
可用于确定两个 1D 序列之间的互相关。
语法:
numpy.correlate(a, v, mode = ‘valid’)
参数:
- a,v: 输入序列
- 模式:卷积文档字符串
返回值:
a 和 v 的离散互相关
import numpy as np
a = [1,2,3]
v = [4,5,6]
print(np.correlate(a, v, "same"))
输出:
[17 32 23]
在这个例子中,我们使用了 correlate() 方法来计算相关性,它通常在信号处理文本中定义: c_{av}[k] = sum_n a[n+k] * conj(v[n])