Добавьте месяцы нулевого спроса к временным рядам зоопарка

У меня есть некоторые прерывистые данные о спросе, которые включают только строки, в которых есть спрос. Я ввожу его через read.csv, и у меня есть два столбца: Дата (как дата) и Количество (как целое число). Затем я преобразовываю его в серию зоопарков и объединяю ежедневную потребность в ежемесячную. Мой окончательный вывод - серия зоопарков с датой первого дня месяца и суммированным спросом за этот месяц.

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

Например: у меня есть количество 2 на дату 2013-01-01, а затем следующая строка - это количество 3 на 2013-10-01. Мне нужно добавить ноль количества к 2013-02-01 по 2013-09-01.

Date <- c('1/1/2013','10/1/2013','11/1/2013')
Quantity <- c('2','3','6')

Date <- as.Date(Date, "%m/%d/%Y")

df <- data.frame(Date, Quantity)
df <- read.zoo(df)
df

Выход серии зоопарка:

2013-01-01  2013-10-01  2013-11-01
         2           3           6

2 ответа

Потому что "DF" является zoo объект, вы можете использовать merge.zoo И его fill аргумент. Текущий набор данных объединяется с пустым zoo Объект, который содержит все желаемые даты.

tt <- seq(min(Date), max(Date), "month")
merge(df, zoo(, tt), fill = 0)

# 2013-01-01 2013-02-01 2013-03-01 2013-04-01 2013-05-01 2013-06-01 2013-07-01 2013-08-01 2013-09-01 2013-10-01 2013-11-01 
#          2          0          0          0          0          0          0          0          0          3          6 

Для дальнейших примеров см. ?merge.zoo ("расширить неправильный ряд до регулярного").

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

Во-первых, давайте создадим поддельные данные:

# Vector of dates from Jan 1, 2015, to Mar 31, 2015
dates = seq(as.Date("2015-01-01"), as.Date("2015-03-31"), by="1 day")

# Let's create data for few of these dates, leaving some out
set.seed(55)
dat = data.frame(dates=dates[sample(1:length(dates), 70)],
                 quantity=sample(1:10, 70, replace=TRUE))
dat = dat[order(dat$dates),]

Теперь давайте поверим dat это то, что вы импортировали из CSV-файла. Мы хотим заполнить quantity=0 для пропущенных дат. Итак, сначала нам нужно добавить строки для пропущенных дат. Вы можете сделать это, создав вектор дат, содержащий все даты от первой до последней даты в вашем CSV-файле и используя merge функция. В этом случае мы уже создали этот вектор дат выше.

Теперь объедините строки для пропущенных дат. Новые строки будут иметь NA за quantity, Мы изменим те NAс нуля ниже.

dat = merge(data.frame(dates), dat, by="dates", all.x=TRUE)

# Set missing values to zero
dat$quantity[is.na(dat$quantity)] = 0

Теперь вы можете агрегировать по месяцам, конвертировать в zoo серия и т. д.

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