Как преобразовать фрейм данных во временные ряды?
У меня есть один файл csv, в котором у меня есть 2 цены закрытия акций (на ежедневной основе)
Dates Bajaj_close Hero_close
3/14/2013 1854.8 1669.1
3/15/2013 1850.3 1684.45
3/18/2013 1812.1 1690.5
3/19/2013 1835.9 1645.6
3/20/2013 1840 1651.15
3/21/2013 1755.3 1623.3
3/22/2013 1820.65 1659.6
3/25/2013 1802.5 1617.7
3/26/2013 1801.25 1571.85
3/28/2013 1799.55 1542
Я хочу преобразовать выше данные в формат временных рядов. (дата начала 3/14/2013
и дата окончания 3/13/2015
) Я пробовал это, но это дало мне какой-то странный вывод
values <- bajaj_hero[, -1] (excluded first column i.e date in real dataset)
bajaj_hero_timeseries <- ts(values,start=c(2013,1),end=c(2015,3),frequency=365)
Выход:
Bajaj_close Hero_close
2013.000 1854.80 1669.10
2013.003 1850.30 1684.45
2013.005 1812.10 1690.50
2013.008 1835.90 1645.60
2013.011 1840.00 1651.15
2013.014 1755.30 1623.30
2013.016 1820.65 1659.60
2013.019 1802.50 1617.70
2013.022 1801.25 1571.85
пожалуйста, помогите..:)
Ответы
Ответ 1
R имеет несколько способов представления временных рядов. Поскольку вы работаете с ежедневными ценами на акции, вы можете подумать, что финансовые рынки закрыты в выходные и праздничные дни, так что торговые дни и календарные дни не совпадают. Однако вам может понадобиться работать с вашей временной серией как по торговым дням, так и по календарным дням. Например, ежедневная доходность рассчитывается из последовательных ежедневных цен закрытия независимо от того, вмешивается ли выходное. Но вы также можете делать календарные отчеты, такие как еженедельные сводки цен. По этим причинам пакет xts, расширение зоопарка, обычно используется с финансовыми данными в R. Ниже приведен пример того, как он может использоваться с вашими данными.
Предполагая, что данные, показанные в вашем примере, находятся в dataframe df
library(xts)
stocks <- xts(df[,-1], order.by=as.Date(df[,1], "%m/%d/%Y"))
#
# daily returns
#
returns <- diff(stocks, arithmetic=FALSE ) - 1
#
# weekly open, high, low, close reports
#
to.weekly(stocks$Hero_close, name="Hero")
который дает выход
Hero.Open Hero.High Hero.Low Hero.Close
2013-03-15 1669.1 1684.45 1669.1 1684.45
2013-03-22 1690.5 1690.50 1623.3 1659.60
2013-03-28 1617.7 1617.70 1542.0 1542.00
Ответ 2
Ввод. Мы начнем с текста ввода, показанного в вопросе, так как вопрос не предоставил ввод csv:
Lines <- "Dates Bajaj_close Hero_close
3/14/2013 1854.8 1669.1
3/15/2013 1850.3 1684.45
3/18/2013 1812.1 1690.5
3/19/2013 1835.9 1645.6
3/20/2013 1840 1651.15
3/21/2013 1755.3 1623.3
3/22/2013 1820.65 1659.6
3/25/2013 1802.5 1617.7
3/26/2013 1801.25 1571.85
3/28/2013 1799.55 1542"
зоопарк. Серии классов "ts"
обычно не представляют индексы дат, но мы можем создать серию зоопарков, которая это делает (см. пакет zoo):
library(zoo)
z <- read.zoo(text = Lines, header = TRUE, format = "%m/%d/%Y")
С другой стороны, если вы уже прочитали это в DF
фрейма данных, его можно преобразовать в зоопарк, как показано во второй строке ниже:
DF <- read.table(text = Lines, header = TRUE)
z <- read.zoo(DF, format = "%m/%d/%Y")
В любом случае выше z
za серия зоопарка с указателем времени класса "Date"
. Можно также создать серию зоопарков zz
, которая использует 1, 2, 3,... в качестве индекса времени:
zz <- z
time(zz) <- seq_along(time(zz))
ц. Любой из них может быть преобразован в серию классов "ts"
:
as.ts(z)
as.ts(zz)
Первый имеет временной индекс, который представляет собой количество дней с начала эпохи (1 января 1970 года), и будет иметь NA для пропущенных дней, а второй будет иметь 1, 2, 3,... в качестве временного индекса и не будет иметь NA.
Ежемесячные серии. Обычно серии "ts"
используются для ежемесячных, квартальных или годовых серий. Таким образом, если бы мы собирали входные данные в месяцы, мы могли бы разумно представить их в виде ряда "ts"
:
z.m <- as.zooreg(aggregate(z, as.yearmon, mean), freq = 12)
as.ts(z.m)
Ответ 3
Посмотрите на этот вопрос: для преобразования data.frame в xts order.by требуется соответствующий основанный на времени объект, который предлагает рассмотреть аргумент для order.by,
В настоящее время приемлемые классы включают: Date, POSIXct, timeDate, а также yearmon и yearqtr, где значения индекса остаются уникальными.
И далее предлагает явное преобразование с использованием order.by = as.POSIXct,
df$Date <- as.POSIXct(strptime(df$Date,format),tz="UTC")
xts(df[, -1], order.by=as.POSIXct(df$Date))
Где ваш формат назначен здесь,
format <- "%m/%d/%Y" #see strptime for details
Ответ 4
Поздно, но пакет tsbox предназначен для таких преобразований. Чтобы преобразовать ваши данные в ts
-object, вы можете сделать:
dta <- data.frame(
Dates = c("3/14/2013", "3/15/2013", "3/18/2013", "3/19/2013"),
Bajaj_close = c(1854.8, 1850.3, 1812.1, 1835.9),
Hero_close = c(1669.1, 1684.45, 1690.5, 1645.6)
)
dta
#> Dates Bajaj_close Hero_close
#> 1 3/14/2013 1854.8 1669.10
#> 2 3/15/2013 1850.3 1684.45
#> 3 3/18/2013 1812.1 1690.50
#> 4 3/19/2013 1835.9 1645.60
library(tsbox)
ts_ts(ts_long(dta))
#> Time Series:
#> Start = 2013.1971293045
#> End = 2013.21081883954
#> Frequency = 365.2425
#> Bajaj_close Hero_close
#> 2013.197 1854.8 1669.10
#> 2013.200 1850.3 1684.45
#> 2013.203 NA NA
#> 2013.205 NA NA
#> 2013.208 1812.1 1690.50
#> 2013.211 1835.9 1645.60
Он автоматически анализирует даты, определяет частоту и делает пропущенные значения в выходные дни явными. С помощью ts_<class>
вы можете преобразовать данные в любой другой класс временных рядов.
Ответ 5
С библиотекой fpp
вы можете легко создавать временные ряды с форматом даты: time_ser=ts(data,frequency=4,start=c(1954,2))
здесь мы начинаем со второго квартала 1954 года с четвертой частотой.
Ответ 6
У меня есть структура данных следующим образом:
str(data)
Classes ‘tbl_df, ‘tbl and 'data.frame': 479 obs. of 2 variables:
$ Month : POSIXct, format: "1979-01-01" "1979-02-01" "1979-03-01" "1979-04-01" ...
$ Inflation: num 0.0258 0.0234 0.0055 0.0302 0.0305 0.0232 0.025 0.0234 0.0074 0.0089 ...
Хотя он выдал ошибку, когда я попытался преобразовать его во временные ряды:
> z <- read.zoo(data, header = TRUE, format = "%m-%d-%Y")
Error in read.zoo(data, header = TRUE, format = "%m-%d-%Y") :
index has 479 bad entries at data rows: 1 2 3 4 5 6
> data1 <- xts(data[,-1], order.by=as.Date(df[,1], "%m/%d/%Y"))
Error in xts(data[, -1], order.by = as.Date(df[, 1], "%m/%d/%Y")) :
'order.by' cannot contain 'NA', 'NaN', or 'Inf'
Пожалуйста, помогите на лучший способ его преобразования. Благодарю.