Перевод. Оригинал: Manipulating Time Series Data in R with xts & zoo
Часть 2. Базовые операции с объектами xts.
Первая часть
Часть 2. Базовые операции с объектами xts.
Первая часть
Стандарт ISO-8601
Стандарт ISO-8601 является международно признанным способом представления даты и времени. Стандарт допускает общий формат, чтобы не только описывать даты, но также представлять диапазоны и повторяющиеся интервалы.
xts использует этот стандарт для всех операций извлечения и замены. Это делает код простым в написании и поддержке. Это также обеспечивает очень краткое выражение диапазонов дат и интервалов.
Для правильной работы xts очень важно точно следовать стандарту. Подробности можно найти в xts subset и документации .parseISO8601.
Работа с датами
Одним из наиболее мощных аспектов работы с временными рядами в xts является возможность быстрого и эффективного задания дат и временных диапазонов для выборки диапазона.
Диапазоны дат можно извлечь из объектов xts, просто указав желаемый период(ы), используя строки специальных символов в вашем подмножестве.
A[“20090825”] ## 25 августа 2009 года
A[“201203/201212”] ## с марта по декабрь 2012
A[“/201601”] ## до января 2016 включительно
Для этого упражнения вы создадите простой, но очень распространенный запрос. Извлеките диапазон дат, используя возможности ISO-8601 в xts. После успешного извлечения полного года вы создадите подмножество вашего нового объекта с конкретными датами начала и окончания, используя те же обозначения.
Инструкции:
Используя подмножество времени в стиле xts, выберите только 2016 год из временного ряда x и назовите его x_2016.
Используя явную строку даты начала и окончания, получите все данные с 1 января 2016 года по 22 марта 2016 года. Назовите это подмножество jan_march.
Чтобы проверить, что вы извлекли все 82 строки, используйте функцию length.
# Выбираем из x весь 2016 год
x_2016 <- x["2016"]
# Выбираем диапазон с 1 января 2016 года по 22 марта 2016 года
jan_march <- x["20160101/20160322"]
# Проверяем, что jan_march содержит 82 строки
82 == length(jan_march)
Извлечение повторяющихся внутридневных интервалов
Наиболее распространенные данные временных рядов «в дикой природе» - ежедневные. Иногда вы можете работать с внутридневными данными, которые содержат даты и время. В этом случае иногда необходимо просматривать только определенное подмножество времени для каждого дня в течение нескольких дней. Используя xts, вы можете легко нарезать дни, используя специальные обозначения в аргументе i = для извлечения в одну скобку (т.е. [i, j]).
Как вы узнали из предыдущего упражнения, уловка заключается в том, чтобы не указывать явные даты, а использовать специальную нотацию T/T, предназначенную для внутридневных повторяющихся интервалов.
Внутридневные интервалы для всех дней NYSE[“T09:30/T16:00”]
В этом упражнении вы извлекаете повторяющиеся утренние часы из временного ряда irreg, который содержит нерегулярные данные за январь 2010 года. Помните, что вы всегда можете использовать консоль R для экспериментов с irreg или для просмотра страниц справки с помощью ?xts.
Инструкции:
Используя нерегулярный временной ряд irreg, выберите все наблюдения с 8:00 до 10:00 в morn_2010. Используя morn_2010, извлеките только эти наблюдения за 13 января 2010 года.
# Извлекаем из irreg все данные с 8 до 10 утра
morn_2010 <- irreg["T08:00/T10:00"]
# Извлекаем наблюдения из morn_2010 за 13 января 2010 года
morn_2010["20100113"]
Выбор строк из объектов временных рядов
Часто вам может потребоваться выделить из временных рядов набор дат или объектов, основанных на времени. Это могут быть as.Date(), as.POSIXct() или другие классы. В этом упражнении вы узнаете, как из объекта xts можно извлечь соответствующие наблюдения, используя вектор дат в скобках.
Объекты x и dates были предварительно загружены в рабочее пространство.
Инструкции:
Используйте вектор dates для выбора подмножества объекта x.
Выберите подмножество x с использованием dates, который сначала преобразуется в POSIXct.
# Выбираем x, используя вектор dates
x[dates]
# Выбираем x, используя dates как POSIXct
x[as.POSIXct(dates)]
Обновление и замена элементов
Замена значений в объектах xts так же проста, как и их извлечение. Вы можете использовать строки ISO-8601, объекты даты, логические элементы или целые числа, чтобы найти строки, которые вы хотите заменить. Одна из причин, по которой вы можете захотеть сделать это, состоит в том, чтобы заменить известные интервалы или наблюдения на NA, скажем, из-за неисправности датчика в конкретный день или набора выбросов в выходные.
Для отдельных наблюдений, расположенных спорадически на протяжении ваших данных, хороший выбор - целые числа или логические векторы. Для непрерывных периодов времени ISO-8601 является предпочтительным методом.
В этом упражнении вы продолжите использовать вектор dates из предыдущего упражнения для изменения вашего объекта x. Оба уже загружены в рабочем пространстве.
Инструкции:
Используйте вектор dates, чтобы заменить значения в x значениями NA.
Замените все значения в x для дат (не относящихся к вектору) с 9 июня 2016 года на 0. Используйте замену в стиле ISO-8601.
Используйте консоль, чтобы посмотреть значения для 11 июня 2016 года, чтобы показать, что ваша тяжелая работа окупилась!
# Заменяем значения в x, содержащиеся в векторе dates, на NA
x[dates] <- NA
# Заменяем все значения в x, для дат, начиная с 9 июня 2016 года, нулями
x["2016-06-09/"] <- 0
# Проверяем, что значение в x для 11 июня 2016 года теперь равно 0
x["20160611"]
Нахождение первого или последнего периодов времени
Иногда вам нужно найти данные по относительному времени. Это легче сказать, чем вставить в код. Это эквивалентно запросу головы или хвоста ряда, но вместо использования абсолютного смещения вы описываете относительное положение во времени. Простым примером будет что-то вроде последних 3 недель ряда или первого дня текущего месяца.
К счастью, в xts есть необходимые предварительные условия, которые вы можете использовать при минимальном обучении. Использование функций first() и last() на самом деле довольно просто!
В этом упражнении вы извлечете относительные наблюдения из набора данных, называемого temps, временного ряда данных о летней температуре в Чикаго, Иллинойс, США.
Инструкции:
Создайте новую переменную lastweek, извлекая последнюю 1 неделю из temps.
Используя ваши вновь созданные данные, извлеките последние 2 наблюдения без учета времени.
Теперь извлеките каждый день из lastweek, кроме первых двух дней (это сложно!).
# Создаем lastweek, используя последнюю неделю из temps
lastweek <- last(temps, "1 week")
# Выводим два последних наблюдения в lastweek
last(lastweek, 2)
# Извлекаем все, кроме двух первых дней lastweek
first(lastweek, "-2 days")
Сочетание первого и последнего периодов
Теперь, когда вы увидели, как извлечь первый или последний фрагмент временного ряда с использованием естественного языка, вопрос лишь в том, чтобы научиться немного более сложным вещам.
В этом упражнении вы извлечете очень специфическое подмножество наблюдений, связав воедино несколько вызовов first() и last().
# Последние 3 дня первой недели
last(first(Temps, '1 week'), '3 days')
Вы перенастроите приведенный выше пример, используя временные данные из предыдущего упражнения. Хитрость в использовании такой сложной команды заключается в том, чтобы работать изнутри функции.
Инструкции:
Найдите первые три дня второй недели набора данных temps. Используйте для этого комбинации first() и last().
# Извлекаем первые три дня второй недели temps
first(last(first(temps, "2 weeks"), "1 week"), "3 days")
Матричная арифметика - сложение, вычитание, умножение и деление во времени!
Объекты xts уважают время. Когда вы выполняете какую-либо бинарную операцию, используя два объекта xts, эти объекты сначала подгоняются, используя пересечение индексов. Это может быть удивительно при первом знакомстве.
Причина этого заключается в том, что вы хотите сохранить аспект ваших данных на определенный момент времени, гарантируя, что вы не будете вносить случайное смещение в будущее (или в прошлое) в свои вычисления.
На практике это означает, что вам иногда будет необходимо управлять этим поведением, если вы хотите сохранить размерности ваших данных.
Возможные варианты включают:
Использование coredata() или as.numeric() (преобразуйте один из объектов в матрицу или вектор).
Сдвиг значения индекса вручную - то есть использование lag().
Переиндексация данных (до или после расчета).
В этом упражнении вы увидите обычное поведение, а также пример использования первой опции. Сейчас вы будете использовать два небольших объекта a и b. Изучите эти объекты в консоли, прежде чем начать.
Инструкции:
Сложите a и b. Обратите внимание на поведение дат, какие из них остаются? Сложите a с числовым значением b. b будет необходимо преобразовать в числовое значение, чтобы это сработало.
# Складываем a и b
a+b
# Складываем a с числовым значением b
a + as.numeric(b)
Математические операции с неперекрывающимися индексами
Предыдущее упражнение проиллюстрировало все тонкости выполнения базовой математики с объектами xts. На данный момент вы знаете, что xts уважает время и будет возвращать только пересечение времен при выполнении различных математических операций.
Мы ссылались на другой способ справиться с этим поведением в последнем упражнении. А именно, переиндексировать данные перед операцией. Это позволяет сохранить измерения ваших данных, используя тот же механизм, который xts использует внутри в своем собственном методе Ops (код, отправляемый при вызове + или аналогичных операций).
Третий способ заключается в изменении двух серий, гарантируя, что у вас есть какое-то объединение дат, которые вам требуются в конечном результате. Для этого вам понадобятся несколько функций, которые не будут подробно рассмотрены до главы 3, но очень полезны здесь.
merge(b, index(a))
Не беспокойтесь, если вы еще не знакомы с merge(). Это упражнение может быть проще, если вы просто будете следовать инструкциям.
Инструкции:
Используя a и b из предыдущего упражнения, получите значение a + b для каждой даты в a. Если на определенную дату нет b, ответ должен быть равен a на эту дату. Теперь прибавьте a к b, но на этот раз убедитесь, что все значения a добавлены к последнему известному значению b во времени.
# Прибавляем a к b, и заполняем все отсутствующие строки b нулями
a + merge(b, index(a), fill = 0)
# Прибавляем a к b и заполняем значения NA последними наблюдениями
a + merge(b, index(a), fill = na.locf)
Комментариев нет:
Отправить комментарий