سؤال

ما هي أفضل (أسرع) طريقة لتنفيذ وظيفة النافذة المنزلقة باستخدام حزمة data.table؟

أحاول حساب متوسط ​​متدرج ولكن لدي صفوف متعددة لكل تاريخ (بسبب عاملين إضافيين)، وهو ما أعتقد أنه يعني أن وظيفة تطبيق حديقة الحيوان لن تعمل.فيما يلي مثال باستخدام حلقة for الساذجة:

library(data.table)
df <- data.frame(
  id=30000,
  date=rep(as.IDate(as.IDate("2012-01-01")+0:29, origin="1970-01-01"), each=1000),
  factor1=rep(1:5, each=200),
  factor2=1:5,
  value=rnorm(30, 100, 10)
)

dt = data.table(df)
setkeyv(dt, c("date", "factor1", "factor2"))

get_window <- function(date, factor1, factor2) {
  criteria <- data.table(
    date=as.IDate((date - 7):(date - 1), origin="1970-01-01"),
    factor1=as.integer(factor1),
    factor2=as.integer(factor2)
  )
  return(dt[criteria][, value])
}

output <- data.table(unique(dt[, list(date, factor1, factor2)]))[, window_median:=as.numeric(NA)]

for(i in nrow(output):1) {
  print(i)
  output[i, window_median:=median(get_window(date, factor1, factor2))]
}
هل كانت مفيدة؟

المحلول

data.table ليس لديها أي ميزات خاصة للنوافذ المتداول، حاليا.مزيد من التفاصيل هنا في إجابتي على سؤال مماثل آخر هنا:

هل يوجد سريع طريقة لتشغيل الانحدار المتداول داخل data.table؟

الوسيط المتداول مثير للاهتمام.قد تحتاج إلى وظيفة متخصصة للقيام بها بكفاءة (نفس الرابط كما في التعليق السابق):

المتداول خوارزمية المتوسطة في C

ال data.table الحلول في السؤال والأجوبة هنا كلها غير فعالة للغاية، مقارنة بالمتخصص المناسب rollingmedian وظيفة (غير متوفرة لـ R afaik).

نصائح أخرى

تمكنت من الحصول على المثال وصولا إلى 1.4s عن طريق إنشاء مجموعة بيانات متخلفة وانضمام ضخم. giveacodicetagpre.

يعمل بشكل جيد على مجموعة بيانات الاختبار هذه ولكن على حقيقة حقيقية فاشلة مع 8GB من ذاكرة الوصول العشوائي.سأحاول نقل ما يصل إلى واحدة من مثيل EC2 الذاكرة العالية (مع 17 أو 34 أو 68 جيجابايت) للحصول عليه.أي أفكار حول كيفية القيام بذلك بطريقة أقل كثافة الذاكرة ستكون موضع تقدير

يعمل هذا الحل ولكن يستغرق بعض الوقت. giveacodicetagpre.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top