2016-11-25 63 views
0

NA處理我有格式的時間序列數據時間序列數據彙總和,使用R

     Ask Bid Trade Ask_Size Bid_Size Trade_Size 
2016-11-01 01:00:03  NA 938.10  NA  NA  203   NA 
2016-11-01 01:00:04  NA 937.20  NA  NA  100   NA 
2016-11-01 01:00:04 938.00  NA  NA  28  NA   NA 
2016-11-01 01:00:04  NA 938.10  NA  NA  203   NA 
2016-11-01 01:00:04 939.00  NA  NA  11  NA   NA 
2016-11-01 01:00:05  NA 938.15  NA  NA  19   NA 
2016-11-01 01:00:06  NA 937.20  NA  NA  100   NA 
2016-11-01 01:00:06 938.00  NA  NA  28  NA   NA 
2016-11-01 01:00:06  NA  NA 938.10  NA  NA   69 
2016-11-01 01:00:06  NA  NA 938.10  NA  NA  831 
2016-11-01 01:00:06  NA 938.10  NA  NA  134   NA 

的時間序列數據的結構

str(df_ts) 

An ‘xts’ object on 2016-11-01 01:00:03/2016-11-02 12:59:37 containing: 
    Data: num [1:35797, 1:6] NA NA 938 NA 939 NA NA 938 NA NA ... 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr [1:6] "Ask" "Bid" "Trade" "Ask_Size" ... 
    Indexed by objects of class: [POSIXct,POSIXt] TZ: 
    xts Attributes: 
NULL 

我試圖彙總數據每1分鐘使用下面的代碼

# Creating a Function 
apply.periodly <- function (x, FUN, period, k = 1, ...) 
{ 
    if (!require("xts")) { 
    stop("Need 'xts'") 
    } 
    ep <- endpoints(x, on = period, k=k) 
    period.apply(x, ep, FUN, ...) 
} 

# Aggregation every minute 

df_aggregate_min <- apply.periodly(x = df_ts, FUN = mean, period = "minutes", k = 1) 

但由於數據「NA」錯誤輸出。 如何通過忽略NA來每隔一分鐘彙總一次列?

+0

定製意味着功能('naMean < - 函數(X){均值(X,na.rm = TRUE)}')在最後一行應該做的伎倆 – TBSRounder

+0

謝謝,但所產生的輸出是意味着整個專欄,我希望每分鐘都能得到專欄的總和。我使用的代碼是df_aggregate_min < - apply.periodly(x = df_ts,FUN = naMean,period =「minutes」,k = 1) – Abhishek

回答

0

這是兩個單列:

library(readr) 
library(xts) 
library(lubridate) 
Sys.setenv(TZ = "UTC") 
# hack: in-place edit of infile Sample_HFT.csv 
# replace first comma with "T" to create ISO-datetime strings 
# do this only ONCE! 
system('perl -pi -E "s/,/T/" Sample_HFT.csv') 

hft <- read_csv("Sample_HFT.csv", col_names = TRUE) 
head(hft) 

hft.xts <- as.xts(hft[, -1], order.by = ymd_hms(hft$T)) 
indexFormat(hft.xts) <- "%y-%m-%d %H:%M:%S" 

my.cummean <- function(x) { 
    x2 <- x 
    cummeans <- cumsum(x2[!is.na(x)])/seq_along(x2[!is.na(x)]) 
    cummeans[endpoints(cummeans, "minutes"),] 
} 

ask_minutes <- split(hft.xts$Ask, f = "minutes") 
ask_minutes_cum <- lapply(ask_minutes, my.cummean) 
ask_minutes_mean <- do.call("rbind", ask_minutes_cum) 

trade_size_minutes <- split(hft.xts$Trade_Size, f = "minutes") 
trade_size_minutes_cum <- lapply(trade_size_minutes, my.cummean) 
trade_size_minutes_mean <- do.call("rbind", trade_size_minutes_cum) 

我仍然不知道這是否是預期的商業邏輯,但我認爲你可以計算的細節了。

head(trade_size_minutes_mean) 
        Trade_Size 
16-11-01 01:00:35 194.500 
16-11-01 01:01:59  59.909 
16-11-01 01:02:48  5.875 
16-11-01 01:03:34  6.000 
16-11-01 01:08:57  3.889 
16-11-01 01:09:29  1.682 
+0

請幫忙。上述方法不起作用。共享數據示例的鏈接https://www.dropbox.com/s/m94y6pbhjlkny1l/Sample_HFT.csv?dl=0 – Abhishek

+0

我已更新我的答案。你可以把問題主體中的示例文件鏈接?讀者可能更願意在R代碼中提供解決方案。 – knb