Линейная диаграмма для совокупных транзакций различных типов (зачет)

У меня есть два больших отдельных кадра данных, отслеживающих совокупные транзакции в определенных элементах. Df1 следует этой структуре:

structure(list(NAME = c("Stock 2014", "Stock 2014", "Stock 2014", 
"Stock 2014", "Stock 2014", "Stock 2014", "Stock 2014", "Stock 2014", 
"Stock 2014", "Stock 2014", "Stock 2014", "Stock 2014", "Stock 2014", 
"Stock 2014", "Stock 2014", "Stock 2014", "Stock 2014", "Stock 2014", 
"Stock 2014", "Stock 2014"), Transaction_DATE = structure(c(11893, 
11983, 12167, 12216, 12263, 12893, 13075, 13894, 13985, 14174, 
14265, 14405, 14540, 14778, 14855, 15266, 15478, 15538, 15562, 
15666), class = "Date"), TRANSACTION = c(2800, 2750, 2500, 2500, 
2500, 360, 289, 135, 405, 1845, 1602, 5490.409, 4880.86, 4399.53, 
4122.574, 793, 1500, 539, 1500, -332.3), Termination_DATE = structure(c(16320, 
16320, 16320, 16320, 16320, 16320, 16320, 16320, 16320, 16320, 
16320, 16320, 16320, 16320, 16320, 16320, 16320, 16320, 16320, 
16320), class = "Date")), row.names = c(NA, -20L), class = c("tbl_df", 
"tbl", "data.frame"))

Df1 является основным фреймом данных для этой задачи и отслеживает товары, которые были доступны для продажи (обозначаются столбцом «ТРАНЗАКЦИЯ»). «ТРАНЗАКЦИЯ» не является агрегированным столбцом (и в действительности он не представляет транзакцию), он просто представляет новые выпуски «Акции 2014», которые были доступны для продажи на каждую дату; таким образом, первая запись была первой, когда товар был доступен для продажи покупателям. По состоянию на 23 октября 2002 г. для продажи было доступно еще 2750 000 автомобилей (вместе с первоначальными 2800 000, доступными 25 июля 2002 г.).

Termination_DATE представляет собой дату, когда товар больше не продается, и поэтому данные временного ряда должны заканчиваться на этой дате.

Df2 представляет собой количество продаж, сделанных клиентами в каждую дату:

structure(list(Date = structure(c(1236729600, 1237334400, 1237939200, 
1238544000, 1239148800, 1239753600, 1240272000, 1240963200, 1241568000, 
1242172800, 1242777600, 1243382400, 1245196800, 1245801600, 1257897600, 
1259107200, 1260230400, 1262736000, 1263945600), tzone = "UTC", class = c("POSIXct", 
"POSIXt")), NAME = c("Stock 2014", "Stock 2014", "Stock 2014", 
"Stock 2014", "Stock 2014", "Stock 2014", "Stock 2014", "Stock 2014", 
"Stock 2014", "Stock 2014", "Stock 2014", "Stock 2014", "Stock 2014", 
"Stock 2014", "Stock 2014", "Stock 2014", "Stock 2014", "Stock 2014", 
"Stock 2014"), Proceeds = c(4078.501279, 4250.769106, 336.426711, 
1015.964789, 1482.626306, 2419.852908, 6371.6269, 3901.862847, 
964.90766, 7455.621856, 2511.91081, 2233.596381, 2658.115097, 
2177.589872, 128.715088, 923.391173, 67.389718, 916.832833, 113.312322
)), row.names = c(NA, -19L), class = c("tbl_df", "tbl", "data.frame"
))

«Выручка» представляет транзакцию.

Итак, что я хочу сделать, так это создать временную шкалу чистых непроданных товаров каждого товара в виде временного ряда между первой ДАтой транзакции в df1 и датой завершения_DATE, тем самым принимая во внимание дату и транзакции, указанные в df2.

Есть ли у кого-нибудь какие-либо советы о том, как этого добиться (извините, если неясно, английский не является родным языком).

Обновлено: я, вероятно, должен упомянуть, что для продажи доступен не только один предмет (это большой фрейм данных, содержащий больше предметов, чем просто «Акции 2014», поэтому решение должно учитывать это).

EDIT2: исправлена ​​странная ошибка вывода dput.

Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
2
0
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете связать свои кадры данных вместе, сделать Proceeds отрицательным и вычислить кумулятивную сумму, чтобы получить текущую чистую сумму.

NB, лучше предоставить примеры данных, которые охватывают все ваши требования. Я добавил второй NAME к вашим данным, чтобы учесть требование нескольких элементов.

library(dplyr)
library(ggplot2)

df_both <- df2 %>% 
  mutate(
    Transaction_DATE = as.Date(Date), 
    TRANSACTION = -1 * Proceeds,
    .keep = "unused"
  ) %>% 
  bind_rows(df1) %>% 
  arrange(NAME, Transaction_DATE) %>% 
  group_by(NAME) %>% 
  mutate(Net_Unsold = cumsum(TRANSACTION)) %>% 
  ungroup() 

ggplot(df_both, aes(Transaction_DATE, Net_Unsold)) +
  geom_hline(yintercept = 0, size = .25, color = "gray30") +
  geom_line(aes(color = NAME)) +
  scale_x_date(date_breaks = "year", date_labels = "%Y") +
  theme_minimal()

Расширенные данные примера:

set.seed(13)

df1 <- bind_rows(
  df1, 
  mutate(
    df1, 
    NAME = "Stock 2015", 
    Transaction_DATE = Transaction_DATE + 365,
    Termination_DATE = Termination_DATE + 365,
    TRANSACTION = TRANSACTION + rnorm(n(), sd = 500)
  )
)

df2 <- bind_rows(
  df2,
  mutate(
    df2, 
    NAME = "Stock 2015", 
    Date = Date + 365,
    Proceeds = Proceeds + rnorm(n(), sd = 500)
  )
)

Спасибо за это, это работает для добавленных df1 и df2, но не работает для гораздо большего df. Единственная причина, по которой я дал урезанную версию, была из-за размера dfs (df1 - 2 КБ, а df2 - 7,6 КБ).

alec22 23.11.2022 15:44

Другие вопросы по теме