Python之时间序列
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
大概做了将近一周的数据分析大赛,从一开始到xgboost到这时间序列,一直解决不掉数据滞后性的问题,现在把这个ARIMA简单说一下
一、ARIMA是什么?
ARIMA(p,d,q)中,AR是"自回归",p为自回归项数;I为差分,d为使之成为平稳序列所做的差分次数(阶数);MA为"滑动平均",q为滑动平均项数,。ACF自相关系数能决定q的取值,PACF偏自相关系数能够决定q的取值。ARIMA原理:将非平稳时间序列转化为平稳时间序列然后将因变量仅对它的滞后值以及随机误差项的现值和滞后值进行回归所建立的模型
ARIMA的一些说明.
二、使用步骤
1.导入库
代码如下(示例):
from statsmodels.tsa.arima_model import ARIMA
##########################画图############################################
# 在我的 notebook 里,要设置下面两行才能显示中文
plt.rcParams['font.family'] = ['sans-serif']
# 如果是在 PyCharm 里,只要下面一行,上面的一行可以删除
plt.rcParams['font.sans-serif'] = ['SimHei']
from statsmodels.tsa.arima_model import ARIMA
这个是statsmodels里面的一个包,不同于机器学习
2.导入数据
代码如下(示例):
df = pd.read_excel(r'C:\Users\lidongming\Desktop\数据大赛数据\xgboost\时间序列.xlsx',index_col='指标名称')
df_train=df.iloc[:170,:]
df_test=df.iloc[170:,:]
data = pd.read_csv(
df_train.index = pd.to_datetime(df_train.index)
df_test.index = pd.to_datetime(df_test.index)
# 将字符串索引转换成时间索引
ts_train = df['十年期国债收益率'] # 生成pd.Series对象
这边其实我是瞎写了一个训练集和测试集,我现在也没搞懂时间序列预测集和训练集怎么个区分,是用训练集定好一个q、i、p还是训练集直接定好一个模型,用这个模型去训练完参数以后,在用这个模型去预测(机器学习那种)。
。
3.传入参数
model = ARIMA(ts,order=(1,1,2)) #导入ARIMA模型,ts是数据源
result = model.fit(disp=0)
result.conf_int()#模型诊断,可以发现所有的系数置信区间都不为0;即在5%的置信水平下,所有的系数都是显著的,即模型通过检验。
#画出时序图
#注意起点是从1901开始
plt.figure(figsize=(18,5))
fig = result.plot_predict() #这里是回归的正儿八经的
plt.show() #数据预测并画图
4.有个倒霉的东西要记住
如果有差分了,predict出来的是差分后的,要还原,以下是还原代码(我找了一天)。
pre=result.predict()
# 一阶差分还原
# ts:原数据
# df_pred:一阶差分后的预测数据
df_shift = ts.shift(1)
predict = pre.add(df_shift)
# predict = pred + df_shift
总结
还有很多要判别自相关和偏相关图像的,这里不多阐述,详情请看这个:
更新
我用了一种新的方法,解决以上训练集与预测集,就是假设100个数据,我们先划分为前80和后20,用前80定ARIMA的参数,就是qdp,然后然后用80个先预测第81个,然后保留下来这个值,然后再用第81个真实的值,然后前81个预测第82个,依次类推。
(看网上很多做法是直接forecast后10期这样,我是因为想把比赛的结果尽可能好看点,然后就想的这个方法)
代码如下:
for i in range(178,205):
df_train=df.iloc[:i,:]
# df_train = df_train['十年期国债收益率'] # 生成pd.Series对象
# df_train.index = pd.to_datetime(df_train.index)#把时间序列数据转成日期格式
# df_train
model = ARIMA(df_train ,order=(1,1,2)) #导入ARIMA模型,ts是数据源
results = model.fit(disp=0)
a=float(results.forecast()[0])
data1.iloc[i,3]=a
上面这个代码是从178开始,然后就是依次类推过去,全部代码见桌面上的‘时间序列模型’整个代码。