如何计算 R 中给定时间段的最大值?

How to count maximum value for given time period in R?

我从 MySQL 获得了数据,我正在尝试将其形象化并找出一些答案。 使用 R 进行统计。

最终产品是达到价格变化的折扣百分比(=行)。

这是我的数据集的示例。

     itemId pricehis           timestamp
1  69295477     1290 2022-04-12 04:42:53
2  69295624     1145 2022-04-12 04:42:53
3  69296136     3609 2022-04-12 04:42:54
4  69296607      855 2022-04-12 04:42:53
5  69295291     1000 2022-04-12 04:42:50
6  69295475     4188 2022-04-12 04:42:52
7  69295614     1145 2022-04-12 04:42:51
8  69295622     1290 2022-04-12 04:42:50
9  69295692     3609 2022-04-12 04:42:49
10 69295917     1725 2022-04-12 04:42:48
11 69296090     2449 2022-04-12 04:42:53
12 69296653     1145 2022-04-12 04:42:51
13 69296657     5638 2022-04-12 04:42:48
14 69296661     1725 2022-04-12 04:42:51
15 69296696      710 2022-04-12 04:42:51

我一直卡在计算的一部分 - 6 个月内每个 productId 的最大值。

在数据集中,特定 productId 的行具有不同的 pricehis 值和不同的时间戳。我需要找到不超过 6 个月的给定行的最大值。

计算所需折扣的公式为:

Discount grouped by itemId = 1 - pricehis / max(pricehis in the last 6 months)

目前我无法解决第二部分 - 最近 6 个月的价格。 - 我需要一个最近 6 个月内最大值为 'pricehis' 的新列作为 itemId。 也可以称为间隔最大值。

我可以按 itemId 分组,但我不知道如何添加最多 6 个月的条件。

关于如何获得这个的任何提示?

我喜欢 slider::slide_index_dbl 这种东西。这是一些用来演示 6mo window:

的假数据
data.frame(itemId = rep(1:2, each = 6),
           price = floor(100*cos(0:11)^2),
           timestamp = as.Date("2000-01-01") + 50*(0:11)) -> df

我们可以从df开始,按itemId分组,然后计算再应用window函数。 (请注意,slider 要求数据在每个组内按日期排序。)

library(dplyr).  
library(lubridate) # for `%m-%`, to get sliding months (harder than it sounds!)
df %>%     
  group_by(itemId) %>%
  mutate(max_6mo = slider::slide_index_dbl(.x = price,     # based on price...
                                           .i = timestamp, # and timestamp...
                                           .f = max,       # what's the max...
                                           .before = ~.x %m-% months(6))) %>% # over the last 6mo
  mutate(discount = 1 - price / max_6mo) %>%               # use that to calc discount
  ungroup()

结果

# A tibble: 12 × 5
   itemId price timestamp  max_6mo discount
    <int> <dbl> <date>       <dbl>    <dbl>
 1      1   100 2000-01-01     100   0     
 2      1    29 2000-02-20     100   0.71  
 3      1    17 2000-04-10     100   0.83  
 4      1    98 2000-05-30     100   0.0200
 5      1    42 2000-07-19      98   0.571    # new max since >6mo since 100
 6      1     8 2000-09-07      98   0.918 
 7      2    92 2000-10-27      92   0     
 8      2    56 2000-12-16      92   0.391 
 9      2     2 2001-02-04      92   0.978 
10      2    83 2001-03-26      92   0.0978
11      2    70 2001-05-15      83   0.157    # new max since >6mo since 92
12      2     0 2001-07-04      83   1