2017-04-05 27 views
3

真正的日期我有一个CSV与价值观一样预测,使用R dataframes,动物园和结果

ref_date;wings;airfoil;turbines 
2015-03-31;123,22;22,77;99,0 
2015-04-30;123,22;28,77;99,0 
2015-05-31;123,22;22,177;02,0 
2015-06-30;56,288;22,77;99,0 

,我读入数据帧,并将其转换为一个时间序列,与

df_agg = aggregate(df$wings, by=list(date=df$ref_date), FUN=mean) 
df_agg['date'] = as.Date(df_agg[['date']], format='%Y-%m-%d') 
tt = xts(df_agg[,c('x')], order.by=df_agg$date) 

所以现在我有ttxts对象。要使用forecast包,我必须把它转换为ts对象,所以我用zoo

pred = forecast(zoo(tt)) 

df_pred = as.data.frame(pred) 

但是,为了能够得到的结果与列的日期,而不是数字序列,我必须把它转换回来

zoo(df_pred, as.Date(as.numeric(rownames(df_pred)))) 

,现在我有一个像

   Forecast Lo 80 Hi 80 Lo 95 Hi 95 
2015-07-30 12   10  15  11  14 
2015-08-31 13.4  11  15.4 11.2  13 

结果有没有办法来完成相同的,而不必再次在数据框,xts,动物园,ts和动物园之间来回移动?

在Python,这将是像

from statsmodels.api import sm 
df = pd.read_csv(file_csv) 
df.index = pd.to_datetime(df.date, format='%Y-%m-%d') 
y_pred = sm.ARIMA(df) 
+0

为什么Python大熊猫标记在这里? R有一个内置的[ARIMA方法](https://stat.ethz.ch/R-manual/R-devel/library/stats/html/arima.html)。 – Parfait

+0

Python被标记为因为许多使用Python的数据科学家可以与R一起工作,并且Python示例可以帮助理解我试图用问题实现的内容。 – Ivan

回答

4

1)动物园预测软件包的开发版具有as.ts.forecast和动物园的开发版本(成为动物园版本1.8.0)具有增强as.zoo.ts,默认情况下ts系列的yearmon/yearqtr适用于频率为4和12的ts系列。这些可以使问题代码写得更加紧凑。由于预测软件包对非ts时间序列没有明确的支持,所以为预测定义了一个简单的单行动物园方法。然后使用read.zoo读取数据。为了保持这种独立性,我们使用text=Lines中的数据,但实际上它会被替换为myfile.dat之类的东西。 read.zoo命令还将yearmon类应用于索引并使用均值对其进行聚合。最后运行forecast,然后将输出转换为动物园类。这整个序列只涉及一次转换,唯一需要的原因是预测仅支持ts。

library(forecast) 
library(zoo) 

as.zoo.forecast <- function(x, ...) as.zoo(as.ts(x)) 

z <- read.zoo(text = Lines, header = TRUE, sep = ";", dec = ",", 
    FUN = as.yearmon, aggregate = mean) 
f <- forecast(z$wings) 
as.zoo(f) 

在这些新的软件包版本发布之前,您可以在上述之前运行下面的代码。新的预测和动物园包发布后,上面的代码就足够了。

# taken from development verison of forecast package 
as.ts.forecast <- function(x, ...){ 
    df <- ts(as.matrix(forecast:::as.data.frame.forecast(x))) 
    tsp(df) <- tsp(x$mean) 
    return(df) 
} 

# can use this until devel version of zoo released 
as.zoo.ts <- function(x, ...) { 
    z <- zoo:::as.zoo.ts(x) 
    if (frequency(z) == 4) time(z) <- as.yearqtr(time(z)) 
    if (frequency(z) == 12) time(z) <- as.yearmon(time(z)) 
    z 
} 

2)TS另一种可能性是使用"ts"类只利用动物园中读取数据。使用上述zas.ts.forecast(正如所提到的,可以一次的devel的版本省略预测PKG成为当前):

tt <- as.ts(z) 
f <- forecast(tt[, "wings"]) 
as.ts(f) 

注:上面我们用这个输入:

Lines <- "ref_date;wings;airfoil;turbines 
2015-03-31;123,22;22,77;99,0 
2015-04-30;123,22;28,77;99,0 
2015-05-31;123,22;22,177;02,0 
2015-06-30;56,288;22,77;99,0" 
+0

有没有一种方法可以在'pandas'意义上设置任何对象的索引,以便在整个计算过程中保留它? – Ivan

+0

如果您使用“预测”,则不是直接。您始终可以编写包装函数来隐藏转换。 –

+0

除了'预测'之外,还有更好的选择来自动选择ARIMA吗? – Ivan