R: сравнение каждой строки с предыдущей и ведение счета
У меня есть data.frame, который выглядит так:
> head(df,10)
DateTime BP1 BQ1 BP2 BQ2 BP3 BQ3 BP4 BQ4 BP5 BQ5
1 2015-09-16 09:15:01 70730 1 0 0 0 0 0 0 0 0
2 2015-09-16 09:15:01 70735 1 70730 1 70285 1 70185 1 0 0
3 2015-09-16 09:15:01 70905 1 70735 3 70730 1 0 0 0 0
4 2015-09-16 09:15:01 70910 1 70905 1 70735 2 70730 1 0 0
5 2015-09-16 09:15:03 70905 1 70900 1 70730 1 70230 1 70220 1
6 2015-09-16 09:15:06 70910 1 70905 2 70900 1 70795 1 70730 1
7 2015-09-16 09:15:06 70905 2 70900 1 70795 1 70730 1 70220 1
8 2015-09-16 09:15:06 70910 1 70905 2 70900 1 70795 1 70730 1
9 2015-09-16 09:15:07 70915 1 70910 1 70905 1 70900 1 70795 1
10 2015-09-16 09:15:07 71000 1 70915 1 70905 1 70785 1 70730 1
BP = BidPrice и BQ = BidQty
Моя цель состоит в том, чтобы сравнить каждую строку с предыдущей и посмотреть, есть ли какие-либо изменения / добавления / отмены и на основании этого дать ей оценку и добавить их.
Например, вы можете увидеть df[1,2] = df[2,4], чтобы получить счет -1, поскольку цена опустилась на 1 уровень.
Тогда df[4,4] = df[5,2], так что это будет означать +1, поскольку цена поднялась на один уровень вверх.
И так далее... Сделайте это для каждого ряда, а затем суммируйте баллы для этого ряда. Таким образом, выходные данные должны быть вектором или data.frame с положительными и отрицательными целыми числами.
То, что у меня есть, очень мало, и я уже несколько часов ломаю голову над этим и ничего не получил. Я думаю, что я закончил с бесконечным циклом: мой код следующий:
mod<- function(file, level = 5){
whole_data<- read.csv(file = file,header = FALSE,sep = "", col.names = c("DateTime","Seq","BP1","BQ1","BO1","AP1","AQ1","AO1","BP2","BQ2","BO2","AP2","AQ2","AO2","BP3","BQ3","BO3","AP3","AQ3","AO3","BP4","BQ4","BO4","AP4","AQ4","AO4","BP5","BQ5","BO5","AP5","AQ5","AO5","BP6","BQ6","BO6","AP6","AQ6","AO6","BP7","BQ7","BO7","AP7","AQ7","AO7","BP8","BQ8","BO8","AP8","AQ8","AO8","BP9","BQ9","BO9","AP9","AQ9","AO9","BP10","BQ10","BO10","AP10","AQ10","AO10"), colClasses = c(NA, rep("integer",31), rep("NULL", 30)))
whole_data<- whole_data[which(whole_data$DateTime != 0),]
whole_data$DateTime= as.POSIXct(whole_data$DateTime/(10^9), origin="1970-01-01") #timestamp conversion
df<- data.frame(DateTime= whole_data$DateTime, BP1 = whole_data$BP1, BQ1=whole_data$BQ1, BP2 = whole_data$BP2, BQ2=whole_data$BQ2, BP3 = whole_data$BP3, BQ3=whole_data$BQ3, BP4 = whole_data$BP4, BQ4=whole_data$BQ4, BP5 = whole_data$BP5, BQ5=whole_data$BQ5)
v<- NULL
for(i in 1:nrow(df)){
for(j in seq_along(c(2,4,6,8,10)))
if(level == 5){
x <- df[i+1,j]==df[i,c(2,4,6,8,10)]
y<- which(x==TRUE)
v[i]<- c(v,(y-(j-(j-1))*-1))
i=i+1
}
v
}
}
Для тех, кто имеет опыт работы с финансами, я пытаюсь проанализировать электронную книгу заказов, фиксируя изменения, отмены и новые заказы. Это только первый шаг из многих, гораздо больше, чем я пытаюсь сделать, но любые указатели / комментарии / помощь, я уверен, будут иметь большое значение и будут высоко оценены.
Какой самый быстрый способ это сделать? Для петли? Я действительно потерялся относительно того, как я должен идти об этом!! Все, что укажет мне правильное направление, будет высоко оценено.
Пожалуйста, дайте мне знать, если требуется какая-либо другая информация.