gpt4 book ai didi

r - R数据表包中时间序列的高效操作

转载 作者:行者123 更新时间:2023-12-04 11:16:25 25 4
gpt4 key购买 nike

非常感谢您的评论/回答。

上下文:我有一个包含十几个国家/地区掉期利率每日价格的大型数据表。这些列是 [ID、日期、X1Y、X2Y、X3Y ... X30Y],其中 X..Y 是指示 yield 曲线部分的列(例如,X1Y 是 1 年期掉期,X3Y 是 3 年期掉期)。这两个键是ID(例如“AUD”、“GBP”)和日期(例如“2001-04-13”、“2001-04-16”)。

虚拟数据:

set.seed(123)
dt <- cbind(ID=rep(c("AUD","GBP"),c(100,100)),X1Y=rnorm(200),X2Y=rnorm(200),X3Y=rnorm(200))
dt <- data.table(dt)
dt[,Date := seq(from=as.IDate("2013-01-01"), by="1 day", length.out=100)]
setkeyv(dt,c("ID","Date"))

问题 1:首先生成一些虚拟信号。如果有 100 列相当复杂的信号生成公式编码在一个单独的函数中,比如 genSig(X1Y),语法是什么?这就是我仅使用 3 列和一些无意义的公式的意思:

dt[,SIG1  :=c(0, diff(X1Y ,1)),by="ID"]
dt[,SIG2 :=c(0, diff(X2Y ,1)),by="ID"]
dt[,SIG3 :=c(0, diff(X3Y ,1)),by="ID"]

问题 2:基于“月中”结转列。例如,使用 SIG 列,我想让每个月 15 日之后的所有内容都与 15 日的信号相同,直到下个月的 15 日。棘手的是,实际数据只包含交易日,所以如果是周末/假期,有些月份没有 15 日。另一个问题是使用有效的语法,我可以在每个月的开始使用循环(我知道..)来实现类似的东西,只是为了说明我的意思:

for (i in 2:length(dt$Date)){
if(as.POSIXlt(dt[i,]$Date)$mon == as.POSIXlt(dt[i-1,]$Date)$mon){
dt[i, SIG1 := dt[i-1,SIG1]]
dt[i, SIG2 := dt[i-1,SIG2]]
dt[i, SIG3 := dt[i-1,SIG3]]
}
}

我不知道如何处理“月中”问题,因为它可能在 15 日、16 日或 17 日。与问题 1 一样,如果有插入/更新多个/十几个列的智能方法,我们将不胜感激。

最佳答案

就问题 2 而言,您可以使用滚动连接:

# small sample to demonstrate
dt = data.table(date = as.Date(c('2013-01-01', '2013-01-15', '2013-01-17', '2013-02-14', '2013-02-17'), '%Y-%m-%d'), val = 1:5)
dt
# date val
#1: 2013-01-01 1
#2: 2013-01-15 2
#3: 2013-01-17 3
#4: 2013-02-14 4
#5: 2013-02-17 5

setkey(dt, date)
midmonth = seq(as.Date('2013-01-15', '%Y-%m-%d'),
as.Date('2013-12-15', '%Y-%m-%d'),
by = '1 month')

dt[, flag := 0]
dt[J(midmonth), flag := 1, roll = -Inf]
dt
# date val flag
#1: 2013-01-01 1 0
#2: 2013-01-15 2 1
#3: 2013-01-17 3 0
#4: 2013-02-14 4 0
#5: 2013-02-17 5 1

现在您可以cumsum flag 来获得您想要的分组,例如做:

dt[, val1 := val[1], by = cumsum(flag)]
dt
# date val flag val1
#1: 2013-01-01 1 0 1
#2: 2013-01-15 2 1 2
#3: 2013-01-17 3 0 2
#4: 2013-02-14 4 0 2
#5: 2013-02-17 5 1 5

关于r - R数据表包中时间序列的高效操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20141240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com