2017-09-03 28 views
5

대략 2250 만 건의 데이터 세트에 대해 롤링 가치가있는 값을 예측하고자하므로 빠른 계산을 위해 sparklyr을 사용하고 싶습니다. 여기에 내가 (샘플 데이터베이스를 사용) 한 일이다 sparklyr을 사용하는 대용량 데이터의 경우 rollapply

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

는 지금은 dplyr 및 PerformanceAnalytics 패키지를 사용하여 VaR의 추정 :

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

이 잘 작동합니다. 지금이 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 

을하지만 이것은 다음과 같은 오류 제공 :

Error: Unknown input type: pairlist 

사람이 어디에 오류가 올바른 코드가 무엇을 말해 주실 수 있습니까? 또는 롤링 VaR을 더 빨리 예측할 수있는 다른 솔루션도 좋습니다.

+0

'data $ date = row.names (data)'는'date'가 아닌'character'의 벡터를 제공한다는 것을 알고 있습니까? 'data $ date <- as.Date (row.names (data))'를하면 어떻게됩니까? – C8H10N4O2

답변

3

sparklyr 같은 사용자 정의 dplyr 사용자 정의의 경우 mutate은 현재 다른 패키지에 정의 된 임의의 R 함수를 지원하지 않습니다. 따라서 현재 rollapply()은 지원되지 않습니다.

sparklyr에서 위험에 처한 가치를 계산하려면 한 가지 접근법이 extend sparklyr using Scala and R이며 다음과 유사한 접근 방식을 따르십시오. Estimating Financial Risk with Apache Spark.

0

나이 개 작업으로 질문을 깰 보자 sparklyr 인터페이스

  • 수행하는 방법 롤링 자체 조인 (즉, a.manager_id = b.manager_id and a.date < b.date and b.date <= a.date + 10) 사용자 정의 함수를 사용하는 방법을
  • (즉, VaR)와 sparklyr 인터페이스

01은 제한된 세트를 지원 dplyr 동사 가능 될 수있는 첫 번째 과제. 아마도 일반적인 예일 뿐인 (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))의 행을 따라 정말 추악한 무언가로 끝날 것입니다. (불행히도 조건은, 예를 들어, 날짜 창을 조인 unsupporteddplyr 여전히 -이 질문은 자주 올 것 같다 예를 들어 this one.)

그냥 직접 점화 SQL에서 첫 번째 작업을 작성하기가 훨씬 더 쉬울 것 (조건에 self-join)은 DBI::dbGetQuery()으로 싸여 있습니다.

두 번째 작업은 dplyr 또는 직접 SQL을 사용하여 간단하게 수행 할 수없는 통계 하나이며, sparklyr 지원되지 않습니다 라이브러리 의존성을 가지고, 그래서 당신은 스칼라 (파이썬) user-defined function를 (사용해야 UDF)를 사용하여 VaR을 계산합니다 (예 : 다른 응답에).

TL; DR 첫 번째 작업은 sparklyr (그러나 SQL을 사용하지 dplyr)를 통해 행할 수있다. 두 번째 작업을 수행하려면 외부 UDF가 필요하며 invoke()sparklyr입니다.