2017-04-05 86 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