2015-03-14 2 views
11

У меня есть один файл CSV, в котором у меня есть 2 цены закрытия акций (ежедневно)как преобразовать фрейм данных в временных рядов в R

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 

пожалуйста, помогите .. :)

ответ

8

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

Предполагая, что данные, приведенные в вашем примере в dataframe ФР

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 
+0

Спасибо тонну :) это сработало как шарм .. – Neil

+0

@ WaltS Я не получил to.weekly (акции $ Hero_close, name = "Hero ") – Neil

+0

Для этого вам понадобится библиотека операторов (xts). – WaltS

10

Вход. Начнем с текстом входа, показанного в этом вопросе, так как вопрос не предусматривает ввод в формате 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 package):

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 Ia ряд зоопарка с временным индексом в "Date" класса. Можно было бы также создать ряд зоопарк, zz, который использует 1, 2, 3, ..., как индекс времени:

zz <- z 
time(zz) <- 1:nrow(zz) 

ц. Любой из них может быть преобразован в "ts" класса серии: с

as.ts(z) 
as.ts(zz) 

Первый имеет индекс времени, который является количество дней с начала эпохи (1 января 1970 года) и будет иметь Nas пропавших суток, второй будет иметь 1, 2, 3, ... как индекс времени и не NA.

Ежемесячные серии. Обычно серии "ts" используются для ежемесячной, ежеквартальной или годовой серии. Таким образом, если бы мы были агрегировать вход в месяцы, мы могли бы разумно представить его в виде серии "ts":

z.m <- as.zooreg(aggregate(z, as.yearmon, mean), freq = 12) 
as.ts(z.m) 
+0

@ G. Grothendieck Спасибо за ваш rpl .. :) попробуем ваше решение – Neil

1

С библиотекой fpp, вы можете легко создавать временные ряды с форматом даты: time_ser=ts(data,frequency=4,start=c(1954,2))

здесь мы начинаем со 2-го квартала 1954 года с четвертой частотой.

Смежные вопросы