Nano Hash - криптовалюты, майнинг, программирование

Скользящая сумма с двойной индексацией в R

Я хотел бы рассчитать скользящую сумму или скользящий счет по двум столбцам индекса в R. В следующей таблице данных есть столбец, который показывает сумму продажи и два столбца даты. Я хотел бы создать 4-й столбец, который дает мне количество дат в столбце index2, которые меньше даты в столбце index1, и я также хочу иметь 5-й столбец, который дает мне сумму продаж, связанных с теми, которые подсчитаны в четвертом столбец.

sales_vec <- c(2, 4, 3, 5)
index1_vec <- as.Date("2019-08-29") + c(0, 2, 5, 6)
index2_vec <- as.Date("2019-08-29") + c(-5, 2, 1, -3)
company <- tibble(
  sales = sales_vec,
  index1 = index1_vec ,
  index2 = index2_vec 
)

> print(company)
# A tibble: 4 x 3
  sales index1     index2    
  <dbl> <date>     <date>    
1     2 2019-08-29 2019-08-24
2     4 2019-08-31 2019-08-31
3     3 2019-09-03 2019-08-30
4     5 2019-09-04 2019-08-26

Мой результат должен выглядеть так:

# A tibble: 4 x 5
  sales index1     index2     rollingCount rollingSum
  <dbl> <date>     <date>            <dbl>      <dbl>
1     2 2019-08-29 2019-08-24            2          7
2     4 2019-08-31 2019-08-31            3         10
3     3 2019-09-03 2019-08-30            4         14
4     5 2019-09-04 2019-08-26            4         14

Первая строка RollingCount равна 2, потому что в столбце index2 есть две даты, которые меньше, чем первая строка index1, и сумма продаж, связанных с этими двумя строками, равна 2 + 5 = 7, что отображается в первой строке RollingSum. Вторая строка RollingCount равна 3, потому что в столбце index2 есть три даты, которые меньше, чем вторая строка index1, а сумма продаж, связанных с этими тремя строками, составляет 2 + 5 + 3 = 10, что отображается во второй строке. ряд прокаткиСум. И так далее.

Я знаком с семейством команд слайдов для выполнения скользящих вычислений, но я борюсь с этой задачей, так как в ней есть два столбца индекса.


  • Вам нужно sapply(company$index1, function(x) {i1 <- company$index2 < x; sum(company$sales[i1]) }) 03.07.2020
  • @ chinsoon12 Да, я бы предпочел решение tidyverse. Однако, если есть другие решения, они также будут полезны, поскольку они могут предложить полезные мыслительные процессы, которые могут открыть дверь в круговерть! 03.07.2020
  • @Henrik Спасибо, что заметили опечатку. Я исправлю это. 03.07.2020

Ответы:


1

В base R мы можем использовать sapply для перебора столбца 'index1', создать логический вектор с index2 столбцом, использовать это для получения sum логического вектора и sum подмножества 'продаж'.

cbind(company, t(sapply(company$index1, function(x) {
        i1 <- company$index2  < x
    c(rollingCount = sum(i1), rollingSum = sum(company$sales[i1])) })))
#  sales     index1     index2 rollingCount rollingSum
#1     2 2019-08-29 2019-08-24            2          7
#2     4 2019-08-30 2019-08-31            3         10
#3     3 2019-09-03 2019-08-30            4         14
#4     5 2019-09-04 2019-08-26            4         14

Или другой вариант - tidyverse

library(dplyr)
library(purrr)
map_dfr(company$index1, ~ {
       i1 <- company$index2 < .x
       tibble(rollingCount = sum(i1), rollingSum = sum(company$sales[i1]))}) %>%
    bind_cols(company, .)
# A tibble: 4 x 5
#  sales index1     index2     rollingCount rollingSum
#  <dbl> <date>     <date>            <int>      <dbl>
#1     2 2019-08-29 2019-08-24            2          7
#2     4 2019-08-30 2019-08-31            3         10
#3     3 2019-09-03 2019-08-30            4         14
#4     5 2019-09-04 2019-08-26            4         14
02.07.2020
  • Спасибо, что поделились своим ответом. На основе вашего решения я разработал именно то, что я хотел. Спасибо! company <- company %>% mutate( rollingCount = slide_dbl (.x = index1, ~{sum(index2 < .x)}), rollingSales = slide_dbl (.x = index1, ~{sum(sales[index2 < .x])}), ) 03.07.2020

  • 2

    Вот несколько подходов:

    Использование rowwise:

    library(dplyr)
    library(purrr)
    
    company %>%
      rowwise() %>%
      mutate(rollingCount = sum(index1 > .$index2), 
             rollingSum = sum(.$sales[index1 > .$index2]))
    
    
    #  sales index1     index2     rollingCount rollingSum
    #  <dbl> <date>     <date>            <int>      <dbl>
    #1     2 2019-08-29 2019-08-24            2          7
    #2     4 2019-08-31 2019-08-31            3         10
    #3     3 2019-09-03 2019-08-30            4         14
    #4     5 2019-09-04 2019-08-26            4         14
    

    и используя map_dbl из purrr:

    company %>%
       mutate(rollingCount = map_dbl(index1, ~{
                     vec <- .x > index2
                     sum(vec)
                     }),
              rollingSum = map_dbl(index1, ~sum(sales[.x > index2])))
    
    03.07.2020
  • Спасибо! В вашем втором подходе можно ли нарушить операции внутри ~sum(sales[.x > index2])? Я имею в виду, определите функцию, которая сначала вычисляет vec <- (.x > index2), а затем вычисляет sum(vec). Причина в том, что я хотел бы провести более подробные расчеты по vec. 03.07.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..