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(不喜勿碰)