如何计算 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
我从 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