我正在尝试创建一个函数来应用于数据框中的变量,对于当前观察前3天的窗口,计算当前价格是否下降然后返回到原始价格。数据框如下所示:
var fileProvider= new FileExtensionContentTypeProvider();
fileProvider.Mappings.Add(".ts", "text/x.typescript");
app.UseStaticFiles(new StaticFileOptions() { ContentTypeProvider = fileProvider});
VarA VarB Date Price Diff VarD
1 1 2007-04-09 50 NA 0
1 1 2007-04-10 50 0 0
1 1 2007-04-11 48 -2 1
1 1 2007-04-12 48 0 1
1 1 2007-04-13 50 2 0
1 1 2007-04-14 50 0 0
1 1 2007-04-15 45 -5 1
1 1 2007-04-16 50 5 0
1 1 2007-04-17 45 -5 0
1 1 2007-04-18 48 3 0
1 1 2007-04-19 48 0 0
1 1 2007-04-20 50 2 0
和VarA
是分组变量(在此示例中,它们不会更改),VarB
是我希望检测的变量,如果它减少然后再增加到起始级别,Price
是滞后价格差异(如果有任何帮助)。
Diff
显示应用我想要猜测的函数的结果。 VarD
取值VarD
有两个条件:1)价格从某个级别降低,然后在接下来两天的任何窗口中返回到原始水平(即50至48,再次至50,在行2至5,或50至45,再在行6至8中为50); 2)最多有两天价格再次上涨到起始水平。否则,1
应采用值VarD
。
我对如何开始没有任何线索。
数据框0
是:
db
提前致谢。
答案 0 :(得分:0)
希望我能正确理解您的要求:
library(dplyr)
db %>%
#create Diff.2 as helper variable: increase in price from current day to 2 days later
mutate(Diff.2 = diff(c(Price,NA,NA), lag = 2)) %>%
mutate(Var.D = ifelse(
Diff.2 + lag(Diff.2, 2) == 0 & #condition 1: price increase from current day to 2 days later
#is cancelled out by price decrease from 2 days ago to current day
Diff.2 > 0, #condition 2: price increases from current day to 2 days later
1, 0)) %>%
mutate(Var.D = ifelse(is.na(Var.D), 0, Var.D)) %>%
select(-Diff.2)
VarA VarB Date Price Diff Var.D
1 1 1 2007-04-09 50 NA 0
2 1 1 2007-04-10 50 0 0
3 1 1 2007-04-11 48 -2 1
4 1 1 2007-04-12 48 0 1
5 1 1 2007-04-13 50 2 0
6 1 1 2007-04-14 50 0 0
7 1 1 2007-04-15 48 -2 0
8 1 1 2007-04-16 49 1 0
9 1 1 2007-04-17 45 -4 0
10 1 1 2007-04-18 45 0 0
11 1 1 2007-04-19 45 0 0
12 1 1 2007-04-20 50 0 0
答案 1 :(得分:0)
我认为我找到了解决方案,如果感兴趣的话。我使用来自@G的输入。格洛腾迪克所以他应得的大部分功劳(但不是错误的责任)。解决方案分为四个步骤:
步骤1:如果价格下降,则创建一个等于1的虚拟变量,并且每个月保持低位。
db$Tmp1 <- 0
for (n in 1 : length(db$Date)) db$Tmp1[n] <- ifelse
(db$Diff[n] < 0, 1, ifelse (db$Tmp1[n-1:min(0, n)] == 1 &&
db$Diff[n] == 0, 1, 0))
ifelse
的第一部分告诉我,如果date
[n]的价格下降,或者前一个Step1
的值等于1且价格没有变化,那么请指定值1,否则为0。
第2步:将步骤1中价格降低的天数限制为两天(感谢@G.Grothendieck)。
loop <- function(x) if (all(x[-1] == 1)) 0 else x[1]
db$Tmp2 = ifelse(db$Diff < 0, rollapply(db$Tmp1, 3, loop, partial = T,
align = "left"), ifelse(db$Diff==0 & lag(db$Tmp2) ==
1, 1, 0))
loop
是一个函数,如果所有值(当前日期除外)等于1,则值为0,否则取Tmp1
的值。然后,如果价格下降(db$diff
&lt; 0)将loop
应用于Tmp1
前进的3个值,但是如果价格没有变化且前一个值Tmp2
为1,赋值为1. Else赋值为0.
第3步:计算价格下降之前的价格是否会在原始价格的三天内重复。
loop2 <- function(x) if (any(x[-1] == x[1])) 1 else 0
Tmp3 = rollapply(Price, 4, loop2, partial = T, align = "left")
函数loop2
搜索是否在当前日期的3天内重复任何价格(Tmp3
函数中的4)。然后,Tmp3
将loop2
应用于Price
向量(在此Ifelse statement with dataframe subset using date之后)
第4步:将Tmp2
和Tmp3
相乘以获得结果(并删除辅助变量)。
db$Sale <- db$Tmp2 * db$Tmp3
db$Tmp1 <- db$Tmp2 <- db$Tmp3 <- NULL
现在,Sale
只是乘以Tmp2
和Tmp3
,因为第一个将销售调整为3天的窗口,第二个显示原始价格是否为开头价格下跌的价格出现在3天前的窗口。
希望它对任何人都有用。如果有任何更正或建议,我们非常欢迎。最后,每个代码都应该应用于每个VarA
和VarB
,因此每个步骤都应该在以下代码中:
db <-
db %>% group_by(VarA, VarB) %>%
mutate(
code
)
输出结果为:
VarA VarB Date Price Diff Tmp1 Tmp2 Tmp3 Sale
<int> <int> <fctr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1 2007-04-09 50 0 0 NA 1 NA
2 1 1 2007-04-10 50 0 0 0 1 0
3 1 1 2007-04-11 48 -2 1 1 1 1
4 1 1 2007-04-12 48 0 1 1 1 1
5 1 1 2007-04-13 50 2 0 0 1 0
6 1 1 2007-04-14 50 0 0 0 0 0
7 1 1 2007-04-15 48 -2 1 1 0 0
8 1 1 2007-04-16 49 1 0 0 0 0
9 1 1 2007-04-17 45 -4 1 0 1 0
10 1 1 2007-04-18 45 0 1 0 1 0
11 1 1 2007-04-19 45 0 1 0 0 0
12 1 1 2007-04-20 50 5 0 0 0 0
非常感谢。