Ich habe einen Datensatz, der den Preis und die Marktkapitalisierung einer Aktie für einen Datumsbereich enthält. Einige Daten fehlen zwischen dem Datumsbereich. Ich möchte effizient neue Variablen erstellen, die anzeigen, wie stark sich der aktuelle Preis gegenüber dem Preis vor Tagen verändert hat (wobei x eine Liste von Zahlen ist, die Tagesunterschiede darstellen).So erstellen Sie effizient Änderungsvariablen basierend auf dynamischen Datumsdifferenzen in R mit unvollständigen Datumsspalten
Zum Beispiel, ich habe d1:
d1 <- structure(list(Date = c(as.Date("2017-10-28"), as.Date("2017-10-27"), as.Date("2017-10-26"),
as.Date("2017-10-24"), as.Date("2017-10-21"), as.Date("2017-10-20")),
Price = c(100L, 98L, 102L, 97L, 96L, 100L),
MC = c(50L, 55L, 49L, 47L, 50L, 46L)),
.Names = c("Date", "Price", "MC"))
d1<-as.data.frame(d1)
und mein Wunsch ist d2 (vorausgesetzt, ich bin an 1 und 2 Tagen Änderungen) zu erstellen:
d2 <- structure(list(Date = c(as.Date("2017-10-28"), as.Date("2017-10-27"), as.Date("2017-10-26"),
as.Date("2017-10-24"), as.Date("2017-10-21"), as.Date("2017-10-20")),
Price = c(100L, 98L, 102L, 97L, 96L, 100L),
MC = c(50L, 55L, 49L, 47L, 50L, 46L),
Delta1Price = c(0.0204, -0.0392, NA, NA, -0.04, NA),
Delta1MC = c(-0.0909, 0.12244, NA, NA, 0.0869, NA),
Delta2Price = c(-0.0196, NA, 0.0515, NA, NA, NA),
Delta2MC = c(0.0204, NA, 0.04255, NA, NA, NA)),
.Names = c("Date", "Price", "MC", "Delta1Price", "Delta1MC", "Delta2Price", "Delta2MC"))
d2<-as.data.frame(d2)
wo die Änderungsvariablen berechnet durch (current - previousValue)/PreviousValue
Hier ist meine ineffizienter Weg, dies zu tun, durch die Verwendung einer for-Schleife:
# Assume d1 and d2 are dataframes #
nms <- colnames(d1)[c(2:3)]
changeList <- c(1:2)
for (i in changeList){
#record the dates that will be used to calculate changes
currentDate <- d1$Date
revDate <- currentDate-i
#filter out the rows for the older relevant date
revData <- d1 %>%
dplyr::filter(d1$Date %in% revDate)
#Get the newer dates that are available
newCurDate <- revData$Date+i
newCurData <- d1 %>%
dplyr::filter(d1$Date %in% newCurDate)
#calculate the change variables
changes <- (newCurData[, nms] - revData[,nms])/revData[,nms]
#dynamically name these new change variables
newCurData[, paste("Delta", paste(i, nms, sep=""), sep="")]<- changes
#merge the data to get desired outcome
d1 <- merge(d1, newCurData, all=TRUE)
}
#final output should be the same d2 that I structured
d2 <- d1
Danke für die Tipps Arthur. Ich werde die Task-Seite zu Finanzen und Zeitreihen lesen. Ich habe nur einen Self-Join gemacht, um mein Problem zu veranschaulichen, aber ich bin mir nicht sicher, ob das der effizienteste Weg ist. Im Hinblick auf die Lag-Methode habe ich mir vorher einige Beiträge darüber angeschaut, aber es scheint gut zu funktionieren, wenn die Zeitreihe gleichmäßig verteilt ist. In meinem Fall habe ich inkonsistente Zeitreihendaten aufgrund einiger fehlender Daten dazwischen. –
Bearbeitete meine Antwort. Ich gebe zu, es war nicht so einfach ...: D – Arthur