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

пятница, 3 апреля 2020 г.

Работа с временными рядами в R с помощью пакетов xts и zoo. Часть 1. Введение в eXtensible Time Series

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

library(xts)
library(zoo)

1. Введение в eXtensible Time Series, использование xts и zoo для моделирования временных рядов

Что представляет собой объект xts?

В R есть много различных типов объектов. Каждый из них обладает различными функциями, и у каждого есть свое назначение. Некоторые классы наследуют поведение от своих родителей, что позволяет создавать собственные расширения для существующих и хорошо понятных объектов R. Это позволяет легко адаптировать существующий код к новым функциям.

Именно по этой причине xts расширяет популярный класс zoo. Зная это, и то, что вы видели до сих пор, какое из этих утверждений верно?

Возможные ответы:

Объекты xts внутри являются матричными объектами .
Объекты xts индексируются формальным объектом времени.
Большинство методов zoo работают для xts.
Все вышеперечисленное (верный).

Больше чем матрица

Лучше всего рассматривать объекты xts как нормальные матрицы R, но со специальными возможностями. Эти возможности позволяют вам манипулировать вашими данными как функцией времени, поскольку ваши данные теперь осознают, что они существуют во времени. Прежде чем мы сможем начать использовать эти возможности, будет полезно посмотреть, как объекты xts относятся к своим родственникам в базовых классах R.

В этом упражнении вы получите представление об xts и о том, как он ведет себя как матричный объект. Здесь уже предварительно загружены xts-объект ex_matrix и матрица core.

Инструкции: загрузите пакет xts, используя функцию library(). Посмотрите на структуру примера xts, называемого ex_matrix, используя функцию str(). Учитывая, что ex_matrix является матрицей, извлеките 3-е наблюдение из 2-го столбца. Теперь возьмите матрицу core и извлеките 3-е наблюдение из 2-го столбца. Обратите внимание на разницу.

# Загрузка xts
library(xts)

# Просмотр структуры ex_matrix
str(ex_matrix)

# Извлечение 3-го наблюдения во втором столбце ex_matrix
ex_matrix[3, 2]

# Извлечение 3-го наблюдения во втором столбце core 
core[3, 2]

Ваш первый объект xts 

Объекты xts просты. Думайте о них как о матрице наблюдений в сочетании с индексом соответствующих дат и времени.

xts = матрица + время. Главный конструктор xts принимает несколько аргументов, но два наиболее важных - x для данных и order.by для индекса. х должен быть вектором или матрицей, order.by - это вектор, который должен иметь ту же длину или количество строк, что и x, быть подходящим объектом времени или даты (очень важно!) и иметь возрастающий порядок.

xts также позволяет вам связывать произвольные атрибуты ключ-значение с вашими данными. Это позволяет хранить метаданные о вашем объекте внутри вашего объекта. Чтобы добавить их при создании, вы просто передаете дополнительные аргументы name = value в функцию xts().

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

Инструкции:
Создайте объект с именем data, который содержит пять случайных чисел, используя rnorm().
Создайте индекс класса Date, от «2016-01-01» длиной пять названных дат.
Используйте конструктор xts для создания объекта под названием smith, используя данные и даты в качестве индекса.
Создайте объект с именем bday, который содержит объект даты POSIXct, содержащий дату - «1899-05-08».
Создайте объект xts с именем hayek, используя данные, даты и новый атрибут born, который должен содержать только что созданный объект дня рождения.

# Создаем объект data из 5 случайных чисел
data <- rnorm(5)

# Создаем dates как объект класса Date, начинающийся с 2016-01-01
dates <- seq(as.Date("2016-01-01"), length = 5, by = "days")

# Используем xts() для создания smith
smith <- xts(x = data, order.by = dates)

# Создаем bday (1899-05-08), используя объект даты класса POSIXct
bday <- as.POSIXct("1899-05-08")

# Создаем hayek и добавляем новый атрибут born
hayek <- xts(x = data, order.by = dates, born = bday)

Декомпозиция xts

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

В основе xts и zoo лежит простая матрица R с несколькими дополнительными атрибутами. Наиболее важным из этих атрибутов является индекс. Индекс содержит всю информацию, необходимую нам, чтобы обрабатывать наши данные как временные ряды.

При работе с временными рядами иногда необходимо разделить ваш временной ряд на его основные данные и атрибуты индекса для дополнительного анализа и обработки. Основные данные - это матричная часть xts. Вы можете отделить ее от объекта xts, используя coredata(). Индексная часть объекта xts доступна с помощью функции index(). Обратите внимание, что обе эти функции являются методами из класса zoo, которого расширяет xts.

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

Инструкции:
Извлеките основные данные hayek с помощью coredata() и вызовите этот hayek_core.
Просмотрите класс hayek_core с помощью функции class().
Извлеките индекс даты из hayek, используя index(), и вызовите этот hayek_index.
Просмотрите класс hayek_index.

# Извлекаем основные данные hayek
hayek_core <- coredata(hayek)

# Выводим класс hayek_core
class(hayek_core)

# Извлекаем индекс hayek
hayek_index <- index(hayek)

# Выводим класс hayek_index
class(hayek_index)

Временные индексы

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

a <- xts(x = 1:2, as.Date(“2012-01-01”) + 0:1) 
a[index(a)] 

Мы подробнее рассмотрим выделение поднаборов объектов xts в следующей главе. На данный момент вы можете просто использовать объекты даты для индексирования соответствующих строк из вашего временного ряда. Вы можете думать об этом как об эффективном сопоставлении имен строк, которые вы видите в объекте. Это работает как ожидалось для временных объектов, потому что имена строк действительно являются датами!

Для этого упражнения вы создадите два временных ряда, используя два разных временных класса. Затем вы выберете подмножество каждого объекта, используя индекс другого объекта.

Инструкции:
Создайте объект из 5 дат, который будет называться dates, начиная с «2016-01-01».
Создайте временной ряд ts_a, используя числа от 1 до 5 в качестве ваших данных, а dates в качестве индекса - order.by.
Создайте временной ряд ts_b, используя числа от 1 до 5 в качестве ваших данных и те же даты, но - как объекты POSIXct.
Используйте индекс из ts_b, чтобы извлечь даты из ts_a. 
Теперь сделайте обратное, индексируя ts_b, используя времена из ts_a.

# Создаем dates
dates <- as.Date("2016-01-01") + 0:4

# Создаем ts_a
ts_a <- xts(x = 1:5, order.by = dates)

# Создаем ts_b
ts_b <- xts(x = 1:5, order.by = as.POSIXct(dates))

# Извлекаем строки из ts_a, используя индекс из of ts_b
ts_a[index(ts_b)]

# Извлекаем строки из ts_b, используя индекс из ts_a
ts_b[index(ts_a)]

Преобразование объектов xts

При работе с данными временных рядов в R часто бывает необходимо выполнить преобразование между классами. Преобразование может потребоваться по многим причинам, но обычно вам нужно использовать функцию, которая может не знать временных рядов, или вы можете захотеть использовать особый аспект xts с чем-то, что не обязательно должно быть полным временным рядом.

К счастью, конвертировать туда и обратно довольно просто, используя стандартную функциональность в стиле as.*, предоставляемую в R (например, as.POSIXct() или as.matrix ()).

xts предоставляет методы для преобразования всех основных объектов, с которыми вы можете столкнуться. Поддерживаются подходящие нативные типы R, такие как matrix, data.frame и ts, а также дополнительные типы, такие как timeSeries, fts и, конечно, zoo.as.xts() - это рабочая лошадка, которая выполняет преобразования в xts, и аналогичные функции обеспечивают обратное преобразование.

Чтобы получить представление о перемещении данных между классами, давайте попробуем несколько примеров, используя объект населения Австралии из R с именем austres.

Инструкции:
Преобразуйте набор данных austres класса ts  в xts и назовите его au. Затем преобразуйте новый объект au в матрицу am. Проверьте первые несколько записей этой новой матрицы с помощью функции head().
Преобразуйте оригинальный austres непосредственно в матрицу под названием am2. Теперь просмотрите первые несколько записей этой новой матрицы, используя ту же функцию. Заметьте, что в этот раз преобразование не сохранило информацию о времени?

# Конвертируем austres в объект xts с именем au
au <- as.xts(austres)

# Затем конвертируем объект xts (au) в матрицу am
am <- as.matrix(au)

# Проверяем первые строки am
head(am)

# Конвертируем austres в матрицу am2
am2 <- as.matrix(austres)

# Inspect the head of am2
head(am2)
> austres
        Qtr1    Qtr2    Qtr3    Qtr4
1971         13067.3 13130.5 13198.4
1972 13254.2 13303.7 13353.9 13409.3
1973 13459.2 13504.5 13552.6 13614.3
1974 13669.5 13722.6 13772.1 13832.0
1975 13862.6 13893.0 13926.8 13968.9
1976 14004.7 14033.1 14066.0 14110.1
1977 14155.6 14192.2 14231.7 14281.5
1978 14330.3 14359.3 14396.6 14430.8
1979 14478.4 14515.7 14554.9 14602.5
1980 14646.4 14695.4 14746.6 14807.4
1981 14874.4 14923.3 14988.7 15054.1
1982 15121.7 15184.2 15239.3 15288.9
1983 15346.2 15393.5 15439.0 15483.5
1984 15531.5 15579.4 15628.5 15677.3
1985 15736.7 15788.3 15839.7 15900.6
1986 15961.5 16018.3 16076.9 16139.0
1987 16203.0 16263.3 16327.9 16398.9
1988 16478.3 16538.2 16621.6 16697.0
1989 16777.2 16833.1 16891.6 16956.8
1990 17026.3 17085.4 17106.9 17169.4
1991 17239.4 17292.0 17354.2 17414.2
1992 17447.3 17482.6 17526.0 17568.7
1993 17627.1 17661.5

austres <- read.delim("clipboard")
# austres <- as.ts(austres)
austres

Импорт данных

Теперь вы можете конвертировать данные в xts, используя as.xts(). Однако в большинстве реальных приложений вам часто нужно читать необработанные данные из файлов на диске или в Интернете. Это может быть сложно, не зная правильных команд.

В первой части этого упражнения вы начнете с чтения файла csv с диска, используя read.csv из base-R. После того, как вы прочитаете данные, следующим шагом будет преобразование их в xts. Здесь вам потребуется использовать конструктор xts(), а также заняться преобразованием нестандартных дат в то, что понимает xts.

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

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

a,b 1/02/2015, 1, 3 2/03/2015, 2, 4

Инструкции:
Считайте данные из tmp_file, используя read.csv(), в новую переменную с именем dat.
Преобразуйте данные в объект xts с помощью конструктора xts(). Используйте as.Date() с rownames(dat) - в качестве первого аргумента.
Создайте dat_zoo, используя read.zoo() для чтения из того же файла tmp_file, и задайте формат аргумента - «%m/%d/%Y».
Создайте dat_xts, преобразовав dat_zoo в xts, используя as.xts().

tmp_file <- "http://s3.amazonaws.com/assets.datacamp.com/production/course_1127/datasets/tmp_file.csv"
# Создаем dat, считывая tmp_file
dat <- span=""> read.csv(tmp_file)

# Конвертируем dat в формат xts
xts(dat, order.by = as.Date(rownames(dat), "%m/%d/%Y"))

# Читаем tmp_file, используя read.zoo
dat_zoo <- span=""> read.zoo(tmp_file, index.column = 0, sep = ",", format = "%m/%d/%Y")

# Конвертируем dat_zoo в формат xts
dat_xts <- span=""> as.xts(dat_zoo)

Экспорт объектов xts

Теперь, когда вы можете читать необработанные данные в объекты xts и zoo, вполне естественно, что вы научитесь обратному процессу.

Существует два основных варианта использования объектов xts. Во-первых, вам может потребоваться, чтобы объект сохранялся между сеансами для использования в последующем анализе. В этом случае почти всегда лучше использовать saveRDS() и readRDS() для сериализации отдельных объектов R.

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

Один из лучших способов записать объект xts из R - это использовать функцию zoo write.zoo(). В этом упражнении вы возьмете свои временные данные и запишите их на диск с помощью write.zoo().

Инструкции:
Преобразуйте sunspots в xts и сохраните его как sunspots_xts. Временное имя файла будет загружено.
Используя write.zoo(), сохраните данные sunspots_xts в файл tmp.
Считайте файл tmp обратно в R, используя read.zoo(). Назови его sun.
Конвертируйте sun в xts, используя функцию as.xts(). Назовите его sun_xts.

data(sunspots)
class(sunspots)

# Конвертируем sunspots в формат xts с помощью as.xts().
sunspots_xts <- as.xts(sunspots)

# Получаем имя временного файла
tmp <- tempfile()

# Записываем объект xts, используя zoo для tmp 
write.zoo(sunspots_xts, sep = ",", file = tmp)

# Читаем файл tmp. FUN = as.yearmon конвертирует строки, такие как Jan 1749, в соответствующий класс времени
sun <- read.zoo(tmp, sep = ",", FUN = as.yearmon)

# Конвертируем sun в xts. Сохраняем как sun_xts
sun_xts <- as.xts(sun)

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

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