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

понедельник, 13 апреля 2020 г.

Работа с временными рядами в R с помощью пакетов xts и zoo. Часть 5. Дополнительные возможности xts

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

Часть 5. Дополнительные возможности xts

Первая часть
Вторая часть

Третья часть
Четвертая часть

Атрибуты класса - tclass, tzone, и tformat

Объекты xts несколько сложнее, когда дело доходит до времени. Мы теперь увидели, что атрибут index внутренне на самом деле представляет собой вектор числовых значений, соответствующих секундам, прошедшим с эпохи UNIX (1970-01-01).

То, как эти значения отображаются при печати и как они возвращаются пользователю при использовании функции index(), зависит от нескольких ключевых внутренних атрибутов.
Информация, которая управляет этим поведением, может быть просмотрена и даже изменена с помощью набора функций доступа, описанных здесь:

Класс index использует indexClass() (например, от Date до chron). Часовой пояс использует indexTZ() (например, от America/Chicago до Europe/London). Формат времени отображается с помощью indexFormat() (например, YYYY-MM-DD) В этом упражнении вы будете практиковать использование каждой из этих функций и просматривать результаты своих изменений. Для этого вы снова будете использовать данные temps, предварительно загруженные в ваше рабочее пространство.

Инструкции:
Просмотрите первые три строки индекса в текущих данных temps. Найдите класс index из temps. Найдите часовой пояс temps. Измените формат индекса temps на “%b-%d-%Y”. Просмотрите новый формат индекса, используя head().


# Просматриваем первые три индекса temps
index(temps)[1:3]

# Получаем класс индекса temps
indexClass(temps)

# Получаем часовой пояс temps
indexTZ(temps)

# Изменяем выводимый формат времени
indexFormat(temps) <- "%b-%d-%Y"

# Просматриваем новый формат
head(temps)

Часовые пояса (и почему вы должны заботиться о них!)

Одна из самых сложных частей при работе с временными рядами в целом - это работа с часовыми поясами. XTS предоставляет простой способ использовать часовые пояса для любого ряда. Хотя R обеспечивает поддержку часовых поясов в собственных классах POSIXct и POSIXlt, xts расширяет эту мощь для всего объекта, позволяя вам иметь несколько часовых поясов для разных объектов.

Некоторые внутренние функции операционной системы требуют часового пояса для вычисления даты. Если часовой пояс явно не установлен, он будет выбран за вас! Будьте внимательны, всегда устанавливайте часовой пояс в вашей среде, чтобы избежать ошибок при работе с датами и временем.

xts предоставляет функцию tzone(), которая позволяет считывать или устанавливать часовые пояса.

tzone(x) = “Time_Zone” 

В этом упражнении вы будете работать с объектом под названием times, чтобы попрактиковаться в создании ваших собственных объектов xts с пользовательскими часовыми поясами.

Инструкции:
Создайте временной ряд xts из чисел от 1 до 10, с именем times_xts, с часовым поясом, установленным в «America/Chicago», и индексированный по объекту times.
Измените times_xts, чтобы показать время в «Asia/Hong_Kong».
Извлеките текущий часовой пояс в виде строки.


# Создаем times_xts с tzone, установленным в America/Chicago
times_xts <- xts(1:10, order.by = times, tzone = "America/Chicago")

# Изменяем часовой пояс times_xts на Asia/Hong_Kong
tzone(times_xts) <- "Asia/Hong_Kong"
  
# Извлекаем текущий часовой пояс times_xts
indexTZ(times_xts)

Определение периодичности

Идея периодичности довольно проста: с какой регулярностью повторяются ваши данные? Для данных по фондовому рынку у вас могут быть часовые цены или, возможно, ежедневные бары открытия-максимума-минимума закрытия. Для макроэкономических рядов это могут быть ежемесячные или еженедельные данные.

xts предоставляет удобный инструмент для выявления этой закономерности в ваших данных путем оценки частоты наблюдений - то, что мы называем периодичностью - с помощью команды periodity().

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

Инструкции:
Рассчитайте периодичность набора данных temps.
Рассчитайте периодичность набора данных edhec.
Преобразуйте периодичность edhec в годовую, используя to.yearly(). Назовите результат edhec_yearly.
Рассчитайте периодичность edhec_yearly.


# Рассчитываем периодичность temps
periodicity(temps)

# Рассчитываем периодичность edhec
periodicity(edhec)

# Конвертируем периодичность edhec в годовую
edhec_yearly <- to.yearly(edhec)

# Рассчитываем периодичность edhec_yearly
periodicity(edhec_yearly)

Команда periodity() в сочетании с набором команд to.period() дает вам простой способ манипулировать данными временных рядов.

Нахождение количества периодов в ваших данных

Часто бывает полезно узнать не только диапазон индекса временных рядов, но и количество дискретных нерегулярных периодов, охватываемых данными временного ряда. Вы не должны удивляться, узнав, что xts предоставляет набор функций для этого!

Если у вас есть временной ряд, легко увидеть, сколько дней, недель или лет содержат ваши данные. Для этого просто используйте функцию ndays() и ее функции быстрого вызова nmonths(), nquarters() и т. д., чтобы упростить подсчет нерегулярных периодов.

Инструкции:
Рассчитайте количество месяцев в edhec.
Рассчитайте количество кварталов в edhec.
Рассчитайте количество лет в edhec.


# Количество месяцев
nmonths(edhec)

# Количество кварталов
nquarters(edhec)

# Количество лет
nyears(edhec)

Секретные инструменты для работы с индексом

xts использует очень специальный атрибут, называемый index, для обеспечения временной поддержки ваших объектов. Индекс хранится особым образом. Это означает, что независимо от класса вашего индекса (например, Date или yearmon) внутренне все выглядит одинаково для xts. Необработанный индекс на самом деле представляет собой простой вектор секунд со времени UNIX.

Обычно вы хотите получить доступ к времени, которое вы сохранили. index() делает это волшебным образом, используя ваш indexClass. Чтобы получить необработанный вектор индекса, вы можете использовать .index(). Обратите внимание на критическую точку перед именем функции.

Более полезным, чем извлечение необработанных секунд, является возможность извлекать компоненты времени, аналогичные классу POSIXlt, который близко отражает базовую внутреннюю скомпилированную структуру POSIX tm. Эта функциональность обеспечивается несколькими командами, такими как .indexday(), .indexmon(), .indexyear() и другими.

В этом упражнении вы посмотрите погоду на выходных в наших предварительно загруженных данных temps с помощью команды .indexwday(). Обратите внимание, что значения варьируются от 0 до 6, а воскресенье равно 0. Вспомните, что вы можете использовать логический вектор для извлечения элементов объекта xts.

Инструкции:
Потренируйтесь в извлечении базовых единиц вашего индекса из данных temps. Используйте .index(), чтобы увидеть количество секунд, и .indexwday(), чтобы увидеть день недели ваших наблюдений.
Создайте индекс с помощью функции which() для извлечения наблюдений за выходные в temps.
Выберите индексированные значения из temps.


# Извлечение базовых единиц temps с помощью двух команд: .index() и .indexwday()
.index(temps)
.indexwday(temps)


# Создаем индекс выходных дней, используя which()
index <- which(.indexwday(temps) == 0 | .indexwday(temps) == 6)

# Выбираем индекс
temps[index]

Изменение временных меток

Большинство временных рядов, которые мы видели, были ежедневными или с более низкой частотой. В зависимости от области вашей работы вы можете столкнуться с более частыми данными - например, с внутридневными интервалами торговли или с данными из медицинского оборудования.

Для этих ситуаций в xts есть две функции, которые нужно знать.

Если вы обнаружите, что у вас есть наблюдения с одинаковыми временными метками, может быть полезно изменить или удалять эти времена, чтобы обеспечить уникальность. xts предоставляет функцию make.index.unique() именно для этой цели. Аргумент eps, сокращение от «epsilon» или «небольшое изменение», определяет, сколько одинаковых времен должно быть изменено, а drop = TRUE позволяет полностью удалить дублирующиеся наблюдения.

В других случаях вы можете найти свои временные метки слишком точными. В этих случаях может быть лучше округлить их до некоторого фиксированного интервала, например, наблюдение может происходить в любой точке часа, но вы хотите записать самое позднее наблюдение на начало следующего часа. В этой ситуации команда align.time() сделает то, что вам нужно, задайте аргумент n равным количеству секунд, к которому вы хотите округлить результат.

make.index.unique(x, eps = 1e-4) 
# Изменить make.index.unique(x, drop = TRUE) 
# Убрать дубликаты align.time(x, n = 60) 
# Округление до минуты. В этом упражнении вы попробуете три варианта использования для объекта xts с именем z.

Инструкции:
Преобразуйте времена ряда z в уникальные, используя make.index.unique(), где eps = 1e-4. Сохраните результат в z_unique.
Удалите повторяющиеся времена в z. Сохраните результат в z_dup.
Округлите z с точностью до часа, используя align.time(). Сохраните результат в z_round.


# Сделайте временные метки z уникальными
z_unique <- make.index.unique(z, eps = 1e-4)

# Удалите дублирующиеся times in z
z_dup <- make.index.unique(z, drop = TRUE)

# Округлите наблюдения в z до следующего часа
z_round <- align.time(z, n = 3600)

Эти заключительные команды должны дать вам полный набор инструментов для управления данными временных рядов в R.

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

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