R简单的使用使用霍尔特指数平滑法预测数据

浏览: 2599

1、连接oracle数据库,提取所需数据

library(DBI)
library(ROracle)
library(forecast)
drv=dbDriver('Oracle')
conn=dbConnect(drv,'trff_app','trff_admin','192.111.11.00:1521/jgyw')
rs=dbSendQuery(conn,'select  WFS,GLBM,WFYF from vio_violation_glbmyc where wfyf>to_number(extract(year from sysdate)-2||12)')
data=fetch(rs)

2、第一次用R生成数据表值下一年月的笨方法

#next yf begin
nextyf_n=dbSendQuery(conn,'select extract(year from sysdate) nexty_n from dual ')
nextyf_y=dbSendQuery(conn,'select extract(month from sysdate) nexty_y from dual ')
nextyf_n=fetch(nextyf_n)
nextyf_y=fetch(nextyf_y)
nextyf_n=nextyf_n$NEXTY_N
nextyf_y=nextyf_y$NEXTY_Y
if(nextyf_y<11)
  nextyf_y=paste(0,nextyf_y,sep = "")
if(nextyf_y==12)
{nextyf_y=paste(0,1,sep = "")
nextyf_n=nextyf_n+1
}
nextyf=paste(nextyf_n,nextyf_y,sep ='' )
#end

简单的方法

dbSendQuery直接用sql语句生成,但是注意select语句要用双引号

3、数据准备,next

rsjkdbh=dbSendQuery(conn,'select distinct GLBM from vio_violation_glbmyc where wfyf>to_number(extract(year from sysdate)-2||12)')
datajkdbh=fetch(rsjkdbh)
#datajkdbh=as.matrix(datajkdbh)
#datajkdbh=datajkdbh[order(datajkdbh[,1]),]
jkdlength=nrow(datajkdbh)
rswfyf=dbSendQuery(conn,'select distinct wfyf from vio_violation_glbmyc where wfyf>to_number(extract(year from sysdate)-2||12)')
datawfyf=fetch(rswfyf)
datawfyf=as.matrix(datawfyf)
datawfyf=as.numeric(datawfyf[order(datawfyf[,1]),])
datawfyf=t(t(datawfyf))
yfrqlength=nrow(datawfyf)
datarow=0
datajkdtemp=0
datanextv=0
i=0

4、使用HoltWinters法进行数据预测,如果历史数据较少则走else

for (i in 1:jkdlength)
{
  #i=28
  datarow=data[data[,2]==datajkdbh[i,],]
  if(nrow(datarow)>2)
  {
    datajkdtemp=datajkdbh[i,]
    datarow=datarow[sort(datarow$WFYF,index.return=TRUE)$ix,]
    seqvalue=as.numeric(as.matrix(datarow$WFS))
    #skirtsseries<-log(seqvalue)+1
    skirtsseries<-ts(seqvalue,start=c(1))
    
    #skirtsseriesforecasts<-HoltWinters(skirtsseries,gamma=FALSE)
    skirtsseriesforecasts<-HoltWinters(skirtsseries,beta=FALSE,gamma=FALSE)
    skirtsseriesforecasts2<-forecast.HoltWinters(skirtsseriesforecasts,h=1)
    nextv=skirtsseriesforecasts2$mean[1]
    #nextv=round(exp(nextv-1))
    nextv=round(nextv)
    if(nextv<0)
      nextv=round(mean(seqvalue))
    retur=c(nextv,datajkdtemp,nextyf)
    retur=t(retur)
    retur=as.data.frame(retur)
    colnames(retur)=c('WFS','GLBM','WFYF')
    
    dbWriteTable(conn,'VIO_VIOLATION_GLBMYC',retur, row.names = F, append = TRUE)
  }
  else
  {
    datajkdtemp=datajkdbh[i,]
    datarow=datarow[sort(datarow$WFYF,index.return=TRUE)$ix,]
    seqvalue=as.numeric(as.matrix(datarow$WFS))
    
    nextv=round(mean(seqvalue))
    retur=c(nextv,datajkdtemp,nextyf)
    retur=t(retur)
    retur=as.data.frame(retur)
    colnames(retur)=c('WFS','GLBM','WFYF')
    
    dbWriteTable(conn,'VIO_VIOLATION_GLBMYC',retur, row.names = F, append = TRUE)
  }
  
  #dbWriteTable(conn,'zz_vio_veh_viorec_init',retur,overwrite=TRUE)
  
}

5、over(不喜勿碰)

推荐 1
本文由 华青莲 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

2 个评论

结果说明,在最前面说一下就更好理解了。
ok~/-\~

要回复文章请先登录注册