рекомендации

воскресенье, 5 апреля 2020 г.

Работа с временными рядами в R с помощью пакетов xts и zoo. Часть 2. Базовые операции с объектами xts.

Перевод. Оригинал: Manipulating Time Series Data in R with xts & zoo

Часть 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)

Комментариев нет:

Отправить комментарий