为什么差分后原时间序列 差分第一个数据显示为NA

时间序列预测分析(ARIMA) - 简书
时间序列预测分析(ARIMA)
使用pandas上传下载时间序列
pandas中有专门处理时间序列对象的库
import pandas as pd
import numpy as np
import matplotlib.pylab as plt
%matplotlib inline
from matplotlib.pylab import rcParams
rcParams['figure.figsize'] = 15, 6
上传数据集和查看一些最初的行以及列的数据类型
data = pd.read_csv('AirPassengers.csv')
print data.head()
print '\n Data Types:'
print data.dtypes
结果如下:
注意:时间序列对象的读取和数据类型的对象读取不同。因此,为了将读取数据作为时间序列,我们必须通过特殊的参数读取csv指令。
dateparse = lambda dates: pd.datetime.strptime(dates, '%Y-%m')
data = pd.read_csv('AirPassengers.csv', parse_dates='Month', index_col='Month',date_parser=dateparse)
print data.head()
参数含义:
parse_dates:指定含有时间数据信息的列
index_col:索引列,并且可以通过data.index检查索引数据类型
date_parser:将输入字符串转换为可变的时间数据
结果如下:
还可以将列转化为序列对象:
ts = data[‘#Passengers’] ts.head(10)
结果如下:
然后就可以使用时间序列索引技术:
#1. Specific the index as a string constant:
#2. Import the datetime library and use 'datetime' function:
from datetime import datetime
ts[datetime()]
#1. Specify the entire range:
#2. Use ':' if one of the indices is at ends:
两种都会输出:
检验时间序列稳定性
稳定性条件:
恒定的平均数
恒定的方差
不随时间变化的自协方差
稳定性测试方法:
绘制滚动统计 :我们可以绘制移动平均数和移动方差,观察它是否随着时间变化。但是,这更多的是一种视觉技术。
DF检验: 这是一种检查数据稳定性的统计测试。
打印滚动统计量和DF统计量:
在此定义了一个需要时间序列作为输入的函数,用于生成结果。为了保持单元和平均数相似,绘制标准差来代替方差。
from statsmodels.tsa.stattools import adfuller
def test_stationarity(timeseries):
#Determing rolling statistics
rolmean = pd.rolling_mean(timeseries, window=12)
rolstd = pd.rolling_std(timeseries, window=12)
#Plot rolling statistics:
orig = plt.plot(timeseries, color='blue',label='Original')
mean = plt.plot(rolmean, color='red', label='Rolling Mean')
std = plt.plot(rolstd, color='black', label = 'Rolling Std')
plt.legend(loc='best')
plt.title('Rolling Mean & Standard Deviation')
plt.show(block=False)
#Perform Dickey-Fuller test:
print 'Results of Dickey-Fuller Test:'
dftest = adfuller(timeseries, autolag='AIC')
dfoutput = pd.Series(dftest[0:4], index=['Test Statistic','p-value','#Lags Used','Number of Observations Used'])
for key,value in dftest[4].items():
dfoutput['Critical Value (%s)'%key] = value
print dfoutput
运行结果如下图:
对时间序列进行建模
两种消除趋势和季节性的方法:差分和分解
举例:一阶差分
ts_log_diff = ts_log - ts_log.shift()
plt.plot(ts_log_diff)
结果如下:
验证如下:
ts_log_diff.dropna(inplace=True)
test_stationarity(ts_log_diff)
验证结果:
我们可以看到平均数和标准差随着时间有小的变化。同时,DF检验统计量小于10%的临界值,因此该时间序列在90%的置信区间上是稳定的。同样可以采取二阶或三阶差分在具体情况中获得更好的结果。
分解是一种比较容易解释的手段
消除趋势和季节性:
from statsmodels.tsa.seasonal import seasonal_decompose
decomposition = seasonal_decompose(ts_log)
trend = decomposition.trend
seasonal = decomposition.seasonal
residual = decomposition.resid
plt.subplot(411)
plt.plot(ts_log, label='Original')
plt.legend(loc='best')
plt.subplot(412)
plt.plot(trend, label='Trend')
plt.legend(loc='best')
plt.subplot(413)
plt.plot(seasonal,label='Seasonality')
plt.legend(loc='best')
plt.subplot(414)
plt.plot(residual, label='Residuals')
plt.legend(loc='best')
plt.tight_layout()
得到如下结果:
再接着检验残差稳定性:
ts_log_decompose = residual
ts_log_decompose.dropna(inplace=True)
test_stationarity(ts_log_decompose)
得到如下结果:
DF测试统计量明显低于1%的临界值,这样时间序列是非常接近稳定。当然也可以尝试高级的分解技术产生更好的结果。
预测时间序列(ARIMA)
1、计算ACF和PACF代码如下:
#ACF and PACF plots:
from statsmodels.tsa.stattools import acf, pacf
lag_acf = acf(ts_log_diff, nlags=20)
lag_pacf = pacf(ts_log_diff, nlags=20, method='ols')
#Plot ACF:
plt.subplot(121)
plt.plot(lag_acf)
plt.axhline(y=0,linestyle='--',color='gray')
plt.axhline(y=-1.96/np.sqrt(len(ts_log_diff)),linestyle='--',color='gray')
plt.axhline(y=1.96/np.sqrt(len(ts_log_diff)),linestyle='--',color='gray')
plt.title('Autocorrelation Function')
#Plot PACF:
plt.subplot(122)
plt.plot(lag_pacf)
plt.axhline(y=0,linestyle='--',color='gray')
plt.axhline(y=-1.96/np.sqrt(len(ts_log_diff)),linestyle='--',color='gray')
plt.axhline(y=1.96/np.sqrt(len(ts_log_diff)),linestyle='--',color='gray')
plt.title('Partial Autocorrelation Function')
plt.tight_layout()
结果如下:
2、确定ARIMA模型
在此例中,应该使用ARIMA(2,1,2)模型
代码如下:
from statsmodels.tsa.arima_model import ARIMA
model = ARIMA(ts_log, order=(2, 1, 2))
results_ARIMA = model.fit(disp=-1)
plt.plot(ts_log_diff)
plt.plot(results_ARIMA.fittedvalues, color='red')
plt.title('RSS: %.4f'% sum((results_ARIMA.fittedvalues-ts_log_diff)**2))
预测结果:
3、与原始数据相比较检验
首先,作为一个独立的序列,存储预测结果,观察它。
predictions_ARIMA_diff = pd.Series(results_ARIMA.fittedvalues, copy=True)
print predictions_ARIMA_diff.head()
结果如下:
注意,这些是从‘’开始,而不是第一个月。这是因为我们将第一个月份取为滞后值,一月前面没有可以减去的元素。
然后,将差分转换为对数尺度的方法是这些差值连续地添加到基本值。一个简单的方法就是首先确定索引的累计总和,然后将其添加到基本值。
predictions_ARIMA_diff_cumsum = predictions_ARIMA_diff.cumsum()
print predictions_ARIMA_diff_cumsum.head()
结果如下:
接下来,我们将它们添加到基本值。
predictions_ARIMA_log = pd.Series(ts_log.ix[0], index=ts_log.index)
predictions_ARIMA_log = predictions_ARIMA_log.add(predictions_ARIMA_diff_cumsum,fill_value=0)
predictions_ARIMA_log.head()
结果如下:
最后,将指数与原序列比较。
predictions_ARIMA = np.exp(predictions_ARIMA_log)
plt.plot(ts)
plt.plot(predictions_ARIMA)
plt.title('RMSE: %.4f'% np.sqrt(sum((predictions_ARIMA-ts)**2)/len(ts)))
结果如下:
可不可以帮我点个喜欢,感激不尽!其他(20)
差分序列是一种基于前缀和数组的神奇算法,在Rivendell神的教导下,我学会了这种神奇算法,先贴出Rivendell神博客的网址
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &/Rivendell
我们考虑这样一种问题,对于区间内每一组修改,修改范围是连续的,那么基于这种特性,我们可以对它的区间首段加上x,再在区间末端+1处减去x,最终用前缀和数组加以统计,那么有且仅有这一段区间的值就整体赋为了x(由于开头加了x,所以区间值开始修改,直到末端+1处-x,对之后的数据也不会有任何影响)。就可以得出所需的值。(此处若不明白,模拟一下就明白喽。。。)
先粘出模版题 COGS &1435 &金发姑娘与N头牛 &code:
#include&iostream&
#include&cstdio&
#include&cstring&
#include&algorithm&
struct hp{
}a[20001];
int b[40001],dc[20001];
int s[50000],n;
int main()
int i,size,maxn,x,y,z;
freopen(&milktemp.in&,&r&,stdin);
freopen(&milktemp.out&,&w&,stdout);
scanf(&%d%d%d%d&,&n,&x,&y,&z);
for (i=1;i&=n;++i)
scanf(&%d%d&,&a[i].l,&a[i].r);
b[i&&1-1]=a[i].l;
b[i&&1]=a[i].r;
sort(b+1,b+2*n+1);
size=unique(b+1,b+2*n+1)-b-1;
for (i=1;i&=n;++i)
a[i].l=upper_bound(b+1,b+size+1,a[i].l)-b;
a[i].r=upper_bound(b+1,b+size+1,a[i].r)-b;
for (i=1;i&=n;++i)
dc[a[i].l]-=x; dc[a[i].l]+=y;
dc[a[i].r+1]-=y; dc[a[i].r+1]+=z;
dc[size]-=z;
s[0]=dc[0];
for (i=1;i&=++i)
s[i]=s[i-1]+dc[i];
maxn=max(maxn,s[i]);
printf(&%d\n&,maxn);
fclose(stdin);
fclose(stdout);
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- COGS 465 挤牛奶 & & & & &
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & &一道看似很水的差分序列(只有一星),当由于题目中有关开闭区间交代的很不明确,所以乱搞了几次,终于AC了。。。。。。
& & & &我们建两个前缀和数组,分别保存挤奶时间与空闲时间,然后差分约束,最后统计:对于挤奶的数组,统计&0的连续最长子区间;对与空闲时间的前缀和数组,统计&n-1的连续最长子区间;输出即可;但这样只能A九个点,我们发现,这坑爹的数据居然认为1~100与101~200不连续,于是我们考虑把区间扩大,原先的1~100变为2~200,原先的101~200变为202~400,这样就不连续了,处理出答案再除去二就好了。 code:
#include&iostream&
#include&cstdio&
#include&cstring&
#include&algorithm&
struct hp{
int dcb[2000001],dcw[2000001];
int sb[2000001],sw[2000001];
int main()
int i,size,maxn,
int ansb,answ,
freopen(&milk2.in&,&r&,stdin);
freopen(&milk2.out&,&w&,stdout);
scanf(&%d&,&n);
minn=; maxn=0;
for (i=1;i&=n;++i)
scanf(&%d%d&,&a[i].l,&a[i].r);
a[i].l*=2; a[i].r*=2;
minn=min(minn,a[i].l);
maxn=max(maxn,a[i].r);
for (i=1;i&=n;++i)
dcb[a[i].l]++;
dcb[a[i].r+1]--;
dcw[minn]++;
dcw[a[i].l+1]--;
dcw[a[i].r]++;
dcw[maxn+1]--;
for (i=i&=maxn+1;++i)
sb[i]=sb[i-1]+dcb[i];
for (i=i&=maxn+1;++i)
sw[i]=sw[i-1]+dcw[i];
sum=0; ansb=0; answ=0;
for (i=i&=maxn+1;++i)
if (sb[i]&0)
ansb=max(ansb,sum);
for (i=i&=maxn+1;++i)
if (sw[i]&n-1)
answ=max(answ,sum);
printf(&%d %d\n&,(ansb-1)/2,(answ-1)/2);
fclose(stdin);
fclose(stdout);
}---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:33404次
积分:1121
积分:1121
排名:千里之外
原创:73篇
评论:22条
(2)(4)(6)(4)(10)(3)(8)(8)(7)(7)(4)(4)(7)
壮哉我大一中信息组苹果/安卓/wp
积分 129, 距离下一级还需 16 积分
权限: 自定义头衔
道具: 彩虹炫, 涂鸦板, 雷达卡, 热点灯, 金钱卡, 显身卡下一级可获得
道具: 匿名卡
购买后可立即获得
权限: 隐身
道具: 金钱卡, 彩虹炫, 雷达卡, 热点灯, 涂鸦板
本帖最后由 wanghaidong918 于
17:07 编辑
Date: 12/29/09& &Time: 21:32& &
Sample: & &&&
Included observations: 33& &
Test assumption: Linear deterministic trend in the data& &
Series: UKG UKUS& &
Lags interval: 1 to 1& &
Likelihood 5 Percent 1 Percent
Eigenvalue Ratio Critical Value Critical Value
0..2&&20.04
0..543016& &3.76& &6.65
*(**) denotes rejection of the hypothesis at 5%(1%) significance level& &
L.R. test indicates 2 cointegrating equation(s) at 5% significance level& &
Unnormalized Cointegrating Coefficients:& &
& &如题,检验结果如下
UKG UKUS&&
0..167107&&
0..950507&&
Normalized Cointegrating Coefficients: 1 Cointegrating Equation(s)& &
UKG UKUS C
1...279073
&&(1.21190)&&
Log likelihood -37.08184
理论上来讲,这意味着 Johansen检验 认为你的两个时间序列是平稳的。所以任何线性组合都是平稳的。但在实际操作中,这个结论往往和单位根检验的结果相互矛盾。这是 Johansen检验 的一个问题。在这个时候,你可以考虑使用EG方法。
载入中......
理论上来讲,这意味着 Johansen检验 认为你的两个时间序列是平稳的。所以任何线性组合都是平稳的。但在实际操作中,这个结论往往和单位根检验的结果相互矛盾。这是 Johansen检验 的一个问题。在这个时候,你可以考虑使用EG方法。
两个单整序列之间最多只存在一个协整关系(Johansen,1991)。若Johansen协整检验结果表明,两个变量之间存在一个以上(至少2个)的协整关系,则与Johansen(1991)的理论相矛盾,因此二者之间不存在协整关系——这是在一篇论文(发表在CSSCI期刊,还不错的期刊吧,具体我忘了)上看到的,至于可信度,不是很清楚,楼主斟酌采纳。
如果你用的是JOHANSEN协整检验,则首先通过迹检验和最大特征根检验确定是否存在协整关系,如果是,则看协整关系的第一个方程,不必关注其余几个方程。
总评分:&学术水平 + 1&
热心指数 + 1&
本帖被以下文库推荐
& |主题: 8540, 订阅: 48
理论上来讲,这意味着 Johansen检验 认为你的两个时间序列是平稳的。所以任何线性组合都是平稳的。但在实际操作中,这个结论往往和单位根检验的结果相互矛盾。这是 Johansen检验 的一个问题。在这个时候,你可以考虑使用EG方法。
热心帮助其他会员
总评分:&经验 + 10&
论坛币 + 10&
两个单整序列之间最多只存在一个协整关系(Johansen,1991)。若Johansen协整检验结果表明,两个变量之间存在一个以上(至少2个)的协整关系,则与Johansen(1991)的理论相矛盾,因此二者之间不存在协整关系——这是在一篇论文(发表在CSSCI期刊,还不错的期刊吧,具体我忘了)上看到的,至于可信度,不是很清楚,楼主斟酌采纳。
热心帮助其他会员
总评分:&经验 + 10&
论坛币 + 10&
谢谢,还有别的解释吗
谢谢以上好心人
我们现在也遇到了这个问题。。。谢谢楼主
小桥流水人家
如果你用的是JOHANSEN协整检验,则首先通过迹检验和最大特征根检验确定是否存在协整关系,如果是,则看协整关系的第一个方程,不必关注其余几个方程。
热心帮助其他会员
总评分:&经验 + 10&
论坛币 + 10&
遇到同样问题,学习了!
dyshappy 发表于
理论上来讲,这意味着 Johansen检验 认为你的两个时间序列是平稳的。所以任何线性组合都是平稳的。但在实际 ...你好。求教一下:序列的一阶差分服从I(1),我开始只对原序列(经过季节调整和取对数)进行协整,检验发现没有协整关系。后来把原序列进行一阶差分(数据出现负数,第一个样本点为NA),进行协整检验之后出现两个协整关系。但是只有两个时间序列的。请指导哪里出现错误。
无限扩大经管职场人脉圈!每天抽选10位免费名额,现在就扫& 论坛VIP& 贵宾会员& 可免费加入
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
如有投资本站或合作意向,请联系(010-);
邮箱:service@pinggu.org
投诉或不良信息处理:(010-)
京ICP证090565号
论坛法律顾问:王进律师苹果/安卓/wp
积分 485, 距离下一级还需 315 积分
权限: 自定义头衔, 签名中使用图片
道具: 彩虹炫, 涂鸦板, 雷达卡, 热点灯, 金钱卡, 显身卡, 匿名卡, 抢沙发下一级可获得
权限: 隐身
购买后可立即获得
权限: 隐身
道具: 金钱卡, 彩虹炫, 雷达卡, 热点灯, 涂鸦板
苦逼签到天数: 1 天连续签到: 1 天[LV.1]初来乍到
本帖最后由 wanghaidong918 于
03:27 编辑
求高手,我是新手。。。多谢多谢
载入中......
Quick/generate series
Dy=D(y,1)
或Dy=y-y(-1)
本帖被以下文库推荐
& |主题: 8540, 订阅: 48
Quick/generate series
Dy=D(y,1)
或Dy=y-y(-1)
热心帮助其他会员
推荐答案!
总评分:&经验 + 10&
论坛币 + 15&
学术水平 + 1&
谢谢啊 我去试试
第一数据是会变成NA吧。。差分的数据意义在于什么啊
白月 发表于
第一数据是会变成NA吧。。差分的数据意义在于什么啊对的,差分会损失部分数据.
差分有时候是为了将不平稳的数据变得平稳.有时先取对数,再差分,得到对数收益率.看你需要做什么而定.
我可不可以这样理解,如果不取对数的话,直接差分不具什么经济意义?
Eviews7里面做数据的差分相当省事儿,你直接在数据表格中选择 Differenced 的就可以了(其默认的是Default)
genr dy=d(y)或直接在数据表格中选择 Differenced 的就可以了
非常好!!!
无限扩大经管职场人脉圈!每天抽选10位免费名额,现在就扫& 论坛VIP& 贵宾会员& 可免费加入
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
&nbsp&nbsp|
如有投资本站或合作意向,请联系(010-);
邮箱:service@pinggu.org
投诉或不良信息处理:(010-)
京ICP证090565号
论坛法律顾问:王进律师

我要回帖

更多关于 等差序列 的文章

 

随机推荐