【问题标题】:Run BLS API large dataframe with results per query limit and save as dataframe in R使用每个查询限制的结果运行 BLS API 大型数据帧并在 R 中另存为数据帧
【发布时间】:2020-01-25 22:55:11
【问题描述】:

我正在尝试使用 BLS API 提取大量数据(约 500K 单个系列 ID)并将输出存储为数据帧。

我遇到了两个问题:

  1. BLS API 仅允许 50 个结果/查询和每天 2.5K 查询
  2. 将输出保存为已编译的数据帧

我创建了一个数据框,其中只有一列“系列 ID”,这是 BLS API 吐出该特定 ID 上的数据所需的信息。为了绕过结果/查询限制,我尝试将所有 500K 系列 ID 的数据框分成 250 个组(以保持在每天的查询限制之下),并使用一个函数分别在每个组中运行 bls_api 代码。我相信这可能有效,但我无法看到输出。为了尝试将输出保存在数据帧中,我创建了一个空白数据帧并尝试将 BLS 数据函数输出与空白数据帧进行 rbind。

创建一个空白数据框来存储 BLS 输出

output <- data.frame();

在 250 行系列 ID 的片段上运行 BLS API 代码

unlist(lapply(split(df$`Series ID`, rep(1:250)),
function(Data)
{bls_data <- bls_api(Data,startyear=2016, endyear= 2019, Sys.getenv("BLS_KEY"));
output <- rbind(output,bls_data)}))

虽然我在控制台中看到BLS_API (ie. "REQUEST_SUCCEEDED") 的输出,但输出并未保存为数据框“输出”(数据框仍为空白)。

我是函数新手,所以任何建议都很有价值!

【问题讨论】:

  • 我通常会将每个 api 调用结果保存到一个列表中,然后 do.call(rbind, mylist) 以获得最终的输出数据集。在谷歌上搜索concatenating data frames in r,有大量关于此的博客文章。
  • 另外,这是一个明确的 for 循环就可以的时代之一。它在这里更加灵活和可读,我不认为它会导致任何性能损失。
  • 我尝试使用 list(split(df,as.numeric(rownames(df))-1)%/%250) 将我的数据框拆分为一个列表的另一个版本,但无法从那里找出适用于数据框列表的正确循环

标签: r function api lapply rbind


【解决方案1】:

这是我能够弄清楚的。不是最优雅的解决方案,但可以完成工作!

定义每组所需的行数

nSegments <- 250

根据上面定义的行数将系列 ID 拆分为段

series_ids_split <- split(df, 
(seq(nrow(df))-1) %/% nSegments)

具有明确数据输出的系列ID的运行函数

total_output <- lapply(eries_ids_split, function(x){
x <- bls_api(x,startyear = 2018, endyear = 2019, Sys.getenv("BLS_KEY"))
return(x)
})

将数据帧列表合并到输出数据帧中 output_df &lt;- do.call(rbind,total_output)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-26
    • 2021-01-24
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 2013-04-12
    • 1970-01-01
    相关资源
    最近更新 更多