- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题:
我有赚取和兑换代金券的时间序列数据。优惠券只限一次 3天固定窗口包括他们获得的那一天,例如。 1 月 1 日获得的代金券将在 1 日、2 日和 3 日有效。
我需要做出一个假设,即当涉及到针对他们赚取的赎回时,它是先到先得的。例如。如果我们有数据
Date VouchersEarned VouchersRedeemed
01/01/2020 10 0
02/01/2020 8 9
03/01/2020 4 4
04/01/2020 2 4
05/01/2020 1 4
然后在 2 日,那 9 张代金券来自第 1 次,即我们还有剩余的代金券
Date VouchersEarned VouchersRedeemed RemainingVouchers
01/01/2020 10 0 1
02/01/2020 8 9 8
然后在 3 日,这 4 次赎回将是第 1 次的剩余 1 次和第 2 次的 3 次
Date VouchersEarned VouchersRedeemed RemainingVouchers
01/01/2020 10 0 0
02/01/2020 8 9 5
03/01/2020 4 4 0
第四:
Date VouchersEarned VouchersRedeemed RemainingVouchers
01/01/2020 10 0 0
02/01/2020 8 9 1
03/01/2020 4 4 4
04/01/2020 2 4 2
第5个:
Date VouchersEarned VouchersRedeemed RemainingVouchers
01/01/2020 10 0 0
02/01/2020 8 9 1**
03/01/2020 4 4 0
04/01/2020 2 4 2
05/01/2020 1 4 1
所以在 5 日,我们拿到了第一张过期的优惠券,因为 ** 一张在 3 天内没有用完。
R dput
最后但这是它的样子
Date VouchersEarned VouchersRedeemed ActualActive ActualExpired CumulativeEarned
1 01/01/2020 10 0 10 0 10
2 02/01/2020 8 9 9 0 18
3 03/01/2020 4 4 9 0 22
4 04/01/2020 2 4 7 0 24
5 05/01/2020 1 4 3 1 25
6 06/01/2020 0 1 2 0 25
7 07/01/2020 0 1 0 1 25
8 08/01/2020 0 0 0 0 25
CumulativeRedeemed CumulativeDiff
1 0 10
2 9 9
3 13 9
4 17 7
5 21 4
6 22 3
7 23 2
8 23 2
ActualActive
&
ActualExpired
是我用笔和纸得出的数字。请注意,我将它们放在它们到期的日期上,而不是根据它们获得的日期。要么对我有用,只是改变报告 View 。我可以通过查看
CumulativeEarned
来获得总代金券。 &
CumulativeRedeemed
然后取差额。我想如果我能得到过期的,那么计算活跃的就很简单了。
df <- structure(list(Date = c("01/01/2020", "02/01/2020", "03/01/2020",
"04/01/2020", "05/01/2020", "06/01/2020", "07/01/2020", "08/01/2020"
), VouchersEarned = c(10L, 8L, 4L, 2L, 1L, 0L, 0L, 0L), VouchersRedeemed = c(0L,
9L, 4L, 4L, 4L, 1L, 1L, 0L), ActualActive = c(10L, 9L, 9L, 7L,
3L, 2L, 0L, 0L), ActualExpired = c(0L, 0L, 0L, 0L, 1L, 0L, 1L,
0L), CumulativeEarned = c(10L, 18L, 22L, 24L, 25L, 25L, 25L,
25L), CumulativeRedeemed = c(0L, 9L, 13L, 17L, 21L, 22L, 23L,
23L), CumulativeDiff = c(10L, 9L, 9L, 7L, 4L, 3L, 2L, 2L)), class = "data.frame", row.names = c(NA,
-8L))
编辑 2:
我最近在 R 中的尝试 .虽然有些问题,但我觉得滞后列的正确组合并非不可能
library(data.table)
dt <- as.data.table(df)
dt[, Date := lubridate::dmy(Date)]
# functional form
findExpiredVouchers <- function(dt, period=3){
# generation of cumulative data
dt[, CumulativeEarned := cumsum(VouchersEarned)]
dt[, CumulativeRedeemed := cumsum(VouchersRedeemed)]
dt[, CumulativeDiff := CumulativeEarned-CumulativeRedeemed]
# I think if we look at the cumulative earned against the cumulative redeemed,
# plus it's lag period from that point, ie the cumulative redeemed in 2 days,
# then we can see for data prior to last 3 which have expired
dt[, LaggedCumulativeRedeemed := shift(CumulativeRedeemed, period-1, type="lead")]
dt[, ExpiredCumulative := CumulativeEarned - LaggedCumulativeRedeemed]
# Now this creates negative values though for eg the first case, I'm not 100%
# if I need to worry about these
dt[ExpiredCumulative < 0, ExpiredCumulative := 0]
# so now it should be the difference in this series that captures the origin
# of an expiration
dt[, Expired := c(NA, diff(ExpiredCumulative))]
dt[1, Expired := ExpiredCumulative]
# and I can shift this by the lag period to get the end result
dt[, OutputExpired := shift(Expired, period, type="lag")]
dt[is.na(OutputExpired), OutputExpired := 0]
# and active
dt[, CumulativeExpired := cumsum(OutputExpired)]
dt[, OutputActive := CumulativeDiff-CumulativeExpired]
}
dt <- findExpiredVouchers(dt, 3)
dt[] # OutputExpired & OutputActive
有了一些新的虚假数据,随着负到期时间的出现,缺陷就会暴露出来:(
set.seed(1)
p = 0.2
new_dt <- data.table(
Date = 1:10,
VouchersEarned = sample(0:15, 10, replace=TRUE)
)
new_dt[, CumulativeEarned := cumsum(VouchersEarned)]
# fake VouchersRedeemed
new_dt[, VouchersRedeemed := as.integer(NA)]
new_dt[, CumulativeDiff := CumulativeEarned]
for(i in 1:nrow(new_dt)){
new_value <- sum(rbinom(new_dt$CumulativeDiff[i], 1, p))
new_dt[i, VouchersRedeemed := new_value]
new_dt[i:.N, CumulativeDiff := CumulativeDiff - new_value]
}
new_dt <- findExpiredVouchers(dt=new_dt, 3)
new_dt[] # OutputExpired < 0
新例子
Date VouchersEarned VouchersRedeemed OutputExpired
1: 1 8 1 0
2: 2 3 1 0
3: 3 6 3 0
4: 4 0 1 3
5: 5 1 1 2
6: 6 12 5 5
7: 7 6 5 -5
8: 8 10 3 -4
9: 9 13 7 9
10: 10 1 8 -1
运行
Waldi 的 循环显示了类似的结果,但 -5、-4 和 9 取消为 0(它们应该如此!)
最佳答案
使用 tidyverse 库,特别是 dplyr , 和 magrittr ,你可以写这个代码
df %<>%
mutate(VouchersEarnedCumsum = cumsum(VouchersEarned),
VouchersRedeemedCumsum = cumsum(VouchersRedeemed),
VouchersCumsumDifference = VouchersEarnedCumsum - lead(VouchersRedeemedCumsum, 2, default = max(VouchersRedeemedCumsum)),
VouchersCumsumDifference = as.numeric(VouchersCumsumDifference),
VouchersCumsumDifference = case_when(VouchersCumsumDifference < 0 ~ 0, T ~ VouchersCumsumDifference),
ExpiredVouchers = VouchersCumsumDifference - lag(VouchersCumsumDifference, default = 0),
ExpiredVouchersInDate = lag(ExpiredVouchers, 3, default = 0))
结果表,从你的数据帧 df 开始,是
# A tibble: 8 x 8
Date VouchersEarned VouchersRedeemed VouchersEarnedCumsum VouchersRedeemedCumsum VouchersCumsumDifference ExpiredVouchers ExpiredVouchersInDate
<chr> <int> <int> <int> <int> <dbl> <dbl> <dbl>
1 01/01/2020 10 0 10 0 0 0 0
2 02/01/2020 8 9 18 9 1 1 0
3 03/01/2020 4 4 22 13 1 0 0
4 04/01/2020 2 4 24 17 2 1 0
5 05/01/2020 1 4 25 21 2 0 1
6 06/01/2020 0 1 25 22 2 0 0
7 07/01/2020 0 1 25 23 2 0 1
8 08/01/2020 0 0 25 23 2 0 0
然后,很容易使用 dbplyr 翻译相应 SQL 查询中的每个函数,使用
translate_sql .
df %<>%
mutate(VouchersEarnedCumsum = cumsum(VouchersEarned),
VouchersRedeemedCumsum = cumsum(VouchersRedeemed),
VouchersCumsumDifference = VouchersEarnedCumsum - lead(VouchersRedeemedCumsum, 2, default = max(VouchersRedeemedCumsum)),
VouchersCumsumDifference = as.numeric(VouchersCumsumDifference),
VouchersCumsumDifference = case_when(VouchersCumsumDifference < 0 ~ 0, T ~ VouchersCumsumDifference),
VouchersCumsumDifference = accumulate(VouchersCumsumDifference, max),
ExpiredVouchers = VouchersCumsumDifference - lag(VouchersCumsumDifference, default = 0),
ExpiredVouchersInDate = lag(ExpiredVouchers, 3, default = 0))
关于sql - 计算过期的凭证,给定一个固定的窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65718399/
在下面的代码中,我得到一个 uninitialized value警告,但仅限于第二个 given/when例子。为什么是这样? #!/usr/bin/env perl use warnings; u
整个“开关”功能是否已成为实验性的?在没有 Perl 的 future 版本破坏我的代码的情况下,我可以依赖其中的某些部分吗?一般来说,将稳定功能更改为实验性的政策是什么? 背景use feature
有没有办法在一个条件语句中写出如下语句? a和b不能同时等于5。 (a可以是5,b可以是5,但是a AND b不能是5) 最佳答案 正如克里斯指出的那样,您要查找的是逻辑异或,相当于逻辑不等于 !=:
我正在寻找一种算法来找到给定 n 条线段的所有交点。以下是来自 http://jeffe.cs.illinois.edu/teaching/373/notes/x06-sweepline.pdf 的伪
数组中有 N 个元素。我可以选择第一项最多 N 次,第二项最多选择 N-1 次,依此类推。 我有 K 个 token 要使用并且需要使用它们以便我可以拥有最大数量的项目。 arr = [3, 4, 8
我正在尝试修复法语文本中的语法性别,想知道是否有办法从某个词条中获取所有单词的列表,以及是否可以在此类列表中进行查找? 最佳答案 尝试: import spacy lemma_lookup = spa
我正在为 Win32 编写一个简单的自动化测试应用程序。它作为一个单独的进程运行,并通过 Windows API 访问目标应用程序。我可以阅读窗口层次结构,查找标签和文本框,并通过发送/发布消息等来单
在 nodeJs 中使用 Sequelize 时,我从 Sequelize 收到此错误,如下所示: { [SequelizeUniqueConstraintError: Validation erro
本文https://arxiv.org/pdf/1703.10757.pdf使用回归激活映射 (RAM) - 而不是类激活映射 (CAM) 来解决问题。有几篇文章描述了如何实现 CAM。但是我找不到
我正在研究 Mach 动态链接器 dyld。这个问题适用于所有 Apple 平台,但很高兴得到特定于平台的答案;我正在使用 ObjC,但如果对你有用的话,我也很乐意翻译 Swift。 The rele
我有一个包含数千个 Instagram 用户 ID 的列表。我如何获得他们的 Instagram 用户名/句柄? 最佳答案 你必须使用这个 Instagram API: https://api.ins
我在下面的代码: def main(args: Array[String]) { val sparkConf = new SparkConf().setAppName("Spark-Hbase").s
我有一个表格,其中包含从 1 到 10 的数字。(从 D2 到 M2) 假设A1中有03/09/2019 并且在B1中有06/09/2019 并且在C1中有Hello 在A 列中,我有多个系列的单词,
我想在给定服务对应的 URI 的情况下检索服务的注释(特别是 @RolesAllowed )。这是一个例子: 服务: @GET @Path("/example") @RolesAllowed({ "B
我看到 OraclePreparedStatementexecuteQuery() 表现出序列化。也就是说,我想使用相同的连接对 Oracle 数据库同时运行两个查询。然而,OraclePrepare
import java.util.Scanner; public class GeometricSumFromK { public static int geometricSum(int k,
我创建了一个抽象基类Page,它说明了如何构建动态网页。我正在尝试想出一种基于作为 HttpServletRequest 传入的 GET 请求生成 Page 的好方法。例如... public cla
我的字符串是一条短信,采用以下两种格式之一: 潜在客户短信: 您已收到 1 条线索 标题:我的领导 潜在客户 ID:12345-2365 警报设置 ID:890 短信回复: 您已收到 1 条回复 标题
我在 python 中有以下代码: class CreateMap: def changeme(listOne, lisrTwo, listThree, listFour, listfive):
这是在 Hibernate 上运行的 JPA2。 我想检索相同实体类型的多个实例,给定它们的 ID。其中许多已经在持久性上下文和/或二级缓存中。 我尝试了几种方法,但似乎都有其缺点: 当我使用 ent
我是一名优秀的程序员,十分优秀!