Как преобразовать фрейм данных во временные ряды?

У меня есть один файл 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'

Пожалуйста, помогите на лучший способ его преобразования. Благодарю.