Wu *_*eng 12 python matplotlib pandas statsmodels
我正在密谋与python的自相关.我用三种方法来做:1.pandas,2.matplotlib,3.statsmodels.我发现我从matplotlib获得的图表与其他两个图表不一致.代码是:
from statsmodels.graphics.tsaplots import *
# print out data
print mydata.values
#1. pandas
p=autocorrelation_plot(mydata)
plt.title('mydata')
#2. matplotlib
fig=plt.figure()
plt.acorr(mydata,maxlags=150)
plt.title('mydata')
#3. statsmodels.graphics.tsaplots.plot_acf
plot_acf(mydata)
plt.title('mydata')
Run Code Online (Sandbox Code Playgroud)
Joe*_*ton 40
这是统计和信号处理之间不同的通用定义的结果.基本上,信号处理定义假定您将处理去趋势.统计定义假设减去均值就是你要做的所有去趋势,并为你做.
首先,让我们用一个独立的例子演示问题:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from statsmodels.graphics import tsaplots
def label(ax, string):
ax.annotate(string, (1, 1), xytext=(-8, -8), ha='right', va='top',
size=14, xycoords='axes fraction', textcoords='offset points')
np.random.seed(1977)
data = np.random.normal(0, 1, 100).cumsum()
fig, axes = plt.subplots(nrows=4, figsize=(8, 12))
fig.tight_layout()
axes[0].plot(data)
label(axes[0], 'Raw Data')
axes[1].acorr(data, maxlags=data.size-1)
label(axes[1], 'Matplotlib Autocorrelation')
tsaplots.plot_acf(data, axes[2])
label(axes[2], 'Statsmodels Autocorrelation')
pd.tools.plotting.autocorrelation_plot(data, ax=axes[3])
label(axes[3], 'Pandas Autocorrelation')
# Remove some of the titles and labels that were automatically added
for ax in axes.flat:
ax.set(title='', xlabel='')
plt.show()
Run Code Online (Sandbox Code Playgroud)
那么,为什么我说他们都是正确的呢?他们明显不同!
让我们编写自己的自相关函数来演示plt.acorr
正在做的事情:
def acorr(x, ax=None):
if ax is None:
ax = plt.gca()
autocorr = np.correlate(x, x, mode='full')
autocorr /= autocorr.max()
return ax.stem(autocorr)
Run Code Online (Sandbox Code Playgroud)
如果我们用我们的数据绘制这个,我们会得到一个或多或少相同的结果plt.acorr
(我正在遗漏正确标记滞后,仅仅因为我很懒):
fig, ax = plt.subplots()
acorr(data)
plt.show()
Run Code Online (Sandbox Code Playgroud)
这是一个完全有效的自相关.这完全取决于您的背景是信号处理还是统计.
这是信号处理中使用的定义.假设您将处理对数据的detrend
去除(请注意kwarg plt.acorr
).如果你想要它去除趋势,你将明确地要求它(并且可能做一些比仅减去平均值更好的东西),否则不应该假设它.
在统计数据中,简单地减去均值被认为是您想要去除趋势的.
所有其他函数都在相关之前减去数据的平均值,类似于:
def acorr(x, ax=None):
if ax is None:
ax = plt.gca()
x = x - x.mean()
autocorr = np.correlate(x, x, mode='full')
autocorr /= autocorr.max()
return ax.stem(autocorr)
fig, ax = plt.subplots()
acorr(data)
plt.show()
Run Code Online (Sandbox Code Playgroud)
但是,我们仍然有一个很大的区别.这个纯粹是一个绘图惯例.
在大多数信号处理教科书中(无论如何,我已经看到),显示"完全"自相关,使得零滞后在中心,并且结果在每一侧是对称的.另一方面,R具有非常合理的惯例,仅显示它的一面.(毕竟,另一方是完全冗余的.)统计绘图函数遵循R对流,并plt.acorr
遵循Matlab所做的,这是相反的惯例.
基本上,你想要这个:
def acorr(x, ax=None):
if ax is None:
ax = plt.gca()
x = x - x.mean()
autocorr = np.correlate(x, x, mode='full')
autocorr = autocorr[x.size:]
autocorr /= autocorr.max()
return ax.stem(autocorr)
fig, ax = plt.subplots()
acorr(data)
plt.show()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
10176 次 |
最近记录: |