Ускорьте l oop итеративного вычисления значений в зависимости от предыдущей строки и исключая строки, не отвечающие критериям в R - PullRequest
1 голос
/ 09 апреля 2020

Я довольно новичок в R и в настоящее время у меня возникают проблемы с выполнением al oop в R. Насколько мне известно, медленные циклы в R связаны с «плохим программированием». Это, скорее всего, также и здесь (хотя я пытался сделать все возможное).

Я столкнулся с несколькими предложениями, такими как векторизация кадров данных, о том, как сделать циклы более эффективными. Поскольку мои расчеты для заданной строки котировки ставки зависят от ранее подтвержденной котировки ставки (где текущая цитата, в свою очередь, проверяется на основе расчетов), я не мог понять, как сделать возможной векторизацию.

Мои данные состоят из нерегулярно распределенных во времени заявок и предложений. Перед дальнейшей обработкой данных мне нужно отфильтровать тики по аномалиям и выбросам, используя «фильтр выбросов», как это предложено Dacorogna, MM, Müller, UA, Nagler, RJ, Olsen, RB, Pictet, OV (1993 ). Географическая модель для дневной и недельной сезонной волатильности на валютном рынке . (Фильтр предоставлен в их приложении). Для расчета условий мне нужны «текущая» заявка и последняя подтвержденная заявка. На основании этих условий я затем (в) проверяю текущую ставку предложения.

Мой текущий подход: при условии, что первая квота предложения df[1,] подтверждена. Затем итеративно вычисляют условия (BConditionI, BConditionII, SConditionI, SConditionII, SConditionIII) ​​и, следовательно, проверку (как зафиксировано оператором if) для предложения цены. Если «текущая» заявка не подтверждена, я исключаю соответствующую строку из фрейма данных. В противном случае я сохраняю фрейм данных без изменений. Мое обоснование заключается в том, что изначально или для i+1 предыдущая строка в обновленном фрейме данных автоматически проверялась.

i <- 2
while (i<=nrow(df)){
  #for (i in seq(2,nrow(df)) ){
  #
  *#calculates the distance to previous, validated bid quote*
  df$dBidQuoteABS_V[i]<-abs(as.numeric(df$BidQuote[i]-df$BidQuote[i-1]))
  df$BConditionI[i]<-ifelse(df$dBidQuoteABS_V[i] < 0.25,1,0)
  df$dT[i]<-as.numeric(df$DateTime[i]-df$DateTime[i-1])
  df$dT[i]<-df$dT[i]/(24*60*60)
  df$BConditionII[i]<-ifelse(df$dBidQuoteABS_V[i]<2*df$spread[i-1]+0.18*df$dT[i],1,0)
  df$SConditionI[i]<-ifelse(0.0001<df$spread[i] &df$spread[i]<0.025,1,0)
  df$SConditionII[i]<-ifelse(df$dBidQuoteABS_V[i]<1.3+45*df$dT[i],1,0)
  df$SConditionIII[i]<-ifelse(df$dBidQuoteABS_V[i]<4,1,0)
  if(df$BConditionI[i]==0 |df$BConditionII[i]==0| df$SConditionI[i]==0|df$SConditionII[i]==0|df$SConditionIII[i]==0) {
    df<-df[-i, ]
  } else{
    df<-df
  }
  rownames(df) <- seq(length=nrow(df))
  i <- i+1
} 

Однако я скептически отнесся к своему подходу. Выполнение кода занимает много (много) часов. Я также считаю, что существует существенная ошибка: если в предложении ставится цитата в строке k (где n = общее количество строк в df и k, k + 1 ..k исключается, строка k-1 будет ранее Подтверждено предложение цены для предложения цены в строке k? Я пытался принять это во внимание, заменив предыдущий for (i<=nrow(df)){.. на while (i<=nrow(df)){...} ... i<- i+1. Я не уверен, поможет ли это.

Что я буду sh создавать
Предположим теперь, что котировки ставок в строках 1 и 2 проверены, но предложение ставки в строке 3 недопустимо. Что я хочу

   DateTime Bid Quote  Ask Quote dBidQuote dT     Validated
1. T1       B1         A1        -         -        YES
2. T2       B2         A2        A2-A1     T2-T1    YES
3. T3       B3         A3        A3-A2     T3-T2     NO #I therefore 'exclude this row in the loop
4. T4       B4         A4        A4-A2     T4-T2    YES  #As the previous row is not validated, the differences will be taken wrt. the validated row 3. 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...