基于python的时间序列案例-python关于时间序列的分析
1, pandas⽣成时间⼀般采⽤date_range操作,这个之前的博客已经详细的讲解过,这⾥就不在阐述
2, pandas的数据重采样
什么是数据重采样?
就好⽐原来⼀堆统计数据是按照天来进⾏统计的,持续⼀年;
那我们能不能看⽉整体变化的程度呢?
那这个时候就涉及到数据的重采样问题,按照上述的例⼦:由天变为⽉,那这个就是⼀个降采样的过程,那既然有降采样,那必定也有升采样。
那如何使⽤pandas完成将采样和升采样呢?
rng = pd.date_range('1/1/2011',periods=90, freq='D')
ts= pd.Series(np.random.randn(len(rng)), index=rng)
ts.head()#降采样
#升采样
#ffill 空值取前⾯的值#bfill 空值取后⾯的值#interpolate 线性取值
3,pandas的滑动窗⼝
看⼀张图:假如我的时间数据是2016年到2017年的,我想看其中2⽉5⽇的情况
假如我只看2⽉5⽇的值就未免太过绝对,因此,我们取2⽉5⽇附近的均值,那这样就显得更加科学⼀点
滑动窗⼝的意思就是取滑动的步长,由确定点的右侧⼀个步长到,点左侧的⼀个步长,求均值,这样统计出来的数据就会更加规范,那pandas怎么⽤滑动窗⼝呢?
df = pd.Series(np.random.randn(600), index=pd.date_range('7/1/2016', freq='D', periods=600))
df.head()
r= df.rolling(window=10) #可以设置center等,默认滑动是从左往右的
可以取得均值python单例模式
importmatplotlib.pyplot as plt
plt.figure(figsize=(15,5))
df.plot(style='r--')
图如下:是不是变得平滑许多?
5,ARIMA模型
平稳性的要求序列的均值和⽅差不发⽣明显变化
如何处理让数据变得更加平稳呢?
何为差分法呢?
差分法就是⽤t2-t1, t3-t2依次类推得到的差值进⾏统计所的出的图像
那pandas怎么去实现差分法呢?
data = pd.read_csv('x.csv')
data['diff_01] = data['values_colunm'].diff(1) # 相差⼀个时间间隔的点
但是这⾥有个注意点:⼆阶差分是在⼀阶差分的基础上进⾏⼀阶差分,才是⼆阶差分,不是在原始数据上直接diff(2)
⾃回归模型:
①描述当前值和历史值之间的关系,⽤变量的⾃⾝的历史数据对⾃⾝进⾏预测
②⾃回归模型必须满⾜平稳性的要求
③p阶⾃回归过程的公式定义:
⾃回归模型的限制:
1,⾃回归模型是⽤⾃⾝的数据进⾏预测
2,必须具有平稳性
3,必须具有⾃相关性,如果⾃相关系数(
⼩于0.5,则不宜采⽤
4,⾃回归只适⽤于预测和⾃⾝前期相关的现象
移动平均模型:
1,移动平均模型关注的是⾃回归模型中的误差项的累加
2,q阶⾃回归过程的公式定义:
3,移动平均法能够有效的消除预测中的随机波动
⾃回归移动平均模型(ARMA)
1,⾃回归与移动平均的结合
2,公式的定义:
(p是⾃回归模型的阶数,q是移动平均模型的阶数,d是查分的阶数(⼀般使⽤⼀阶差分即d=1))
ARIMA(p,d,q)模型全称为差分⾃回归移动平均模型
AR是⾃回归,p为⾃回归项;MA为移动平均,q为移动平均数,d为时间序列成为平稳时所作的差分次数
原理:将⾮平稳时间序列转化为平稳时间序列然后将因变量仅对它的滞后值以及随机误差项的现值和滞后值进⾏回归所建⽴的模型⾃相关函数ACF(帮助我们选择p值和q值得合适值)
1,有序的随机变量序列与其⾃⾝相⽐较,⾃相关函数反应了同⼀序列在不同时序取值之间的相关性
2,公式:
3,Pk的取值范围为[-1,1](相关性)
那ARIMA建模的流程:
①将序列平稳
②p和q阶数确定:ACF和PACF
③ARIMA(pdq)
#arima时序模型
importpandas as pd#参数初始化
discfile = 'data.xls'forecastnum= 5
#读取数据,指定⽇期列为指标,Pandas⾃动将"⽇期”列识别为Datetime格式
data = pd.read_excel(discfile, index_col = u'⽇期')#时序图
importmatplotlib.pyplot as plt
data.plot()
plt.show()#⾃相关图
aphics.tsaplots importplot_acf
plot_acf(data).show()#平稳性检测
from statsmodels.tsa.stattools importadfuller as ADFprint(u'原始序列的ADF检验结果为:', ADF(data[u'销量']))#返回值依次为adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore
#差分后的结果
D_data =data.diff().dropna()
lumns= [u'销量差分']
D_data.plot()#时序图
plt.show()
plot_acf(D_data).show()#⾃相关图
aphics.tsaplots importplot_pacf
plot_pacf(D_data).show()#偏⾃相关图
print(u'差分序列的ADF检验结果为:', ADF(D_data[u'销量差分'])) #平稳性检测
#⽩噪声检验
from statsmodels.stats.diagnostic importacorr_ljungboxprint(u'差分序列的⽩噪声检验结果为:', acorr_ljungbox(D_data,
lags=1)) #返回统计量和p值
from statsmodels.tsa.arima_model importARIMA
data[u'销量'] = data[u'销量'].astype(float)#定阶
pmax = int(len(D_data)/10) #⼀般阶数不超过length/10
qmax = int(len(D_data)/10) #⼀般阶数不超过length/10
bic_matrix = [] #bic矩阵
for p in range(pmax+1):
tmp=[]for q in range(qmax+1):try: #存在部分报错,所以⽤try来跳过报错。
tmp.append(ARIMA(data, (p,1,q)).fit().bic)except:
tmp.append(None)
bic_matrix.append(tmp)#从中可以出最⼩值
bic_matrix =pd.DataFrame(bic_matrix)#先⽤stack展平,然后⽤idxmin出最⼩值位置。
p,q =bic_matrix.stack().idxmin()print(u'BIC最⼩的p值和q值为:%s、%s' %(p,q))#建⽴ARIMA(0, 1, 1)模型
model = ARIMA(data, (p,1,q)).fit()#给出⼀份模型报告
print(model.summary2())#作为期5天的预测,返回预测结果、标准误差、置信区间。
print(model.forecast(5))#结果如下: