2017-09-03 9 views
5

Je veux estimer la valeur à risque glissante pour un ensemble de données d'environ 22,5 millions d'observations, donc je veux utiliser sparklyr pour un calcul rapide. Voici ce que je faisais (en utilisant une base de données de l'échantillon):rollapply pour des données volumineuses en utilisant 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')) 

Maintenant, j'estimer la VAR dplyr et packages PerformanceAnalytics:

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

Cela fonctionne très bien. Maintenant, je le fais pour utiliser sparklyr:

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 

Mais cela donne l'erreur suivante:

Error: Unknown input type: pairlist 

Quelqu'un peut-il s'il vous plaît me dire où est l'erreur et quel est le bon code? Ou toute autre solution pour estimer la VaR roulante plus rapidement est également appréciée.

+0

vous réalisez que 'data $ date = row.names (data)' vous donne un vecteur de 'character', pas de' Date'? Que se passe-t-il si vous faites 'data $ date <- as.Date (row.names (data))' – C8H10N4O2

Répondre

3

Pour dplyr personnalisé, des services tels que sparklyr, mutate ne prennent actuellement pas en charge les fonctions R arbitraires définies dans d'autres packages; par conséquent, rollapply() est actuellement non pris en charge.

Afin de calculer la valeur à risque dans sparklyr, une approche est à extend sparklyr using Scala and R et suivre une approche similaire à: Estimating Financial Risk with Apache Spark.

0

Permettez-moi de briser votre question en deux tâches:

  • comment faire un roulement autojointure (c.-à-a.manager_id = b.manager_id and a.date < b.date and b.date <= a.date + 10) avec sparklyr Interface
  • comment utiliser une fonction personnalisée (c.-à-VaR) avec sparklyr Interface

La première tâche pourrait être possible avec les verbes dplyr, qui prennent en charge un ensemble limité de Window functions, including lead() and lag(). Vous finiriez probablement avec quelque chose de vraiment moche, sur le modèle de (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)) - juste un exemple générique. (Malheureusement rejoint sous condition, par exemple, les fenêtres de date, sont toujours unsupported dans dplyr - cette question semble venir souvent, par exemple this one.)

Il serait beaucoup plus facile juste à écrire la première tâche dans SQL Spark Direct (avec condition auto-jointure décrit ci-dessus) enveloppé avec DBI::dbGetQuery().

La deuxième tâche est d'ordre statistique qui ne peut être fait simplement en utilisant dplyr ou SQL directe, et il a une dépendance de bibliothèque qui sparklyr ne supportera pas, vous devez donc utiliser une Scala (ou Python) user-defined function (UDF) pour calculer la VaR, telle que celle dans l'autre réponse.

tl; dr tâche première est faisable via sparklyr (mais en utilisant SQL, pas dplyr). La deuxième tâche nécessite un UDF externe que vous pouvez ensuite invoke() via sparklyr.