2017-09-03 4 views
5

Ich möchte Rolling-Value-at-Risk für einen Datensatz von etwa 22,5 Millionen Beobachtungen schätzen, daher möchte ich Sparklyr für schnelle Berechnung verwenden. Hier ist, was ich getan habe (eine Beispieldatenbank verwendet wird):Rollappliz für große Daten mit Sparklyr

library(PerformanceAnalytics) 
library(reshape2) 
library(dplyr) 

data(managers) 
data <- zerofill(managers) 
data<-as.data.frame(data) 
class(data) 
data$date=row.names(data) 
lmanagers<-melt(data, id.vars=c('date')) 

Jetzt schätze ich VaR, mit dplyr und PerformanceAnalytics Pakete:

library(zoo) # for rollapply() 
var <- lmanagers %>% group_by(variable) %>% arrange(variable,date) %>% 
    mutate(var=rollapply(value, 10,FUN=function(x) VaR(x, p=.95, method="modified",align = "right"), partial=T)) 

Dies funktioniert gut. Jetzt mache ich diese Verwendung von sparklyr zu machen:

library(sparklyr) 
sc <- spark_connect(master = "local") 
lmanagers_sp <- copy_to(sc,lmanagers) 
src_tbls(sc) 

var_sp <- lmanagers_sp %>% group_by(variable) %>% arrange(variable,date) %>% 
    mutate(var=rollapply(value, 10,FUN=function(x) VaR(x, p=.95, method="modified",align = "right"), partial=T)) %>% 
    collect 

Aber das gibt den folgenden Fehler:

Error: Unknown input type: pairlist 

Kann jemand bitte sagen Sie mir, wo der Fehler ist und was der richtige Code? Oder eine andere Lösung, um rollendes VaR schneller zu schätzen, wird ebenfalls geschätzt.

+0

Sie erkennen, dass 'data $ date = row.names (data)' gibt Ihnen einen Vektor von 'Zeichen', nicht von' Date'? Was passiert, wenn Sie 'data $ date <- as.Date (row.names (data))' – C8H10N4O2

Antwort

0

Lassen Sie mich Ihre Frage in zwei Aufgaben brechen:

  • wie ein rollendes Selbstverknüpfung zu tun (dh a.manager_id = b.manager_id and a.date < b.date and b.date <= a.date + 10) mit sparklyr Schnittstelle
  • , wie eine benutzerdefinierte Funktion verwenden (dh VaR) mit sparklyr Schnittstelle

Die erste Aufgabe mit den dplyr Verben möglich sein könnte, die eine begrenzte Menge von 01 unterstützen. Sie würden wahrscheinlich mit etwas wirklich Hässlichem enden, in der Art von (lag(return,1) + lag(return,2) + lag(return,3))/(3 - is.na(lag(return,1)) - is.na(lag(return,2)) - is.na(lag(return,3)) - nur ein generisches Beispiel. (Leider bedingt beitritt, zB Datum Fenster, sind noch unsupported in dplyr - diese Frage scheint oft zu kommen, zB this one.)

Es wäre viel einfacher, nur die erste Aufgabe in Direkt Spark-SQL zu schreiben (mit bedingtem Self-Join oben beschrieben) mit DBI::dbGetQuery() gewickelt.

Die zweite Aufgabe ist ein statistisches eines, das nicht einfach getan werden kann dplyr oder direkt mit SQL, und es verfügt über eine Bibliothek Abhängigkeit dass sparklyr nicht unterstützen, so benötigen Sie eine Scala verwenden (oder Python) user-defined function (UDF), um VaR zu berechnen, wie die in der anderen Antwort.

tl; dr Erste Aufgabe ist machbar über sparklyr (aber SQL verwenden, nicht dplyr). Zweite Aufgabe erfordert eine externe UDF, die Sie dann invoke() über sparklyr können.