【问题标题】:RBbg - Reshaping Time Series DataRBbg - 重塑时间序列数据
【发布时间】:2013-12-01 00:08:23
【问题描述】:

有没有更好的方法来重塑数据框数据?

temp <- bdh(conn,c("AUDUSD Curncy","EURUSD Curncy"),"PX_LAST","20110101")

给予

head(temp)
         ticker       date PX_LAST
1 AUDUSD Curncy 2011-01-01      NA
2 AUDUSD Curncy 2011-01-02      NA
3 AUDUSD Curncy 2011-01-03  1.0205
4 AUDUSD Curncy 2011-01-04  1.0040
5 AUDUSD Curncy 2011-01-05  1.0014
6 AUDUSD Curncy 2011-01-06  0.9969

tail(temp)
            ticker       date PX_LAST
2127 EURUSD Curncy 2013-11-26  1.3557
2128 EURUSD Curncy 2013-11-27  1.3570
2129 EURUSD Curncy 2013-11-28  1.3596
2130 EURUSD Curncy 2013-11-29  1.3591
2131 EURUSD Curncy 2013-11-30      NA
2132 EURUSD Curncy 2013-12-01      NA

换句话说,数据只是垂直连接在一起,需要进一步处理才能使它们正常工作。我怎样才能将这些数据重新组合到各种代码中,即

head(temp)
           AUDUSD.Curncy EURUSD.Curncy
2011-01-01            NA            NA
2011-01-02            NA            NA
2011-01-03        1.0205        1.3375
2011-01-04        1.0040        1.3315
2011-01-05        1.0014        1.3183
2011-01-06        0.9969        1.3028

我在谷歌上搜索的所有重塑问题都没有我想要的那种重塑。我已经实现了下面给出的自己的零碎解决方案,但为了学习,我想问你们是否有更优雅的解决方案?

【问题讨论】:

  • 请通过dput 提供相关的小数据样本,让人们更容易帮助您。见here how to easily create a minimal, reproducible example
  • 谢谢,会的。不知道这存在。
  • dput 对于像上面这样的数据特别有用,在这些数据中,列之间和列内都有空格分隔符。这就是为什么我不得不删除“Curncy”部分。在同一页面上,您还可以找到 reproduce,当您 - 是 - 为 SO 问题“复制”您的数据时,它可以为您提供更多控制。干杯。

标签: r time-series reshape


【解决方案1】:

你可以试试read.zoo。使用index.column 指定存储在哪个列索引/时间,并根据splitcolumnn 重塑数据。结果是zoo 时间序列

library(zoo)

z <- read.zoo(text = "ticker     date PX_LAST
1 AUDUSD 2011-01-01      NA
2 AUDUSD  2011-01-02      NA
3 AUDUSD 2011-01-03  1.0205
4 AUDUSD 2011-01-04  1.0040
5 AUDUSD  2011-01-05  1.0014
6 AUDUSD 2011-01-06  0.9969
2127 EURUSD  2013-11-26  1.3557
2128 EURUSD  2013-11-27  1.3570
2129 EURUSD  2013-11-28  1.3596
2130 EURUSD  2013-11-29  1.3591
2131 EURUSD  2013-11-30      NA
2132 EURUSD  2013-12-01      NA", index.column = "date", split = "ticker")

z
#            AUDUSD EURUSD
# 2011-01-01     NA     NA
# 2011-01-02     NA     NA
# 2011-01-03 1.0205     NA
# 2011-01-04 1.0040     NA
# 2011-01-05 1.0014     NA
# 2011-01-06 0.9969     NA
# 2013-11-26     NA 1.3557
# 2013-11-27     NA 1.3570
# 2013-11-28     NA 1.3596
# 2013-11-29     NA 1.3591
# 2013-11-30     NA     NA
# 2013-12-01     NA     NA

str(z)

【讨论】:

  • 非常感谢,这正是我想要的,一个优雅的解决方案。
  • 很高兴听到您发现我的回答很有帮助。是的,read.zoo 是一个非常通用的函数。查看zoo 小插曲(例如browseVignettes("zoo")),除了“普通”帮助文本之外还有很多好东西。一种专门用于读取各种形式的数据。祝你好运!
【解决方案2】:

这正是我们创建 RbbgExtension 包的原因。它是 Rbbg 包的包装器,可在处理财务数据时处理许多问题——我们在日常工作中遇到的问题,例如金融机构的回测交易策略等。

如您所见,输出是一个 xts 对象,但如果查询涉及多个代码和多个字段,则输出将是一个数组 - 但您可以在文档中了解原因。

我们已将软件包开源并在 GitHub 上公开提供。只需使用 Hadley 的 devtools 函数 install_github("pgarnry/RbbgExtension") 即可获取包。它有一些依赖项,包括“Rbbg”。

> require(RbbgExtension)
Loading required package: RbbgExtension
> 
> tickers <- c("AUDUSD", "EURUSD")
> 
> prices <- HistData(tickers = tickers,
+                    type = "Curncy",
+                    fields = "PX_LAST",
+                    startdate = "20110101")
R version 3.1.2 (2014-10-31) 
rJava Version 0.9-6 
Rbbg Version 0.5.3 
Java environment initialized successfully.
Looking for most recent blpapi3.jar file...
Adding C:\blp\API\APIv3\JavaAPI\v3.7.1.1\lib\blpapi3.jar to Java classpath
Bloomberg API Version 3.7.1.1 
> class(prices)
[1] "xts" "zoo"
> head(prices)
           AUDUSD EURUSD
2011-01-03 1.0168 1.3361
2011-01-04 1.0051 1.3308
2011-01-05 0.9995 1.3149
2011-01-06 0.9944 1.3003
2011-01-07 0.9959 1.2907
2011-01-10 0.9956 1.2951
> tail(prices)
           AUDUSD EURUSD
2015-01-26 0.7925 1.1238
2015-01-27 0.7937 1.1381
2015-01-28 0.7889 1.1287
2015-01-29 0.7762 1.1320
2015-01-30 0.7762 1.1291
2015-02-02 0.7806 1.1351

【讨论】:

    【解决方案3】:

    rbbg 的 blh(现在是 bdh)是愚蠢的。这会正确输出时间序列。

    bdhx <- function(conn,securities,start_date,end_date=NULL,fields="PX_LAST",override_fields = NULL,overrides = NULL) {
      temp <- bdh(conn=conn,securities=securities,fields=fields,start_date=start_date,end_date=end_date,override_fields=override_fields)
      if (colnames(temp)[1]=="date")
        {temp <- as.xts(temp)[,-1];colnames(temp) <- securities;res <- temp;}
      else
        {cn <- unique(temp[,1]);fil <- temp[,1]==cn[1];
         res <- xts(temp[fil,3],as.Date(temp[fil,2]));colnames(res) <- securities[1];
             for (i in 4:(length(cn)+2)){
              fil <- temp[,1]==cn[i-2]
              temp2 <- xts(temp[fil,3],as.Date(temp[fil,2]));colnames(temp2) <- securities[i-2];
              res <- merge.xts(res,temp2)}
         }
      res}
    

    【讨论】:

      猜你喜欢
      • 2021-02-26
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2021-02-20
      相关资源
      最近更新 更多