【问题标题】:API Call per Row of data frame in RR中每行数据帧的API调用
【发布时间】:2016-04-30 15:43:38
【问题描述】:

我在数据框中有一列,其中包含股票代码,例如 AAPL(代表 Apple 股票)、TWTR(代表 Twitter)等等。我正在尝试创建一个新列,它将返回从股票 API 数据计算的每个股票代码的股票数量。

但是当我运行下面的代码时,新列“库存数量”为每一行返回 NA。有没有人可以解决这个问题?

library(Quandl)

portfolio <- data.frame(Code=c("AAPL", "TWTR", "MSFT"),
                startingPeriod=c("2015-01-01", "2015-01-01", "2015-01-01"),
                Investment=c("5000", "10000", "15000"), 
                stringsAsFactors=FALSE)


numberofStock <- function(pf) {

API <- Quandl(paste0("WIKI/", pf$Code), type = "raw", 
            start_date = pf$startingPeriod, end_date=Sys.Date())

pf["StockQuantity"] <- floor(pf$Investment_01 / tail(API$Open,1))

return(pf)
}


numberofStock(portfolio) 

【问题讨论】:

    标签: r api quandl


    【解决方案1】:

    这是一个开始。

    library(dplyr)
    
    company.initial = 
      portfolio %>%
      mutate(Investment = as.numeric(Investment) ) %>%
      group_by(Code) %>%
      summarize(start_date = min(startingPeriod),
                total_investment = sum(Investment) )
    
    company__date = 
      company.initial %>%
      group_by(Code) %>%
      do(with(.,
         Quandl(paste0("WIKI/", Code), 
                type = "raw",
                start_date = start_date, 
                end_date = Sys.Date() ) ) )
    
    company = 
      company__date %>%
      group_by(Code) %>%
      summarize(last_open = last(Open)) %>%
      left_join(company.initial) %>%
      mutate(StockQuantity = total_investment / last_open)
    

    【讨论】:

    • 非常感谢。您的代码有效,而且更简单、更整洁。
    • 顺便问一下,你能解释一下为什么我们必须同时使用 'Do' 和 'With' 函数来达到这个目的吗?
    • 当 do 循环内的代码被求值时,它使用 .作为数据帧的一部分。为了获得块中的列,您可以执行 .$Code,也可以在 . 的环境中评估 Code
    【解决方案2】:

    您可能希望首先使用as.Dateportfolio$startingPeriod 转换为数据类型Date。此外,您将两个向量 portfolio$Codeportfolio$startingPeriod 传递给函数 Quandl()。您可能想尝试使用 lapply() 函数来迭代这两个函数的每个值。

    编辑:您还需要使用as.numeric()portfolio$Investment 转换为numeric。以下是代码的外观:

    portfolio <- data.frame(Code=c("AAPL", "TWTR", "MSFT"),
                            startingPeriod=as.Date(c("2015-01-01", "2015-01-01", "2015-01-01")),
                            Investment=as.numeric(c("5000", "10000", "15000")), 
                            stringsAsFactors=FALSE)
    
    
    numberofStock <- function(pf) {lapply(seq_along(nrow(portfolio)), function(x){
        API <- Quandl(paste0("WIKI/", pf$Code[x]), type = "raw", 
                      start_date = pf$startingPeriod[x], end_date=Sys.Date())
    
        pf["StockQuantity"] <- floor(pf$Investment[x] / tail(API$Open,1))
    
        return(pf)
        })
    }
    
    numberofStock(portfolio)
    

    【讨论】:

    • 谢谢。我运行了你的代码,它已经成功地从输出中删除了 NA。但是,我注意到新列“库存数量”返回相同的值 44。结果应分别为 44、275 和 321。可能是什么问题?
    • @Fxs7576 尝试将seq_along(nrow(portfolio)) 替换为seq(1:nrow(pf)),并将return(pf) 替换为return(pf[x,]。第一个更改将允许对所有行进行迭代(因为原始迭代只是循环一次)。第二个更改将返回循环应用到的特定行。我认为您可以使用 plyr::ldply() 之类的东西将所有行合并到一个数据框中。
    • 它就像一个魅力。除了您的代码之外,我还使用了 "y
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 2013-02-05
    相关资源
    最近更新 更多