【问题标题】:R - create Stock data from data frame with begin and end date [closed]R - 从具有开始和结束日期的数据框创建股票数据[关闭]
【发布时间】:2014-06-23 08:23:31
【问题描述】:

我需要从数据框创建股票数据。数据框包含开始日期和结束日期,表示项目的库存期间。我想汇总每个项目的库存水平,然后使用数据创建一个时间序列。

我有以下形式的数据:

A <- c("a","b","a","b","c")
begindate <- as.Date(c("2014-01-01", "2014-01-03", "2014-01-03", "2014-01-02", "2014-01-02"))
enddate <- as.Date(c("2014-01-04", "2014-01-05", "2014-01-06", "2014-01-04", "2014-01-06"))
source <- data.frame(A, begindate, enddate)
source
  A  begindate    enddate
1 a 2014-01-01 2014-01-04
2 b 2014-01-03 2014-01-05
3 a 2014-01-03 2014-01-06
4 b 2014-01-02 2014-01-04
5 c 2014-01-02 2014-01-06

我想从这些数据中创建一个时间序列,例如

    2014-01-01  2014-01-02  2014-01-03  2014-01-04  2014-01-05  2014-01-06
a   1   1   2   2   1   1
b       1   2   2   1   
c       1   1   1   1   1

原始数据相当大,大约 180k 行。什么是有效的方法?

编辑

David Arenburg 给出的答案效果很好

library(data.table)
library(reshape2)
setDT(mydata)[, indx := .I]
mydata <- mydata[, list(A = A, seq(begindate, enddate, by = 1)), by = indx]

但对于我的数据来说,它相当慢。添加中间步骤显着加快了铸造操作。

# intermediate step (pre-aggregation)
mydata_aggregated <- mydata[, list(number_cases = length(indx)), by = list(A, V2)]
# casting over the aggregated list
mydata_series <- dcast(mydata_aggregated, V2 ~ A, value.var = "number_cases") # note
# that I switched the rows and columns, since I found that its easier to pass this
# data to zoo or xts

# creating the zoo object
mydata_zoo <- zoo(mydata_series[,-1],mydata_series[,1])

【问题讨论】:

  • 我对 R 中的时间序列相当陌生。我尝试创建 seq(begindate, enddate) 对象,但我不知道如何聚合它们,因为它们都有不同的开始和结束日期。
  • 这个问题不是太宽泛,很清楚他在问什么。所以没有必要因为这两个原因关闭它
  • 问题解决了,可以这样标记吗?
  • 不需要。当您接受答案时,这意味着它已解决

标签: r dataframe time-series stocks


【解决方案1】:

如果你的数据集很大,我会使用data.table

library(data.table)
library(reshape2)
setDT(source)[, indx := .I]
source <- source[, list(A = A, seq.int(begindate, enddate, by = 1)), by = indx]
dcast.data.table(source, A ~ V2, value.var = "V2", length)

##  A 2014-01-01 2014-01-02 2014-01-03 2014-01-04 2014-01-05 2014-01-06
##1 a          1          1          2          2          1          1
##2 b          0          1          2          2          1          0
##3 c          0          1          1          1          1          1

请注意,source 是 R 中的存储函数,因此请尝试为您的数据集使用其他名称

【讨论】:

  • 谢谢!这正是我想要的!
  • 该解决方案似乎有效 - 似乎是因为该过程已运行大约 2 小时,但仍未完成计算。我的原始数据有大约 18k 不同的索引(由 list 函数创建的中间表有 600 万行长)。
  • 我知道 R 可以处理多变量时间序列格式。 xts 和 zoo 能够处理多变量时间序列,但它们要求每行数据具有相同的日期(我要求的矩阵的转置版本)。有没有更有效的方法来创建时间序列对象,而不需要中间矩阵?数据有约 18k 的唯一索引,集中形式有近 75k 观察。所需的日期范围至少为一年,包含每日数据。您知道处理此计算的更有效方法吗?还是没有办法绕过中间矩阵?
  • 我不确定我是否理解您的问题。矩阵和列表通常是在 R 中处理数据的最快方法(与数据框相比)。
  • 我想从原始数据框中获取时间序列对象,但据我所知,生成序列的函数(xts 或 zoo)需要特定的输入格式。使用 dcast 运算符构建中间矩阵需要相当长的时间。我想知道是否有更快的方法从原始数据框中获取时间序列对象。
猜你喜欢
  • 1970-01-01
  • 2018-12-02
  • 2021-06-26
  • 1970-01-01
  • 2019-12-11
  • 2021-05-15
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
相关资源
最近更新 更多