2017-09-03 22 views
5

Tôi muốn ước tính giá trị lăn có nguy cơ cho tập dữ liệu khoảng 22,5 triệu quan sát, do đó tôi muốn sử dụng sparklyr để tính toán nhanh. Đây là những gì tôi đã làm (sử dụng một cơ sở dữ liệu mẫu):rollapply cho dữ liệu lớn bằng cách sử dụng 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')) 

Bây giờ tôi ước tính VaR sử dụng dplyr và PerformanceAnalytics gói:

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

này hoạt động tốt. Bây giờ tôi làm điều này để tận dụng 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 

Nhưng điều này mang đến cho các lỗi sau:

Error: Unknown input type: pairlist 

bất cứ ai có thể vui lòng cho tôi biết đâu là lỗi và mã chính xác là bao nhiêu? Hoặc bất kỳ giải pháp khác để ước tính VaR cán nhanh hơn cũng được đánh giá cao.

+0

bạn nhận ra rằng 'dữ liệu $ date = row.names (dữ liệu)' cung cấp cho bạn một vectơ của 'ký tự', không phải là' Ngày'? Điều gì xảy ra nếu bạn làm 'data $ date <- as.Date (row.names (data))' – C8H10N4O2

Trả lời

3

Đối với tùy chỉnh dplyr các chương trình phụ trợ như sparklyr, mutate hiện không hỗ trợ các chức năng R tùy ý được xác định trong các gói khác; do đó, rollapply() hiện không được hỗ trợ.

Để tính giá trị có nguy cơ trong sparklyr, một cách tiếp cận là extend sparklyr using Scala and R và thực hiện theo một cách tiếp cận tương tự như: Estimating Financial Risk with Apache Spark.

0

Hãy để tôi phá vỡ câu hỏi của bạn thành hai nhiệm vụ:

  • làm thế nào để làm một cuốn tự tham gia (ví dụ, a.manager_id = b.manager_id and a.date < b.date and b.date <= a.date + 10) với giao diện sparklyr
  • làm thế nào để sử dụng một chức năng tùy chỉnh (ví dụ, VaR) với sparklyr giao diện

nhiệm vụ đầu tiên thể thể với dplyr động từ, có hỗ trợ một tập hạn chế của Window functions, including lead() and lag(). Bạn có lẽ sẽ kết thúc với một cái gì đó thực sự xấu xí, dọc theo dòng (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)) - chỉ là một ví dụ chung chung. (Thật không may có điều kiện tham gia, ví dụ, cửa sổ ngày, vẫn còn unsupported trong dplyr - câu hỏi này dường như đưa ra thường xuyên, ví dụ this one.)

Nó sẽ dễ dàng hơn nhiều chỉ để viết các nhiệm vụ đầu tiên trong SQL Spark trực tiếp (với điều kiện tự tham gia mô tả ở trên) được gói với DBI::dbGetQuery(). Nhiệm vụ thứ hai là một thống kê không thể thực hiện đơn giản chỉ bằng cách sử dụng dplyr hoặc SQL trực tiếp và có phụ thuộc thư viện sparklyr sẽ không hỗ trợ, vì vậy bạn cần sử dụng Scala (hoặc Python) user-defined function (UDF) để tính toán VaR, chẳng hạn như số trong câu trả lời khác.

tl; dr Nhiệm vụ đầu tiên có thể thực hiện qua sparklyr (nhưng sử dụng SQL, không phải dplyr). Nhiệm vụ thứ hai yêu cầu một UDF bên ngoài mà sau đó bạn có thể invoke() qua sparklyr.

Các vấn đề liên quan