2016-11-25 2 views
0

ich eine Zeitreihendaten von Format habenZeitreihendatenaggregation und NA Umgang mit 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 

Die Struktur der Zeitreihendaten ist

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 

Ich versuche, die Daten zu aggregieren alle 1 Minute mit dem folgenden Code

# 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) 

Aber wegen "NA" in den Daten bekomme ich falsche Ausgabe. Wie aggregiere ich die Spalten jede Minute, indem ich die NA ignoriere?

+0

benutzerdefinierte bedeuten Funktion ('naMean <- function (x) {Mittelwert (x, na.rm = TRUE)}') in der letzten Zeile gibt den Trick – TBSRounder

+0

Dank tun sollte, aber die resultierende Ausgabe ist die Im Durchschnitt der gesamten Spalte möchte ich jede Minute die Spaltenweise Summe erhalten. Der Code, den ich verwendet habe, ist df_aggregate_min <- apply.periodly (x = df_ts, FUN = naMean, Zeitraum = "Minuten", k = 1) – Abhishek

Antwort

0

Dies ist für zwei einzelne Spalten:

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) 

Ich weiß noch nicht, ob dies die gewünschte Business-Logik ist, aber ich glaube, Sie können die Details herauszufinden.

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

Könnten Sie bitte helfen. Die obige Methode hat nicht funktioniert. Teilen Sie den Link zu den Daten Beispiel https://www.dropbox.com/s/m94y6pbhjlkny1l/Sample_HFT.csv?dl=0 – Abhishek

+0

Ich habe meine Antwort aktualisiert. Können Sie den Link zu Ihrer Beispieldatei im Fragenhauptteil einfügen? Es ist dann für Leser, die möglicherweise motiviert sind, Lösungen in R-Code bereitzustellen, sichtbarer. – knb