R:在事件之间聚合数据
我的贸易数据如下:R:在事件之间聚合数据,r,aggregate,R,Aggregate,我的贸易数据如下: TradeNumber OpenTime CloseTime Profit TradeHour Equity 1 01/01/2014 13:10 01/01/2014 14:40 10 13 520 2 01/01/2014 13:25 01/01/2014 13:28 20 13 520 3 01/01/2
TradeNumber OpenTime CloseTime Profit TradeHour Equity
1 01/01/2014 13:10 01/01/2014 14:40 10 13 520
2 01/01/2014 13:25 01/01/2014 13:28 20 13 520
3 01/01/2014 13:29 01/01/2014 15:40 -50 13 520
4 01/01/2014 13:30 01/01/2014 14:05 -5 13 520
5 01/01/2014 14:12 01/01/2014 14:40 12 14 560
6 01/01/2014 14:21 01/01/2014 14:45 -16 14 560
7 01/01/2014 14:50 01/01/2014 14:59 -14 14 560
8 01/01/2014 14:58 01/01/2014 15:05 56 14 560
我希望找到每一笔交易在同一时间内,但在该笔交易之前,所有其他交易的利润之和,并在交易时将其计入权益。因此,在给定的示例中,结果将是:
TradeNumber OpenTime CloseTime Profit TradeHour Equity
1 01/01/2014 13:10 01/01/2014 14:40 10 13 520
2 01/01/2014 13:25 01/01/2014 13:28 20 13 520
3 01/01/2014 13:29 01/01/2014 15:40 -50 13 520 + 20
4 01/01/2014 13:30 01/01/2014 14:05 -5 13 520 + 20
5 01/01/2014 14:12 01/01/2014 14:40 12 14 560
6 01/01/2014 14:21 01/01/2014 14:45 -16 14 560 - 5
7 01/01/2014 14:50 01/01/2014 14:59 -14 14 560+10-5+12-16
8 01/01/2014 14:58 01/01/2014 15:05 56 14 560+10-5+12-16
例如,第8号交易于2014年1月1日14:58开盘。在开盘前,有4个其他交易在该小时内收盘(交易1、4、5和6)。因此,我想在一小时开始时将这4笔交易的利润加到权益中,并将该数字放入交易数据的权益栏中
for (i in 1:nrow(tradeData))
{
tradeData$EquityUSD1 [i] = tradeData$Equity [i] + sum(tradeData$Profit[tradeData$CloseTime <= tradeData$OpenTime[i] & tradeData$CloseTime >= tradeData$tradeHour[i,1]])
}
for(i in 1:nrow(贸易数据))
{
tradeData$EquityUSD1[i]=tradeData$Equity[i]+总和(tradeData$Profit[tradeData$CloseTime=tradeData$tradeHour[i,1]])
}
这是可行的,但相当缓慢,我想加快速度,因为有成千上万的交易
有什么想法吗?如果我遗漏了任何重要数据/信息,请告知我
谢谢,我还没有用更大的数据集测试速度
dt
## TradeNumber OpenTime CloseTime Profit TradeHour Equity
## 1 1 01/01/2014 13:10 01/01/2014 14:40 10 13 520
## 2 2 01/01/2014 13:25 01/01/2014 13:28 20 13 520
## 3 3 01/01/2014 13:29 01/01/2014 15:40 -50 13 520
## 4 4 01/01/2014 13:30 01/01/2014 14:05 -5 13 520
## 5 5 01/01/2014 14:12 01/01/2014 14:40 12 14 560
## 6 6 01/01/2014 14:21 01/01/2014 14:45 -16 14 560
## 7 7 01/01/2014 14:50 01/01/2014 14:59 -14 14 560
## 8 8 01/01/2014 14:58 01/01/2014 15:05 56 14 560
require(data.table)
setDT(dt)
dt[,OpenTime:=as.POSIXct(OpenTime,format="%m/%d/%Y %H:%M")]
dt[,CloseTime:=as.POSIXct(CloseTime,format="%m/%d/%Y %H:%M")]
dt[,Equity.new:=Equity+sum(dt$Profit[hour(OpenTime)==hour(dt$CloseTime) & OpenTime > dt$CloseTime]), by="TradeNumber"]
dt
## TradeNumber OpenTime CloseTime Profit TradeHour Equity Equity.new
## 1: 1 2014-01-01 13:10:00 2014-01-01 14:40:00 10 13 520 520
## 2: 2 2014-01-01 13:25:00 2014-01-01 13:28:00 20 13 520 520
## 3: 3 2014-01-01 13:29:00 2014-01-01 15:40:00 -50 13 520 540
## 4: 4 2014-01-01 13:30:00 2014-01-01 14:05:00 -5 13 520 540
## 5: 5 2014-01-01 14:12:00 2014-01-01 14:40:00 12 14 560 555
## 6: 6 2014-01-01 14:21:00 2014-01-01 14:45:00 -16 14 560 555
## 7: 7 2014-01-01 14:50:00 2014-01-01 14:59:00 -14 14 560 561
## 8: 8 2014-01-01 14:58:00 2014-01-01 15:05:00 56 14 560 561
假设您的数据位于名为
tradedata
的数据框中,下面的代码似乎生成了您想要的输出:
ddply( tradedata , .(TradeHour) ,
mutate,
Equity=Equity+ cumsum(Profit) - Profit )
如果要包括特定交易的利润,请删除-利润。
您可以通过给ddply
一个.parallel=TRUE
选项来并行运行它。带有数据的答案。但是,表格可能更快。看看哪一个效果最好会很有趣。dplyr
窗口函数可能会帮助您,谢谢您的回答!我使用了上面的数据表解决方案,因为它似乎快了一点。再次感谢!是的,学习数据表绝对是最好的选择。不过,对于只需要实现一次的人来说,这是一个快速解决方案!