最近的主要工作就是做时间序列预测,使用的工具也已放弃R语言,采用python了,网上看了一篇博客,使用python实现,觉得写的很好,自己以前写的简直不能看了,这里标记一下:
https://www.howtoing.com/a-guide-to-time-series-forecasting-with-arima-in-python-3/
利用ARIMA模型进行时间序列预测,具体方式在这里不做详细介绍了,可到网上进行查询,资料甚多。从代码注释中可获取ARIMA模型拟合的方法步骤,在实际操作中预测效果良好,数据也不附带了,有时间有对应指标这类数据即可。
#加载相关R包
install.packages("tseries")
install.packages("xts")
install.packages("forecast")
library(tseries)
library(xts)
library(forecast)
data<-read.csv("F://分类别//排名算法//数据结果及验证//forecast.csv",header=T,as.is=T)#读入数据
works<-unique(data[,3])
work<-data[grep(works[4],data[,3]),]#获取指定数据
index<-xts(work[,8],as.Date(work[,11],))#将数据框转化为时间序列
plot(index)#绘制时序图,查看趋势
acf(index)#自相关图
pacf(index)#偏自相关图
#index_diff1<-diff(index,differences=1)#一阶差分
#plot(index_diff1)
#index.fit<-arima(index,order=c(1,3,0),,)#通过观察自相关图与偏自相关图的拖尾与结尾情况确定参数,拟合模型
index.fit<-auto.arima(index,trace=T)#自动获取参数,并拟合模型
index.fit#可查看模型拟合验证指标信息等
forecast<-forecast(index.fit,h=10,level=c(99.5))#设置预测期数h与置信度水平
forecast
单一作品可用上述方式进行ARIMA模型预测,对于大量作品的时序数据最好是采用auto.arima()方法处理。
####函数集中处理####
getForecast<-function(data,name_col,value_col,time_col,p,q,x,num,data_out){
works<-unique(data[,name_col])
n=length(works)
result<-data.frame()
for(i in 1:n){
work<-data[grep(works[i],data[,name_col]),]
work_out<-data_out[grep(works[i],data_out[,name_col]),]
index<-xts(work[,value_col],as.Date(work[,time_col],))
#index.fit<-try(arima(index,order=c(p,q,x),,silent=TRUE)#拟合模型
index.fit<-try(auto.arima(index,trace=T),silent=TRUE)#自动获取参数,并拟合模型
if('try-error' %in% class(index.fit)){
next
}else{
forecast<-forecast(index.fit,h=num,level=c(99.5))
temp<-forecast$mean
m<-length(temp)
foreList<-array(,m)
for(j in 1:m){
foreList[j]=temp[j]
}
fore<-data.frame()
w1=nrow(work_out)
w=1
if(length(foreList)==nrow(work_out)){
fore<-data.frame(work_out,foreList)
}else{
temps<-foreList
if(w1==0){
next
}else{
foreList<-array(,w)
for(k in 1:w){
foreList[k]=temps[k]
}
fore<-data.frame(work_out,foreList)
}
}
result<-rbind(result,fore)
}
}
return(result)
}
####函数调用
data<-read.csv("F://分类别//排名算法//数据结果及验证//forecast.csv",header=T,as.is=T)
data_out<-read.csv("F://分类别//排名算法//数据结果及验证//fore.csv",header=T,as.is=T)
result<-getForecast(data,3,10,11,,,,10,data_out)
write.csv(result,"F://分类别//排名算法//数据结果及验证//forecast_Result_tj.csv")