Преобразование ежедневных данных о транзакциях в сумму на конец каждой недели - PullRequest
1 голос
/ 16 апреля 2020

У меня есть ежедневные данные транзакций, которые я хочу преобразовать в недельную сумму (т. Е. Сумму транзакций каждую неделю для недели, заканчивающейся в воскресенье).

В настоящее время она имеет такую ​​структуру

dataset <- data.frame(date=as.Date(c("20200407", "20200407", "20200407", "20200407"), "%Y%m%d"), category=c("Petrol Station", "Accomodation", "Discount Store", "Shopping"), amount=c(5431.47, 839.1, 2399.13, 1305.82))

  • Дата - по сути, это все различные транзакции в тот день (я уже переформатировал с использованием функции ydm)
  • Категория - различные типы расходов
  • сумма - это расходы.

    date        category        amount
    2020-04-07  Petrol Station  5431.47
    2020-04-07  Accommodation   839.1
    2020-04-07  Discount Store  2399.13
    2020-04-07  Shopping        1305.82
    

В общей сложности за 3 года данных имеется около 100 тыс. строк

Я могу создать недельную переменную, используя приведенные ниже (что дает мне W1, W2, ... и т. д. c.) и суммируем его, группируя. Тем не менее, кажется, что он не работает должным образом в неделю 1 и неделю 52, где нет целых 7 дней

dataset$Week <- strftime(dataset$date, format = "%Y-W%V")

Любые предложения будут оценены.

Ответы [ 3 ]

1 голос
/ 16 апреля 2020

В вашем примере с использованием пакетов data.table и lubridate:

library(lubridate)
library(data.table)
# convert data.frame to data.table
setDT(dataset)
# add week variable, then sum grouping by week and category 
dataset[, week := week(date)][, 
  wkSum = sum(amount), keyby = c("week", "category")]

Немного изменив данные вашего примера, чтобы охватить несколько недель, и повторял категории, чтобы показать, что он работает, этот вход

         date       category  amount
1: 2020-04-06       Shopping 1203.54
2: 2020-04-07 Petrol Station 5431.47
3: 2020-04-07       Shopping 1305.82
4: 2020-04-08       Shopping 1400.43

Дает вывод

   week       category   wkSum
1:   14 Petrol Station 5431.47
2:   14       Shopping 2509.36
3:   15       Shopping 1400.43
1 голос
/ 16 апреля 2020

Попробуйте:

library(tidyverse)
library(lubridate)

dataset%>%
  mutate(week = week(date))%>%
  group_by(week)%>%
  summarize(week_sum = sum(amount))

Если вы хотите получить оценку etxtra "category", чем:

dataset%>%
  mutate(week = week(date))%>%
  group_by(week, category)%>%
  summarize(week_category_sum = sum(amount))

РЕДАКТИРОВАТЬ:

@ TobKel Что-то вроде это - но для каждой отдельной подкатегории в столбце категории (там около 100).

Я могу сгенерировать нижеследующий штраф, это просто неделя 01 и неделя 52, в которых нет полных семи дней

output

0 голосов
/ 16 апреля 2020

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

library(tidyverse)
library(dplyr)
library(lubridate)

sum_output <- dataset %>%
  mutate(week = week(date)) %>%
  spread(., category, amount) %>%
  group_by(week) %>%
  summarise(accomodation_week_sum = sum(Accomodation), 
         discount_store_week_sum= sum(`Discount Store`), 
         Petrol_week_sum=sum(`Petrol Station`), 
         shopping_week_sum= sum(Shopping))

На данный момент это то же самое число, поскольку у вас нет больше наблюдений за ту же неделю, но в конечном итоге, если у вас будет больше, group_by() вернет вам одно сумма в неделю.

ОБНОВЛЕНИЕ : в случае, если у вас есть сотни категорий, которые вы, очевидно, не хотите вводить по отдельности, должно работать следующее:

library(tidyverse)
library(dplyr)
library(lubridate)

sum_output <- dataset %>%
  mutate(week = week(date)) %>%
  split(.$category) %>%
  lapply(., group_by, week) %>%
  lapply(., summarise, week_sum_amount=sum(amount)) %>%
  bind_rows(., .id = "week_sum_amount") %>% 
  data.frame(check.names = FALSE)

Основным дополнением является split(), которое разделит все ваши категории в разных фреймах данных в одном списке. Список данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...