web-dev-qa-db-fra.com

comment convertir une trame de données en série chronologique en R

J'ai un fichier csv dans lequel j'ai 2 cours de clôture du stock (sur une base quotidienne)

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

Je veux convertir les données ci-dessus en format de série chronologique. (la date de début est 3/14/2013 et la date de fin est 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)

La sortie est:

           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

s'il vous plaît aider .. :)

22
Neil

R a plusieurs façons de représenter des séries chronologiques. Étant donné que vous travaillez avec les cours quotidiens des actions, vous voudrez peut-être considérer que les marchés financiers sont fermés les week-ends et les jours fériés, de sorte que les jours de négociation et les jours civils ne sont pas identiques. Cependant, vous devrez peut-être utiliser vos séries chronologiques en termes de jours de négociation et de jours calendaires. Par exemple, les rendements quotidiens sont calculés à partir des cours de clôture quotidiens séquentiels, qu'un week-end intervienne ou non. Cependant, vous pouvez également créer des rapports basés sur un calendrier, tels que des récapitulatifs de prix hebdomadaires. Pour ces raisons, le paquet xts, une extension de Zoo, est couramment utilisé avec des données financières en R. Un exemple de la façon dont il pourrait être utilisé avec vos données est présenté ci-après. 

En supposant que les données montrées dans votre exemple se trouvent dans le 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")

ce qui donne la sortie

           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
16
WaltS

Contribution. Nous allons commencer par le texte de l'entrée indiqué dans la question, car celle-ci ne fournissait pas l'entrée 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"

Zoo."ts" Les séries de classes ne représentent normalement pas les index de date, mais nous pouvons créer une série de zoo (voir Package Zoo ):

library(Zoo)
z <- read.Zoo(text = Lines, header = TRUE, format = "%m/%d/%Y")

Sinon, si vous avez déjà lu ceci dans un cadre de données DF, il pourrait alors être converti en Zoo, comme indiqué sur la deuxième ligne ci-dessous:

DF <- read.table(text = Lines, header = TRUE)
z <- read.Zoo(DF, format = "%m/%d/%Y")

Dans les deux cas ci-dessus, z est une série de Zoo avec un index de classe "Date". On pourrait aussi créer la série Zoo, zz, qui utilise 1, 2, 3, ... comme index de temps:

zz <- z
time(zz) <- seq_along(time(zz))

ts. L'un ou l'autre de ceux-ci peut être converti en une série de classes "ts":

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

Le premier a un index de temps qui correspond au nombre de jours écoulés depuis l’époque (le 1er janvier 1970) et aura des NA pour les jours manquants et le second aura 1, 2, 3, ... comme index de temps et aucun NA.

Séries mensuelles. Les séries "ts" sont généralement utilisées pour les séries mensuelles, trimestrielles ou annuelles. Ainsi, si nous agrégions les données en mois, nous pourrions raisonnablement les représenter sous la forme d'une série "ts":

z.m <- as.zooreg(aggregate(z, as.yearmon, mean), freq = 12)
as.ts(z.m)
13
G. Grothendieck

Voir cette question: La conversion de data.frame en xts order.by nécessite un objet temporel approprié , qui suggère de regarder l’argument de order.by,

Les classes actuellement acceptables comprennent: ‘Date’, ‘POSIXct’, ‘timeDate’, ainsi que «yearmon» et «yearqtr» où les valeurs de l’indice demeurent unique.

Et suggère en outre une conversion explicite en utilisant order.by = as.POSIXct,

df$Date <- as.POSIXct(strptime(df$Date,format),tz="UTC")
xts(df[, -1], order.by=as.POSIXct(df$Date))

Où votre format est assigné ailleurs,

format <- "%m/%d/%Y" #see strptime for details
1
ChuckCottrill