web-dev-qa-db-ja.com

データフレームを時系列に変換する方法

1つの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

助けてください.. :)

26
Neil

Rには、時系列を再設定する複数の方法があります。毎日の株の価格で作業しているので、週末と休業日には金融市場が閉じているため、取引日とカレンダー日が同じではないことを考慮する必要があります。ただし、取引日と暦日の両方の観点から時系列を操作する必要がある場合があります。たとえば、日次リターンは、週末が介入するかどうかに関係なく、連続する日次終値から計算されます。ただし、週単位の価格概要など、カレンダーベースのレポートを作成することもできます。これらの理由により、Rの財務データにはZooの拡張であるxtsパッケージが一般的に使用されます。データでどのように使用できるかの例を次に示します。

例に示されているデータがデータフレーム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
19
WaltS

入力。質問は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"クラスシリーズは通常、日付インデックスを表しませんが、そうするZooシリーズを作成できます( Zooパッケージを参照 ):

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

または、これを既にデータフレームDFに読み込んでいる場合は、次の2行目に示すようにZooに変換できます。

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

上記のいずれの場合でも、z iaは"Date"クラス時間インデックスを持つZooシリーズです。また、時間インデックスとして1、2、3、...を使用するZooシリーズzzを作成することもできます。

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

ts。これらのいずれかを"ts"クラスシリーズに変換できます。

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

最初のものには、エポック(1970年1月1日)以降の日数である時間インデックスがあり、欠落している日にはNAがあり、2番目には時間インデックスとして1、2、3、...があり、NAはありません。

月次シリーズ。通常、"ts"シリーズは、月次、四半期、または年次のシリーズに使用されます。したがって、入力を月に集約する場合、"ts"シリーズとして合理的に表すことができます。

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

次の質問を参照してください。 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
2
ChuckCottrill

ライブラリfppを使用すると、日付形式time_ser=ts(data,frequency=4,start=c(1954,2))で時系列を簡単に作成できます。

ここでは、1954年の第2四半期から四半期の頻度で開始します。

1
louisv

パーティーに遅れましたが、 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>、データを他の時系列クラスに変換できます。

0
chris