我正在尝试使用edgarWebR
包从EDGAR获取公司及其备案信息。特别是,我想使用包中的两个函数 -filing_information
和company_filings
.
我实际上在不同的数据集中有数千个cik
,但上面的两个函数都无法处理cik
向量。这是一个例子——
library(edagrWebR)
comp_file <- company_filings(c("1000045"), before = "20201231",
type = "10-K", count = 100,
page = 1)
head(comp_file)
accession_number act file_number filing_date accepted_date
1 <NA> 34 000-26680 2020-06-22 2020-06-22
2 <NA> 34 000-26680 2019-06-28 2019-06-28
3 <NA> 34 000-26680 2018-06-27 2018-06-27
4 <NA> 34 000-26680 2017-06-14 2017-06-14
5 <NA> 34 000-26680 2016-06-14 2016-06-14
6 <NA> 34 000-26680 2015-06-15 2015-06-15
href
1 https://www.sec.gov/Archives/edgar/data/1000045/000156459020030033/0001564590-20-030033-index.htm
2 https://www.sec.gov/Archives/edgar/data/1000045/000156459019023956/0001564590-19-023956-index.htm
3 https://www.sec.gov/Archives/edgar/data/1000045/000119312518205637/0001193125-18-205637-index.htm
4 https://www.sec.gov/Archives/edgar/data/1000045/000119312517203193/0001193125-17-203193-index.htm
5 https://www.sec.gov/Archives/edgar/data/1000045/000119312516620952/0001193125-16-620952-index.htm
6 https://www.sec.gov/Archives/edgar/data/1000045/000119312515223218/0001193125-15-223218-index.htm
type film_number
1 10-K 20977409
2 10-K 19927449
3 10-K 18921743
4 10-K 17910577
5 10-K 161712394
6 10-K 15931101
form_name
1 Annual report [Section 13 and 15(d), not S-K Item 405]
2 Annual report [Section 13 and 15(d), not S-K Item 405]
3 Annual report [Section 13 and 15(d), not S-K Item 405]
4 Annual report [Section 13 and 15(d), not S-K Item 405]
5 Annual report [Section 13 and 15(d), not S-K Item 405]
6 Annual report [Section 13 and 15(d), not S-K Item 405]
description size
1 <NA> 14 MB
2 <NA> 10 MB
3 <NA> 5 MB
4 <NA> 5 MB
5 <NA> 5 MB
6 <NA> 7 MB
我需要在函数中使用href
变量filing_information
。
实际上,我试图以这种方式使用它——
file_info <- filing_information(comp_file$href)
但它不起作用。我收到了这条消息——
Error in parse_url(url) : length(url) == 1 is not TRUE
我实际上可以通过按以下方式放置每个href
变量值来做到这一点
x <- "https://www.sec.gov/Archives/edgar/data/1000045/000156459020030033/0001564590-20-030033-index.htm"
file_info <- filing_information(x)
company_filings
函数也是如此,我只使用一种cik
- "1000045",但在另一个文件中,我有数千个cik
,我想运行company_filings
函数。手动这是不可能的,因为我有数千个cik
.
任何人都知道如何在 LARGE 向量上自动执行这两个功能。
谢谢
一般来说,当一个函数(无论是 API 到达还是本地)只接受一个元素作为参数时,通常最简单的"矢量化"方法是使用一种形式的lapply
:
companies <- c("1000045", "1000046", "1000047")
comp_file_list <- lapply(
setNames(nm=companies),
function(comp) company_filings(comp, before = "20201231",
type = "10-K", count = 100,
page = 1)
)
从技术上讲,setNames(nm=.)
部分是一种保护措施,使我们能够知道每个元素使用了哪个公司 ID。如果它包含在返回数据中,则可以将其删除。
假设返回值始终是一个data.frame
,那么您可以将它们保留在列表中(并将它们作为帧列表、c.f. https://stackoverflow.com/a/24376207/3358227)处理),或者您可以使用以下之一将它们组合成一个更高的帧:
# base R
comp_files <- Map(function(x, nm) transform(x, id = nm), comp_files, names(comp_files))
comp_files <- do.call(rbind, comp_files_list)
# dplyr/tidyverse
comp_files <- dplyr::bind_rows(comp_files_list, .id = "id")
# data.table
comp_files <- data.table::rbindlist(comp_files, idcol = "id")
仅供参考,lapply
的第二个参数是一个函数,其中第一个参数填充了X
中的每个参数(lapply
的第一个参数)。有时这个函数可能只是函数本身,如
res <- lapply(companies, company_filings)
这相当于
res <- lapply(companies, function(z) company_filings(z))
如果您有一组必须应用于所有调用的参数,则可以选择以下等效表达式之一:
res <- lapply(companies, company_filings, before = "20201231", type = "10-K", count = 100, page = 1)
res <- lapply(companies, function(z) company_filings(z, before = "20201231", type = "10-K", count = 100, page = 1))
但是,如果这些参数中的一个(或多个)因每家公司而异,则需要不同的形式。让我们假设我们对每个公司都有不同的before=
论点,
befores <- c("20201231", "20201130", "20201031")
res <- Map(function(comp, bef) company_filing(comp, before=bef, type="10-K"),
companies, befores)
基本错误处理(如果您的 id/ref 查询失败):
res <- lapply(comp, function(cmp) {
tryCatch(
company_filing(cmp, before=".."),
error = function(e) e
)
})
errors <- sapply(res, inherits, "error")
failures <- res[errors]
successes <- res[!errors]
good_returns <- do.call(rbind, success)
names(failures)
# indicates which company ids failed, and the text of the error may
# indicate why they failed
tryCatch(..., error=)
参数的一些选项:
error=identity
返回原始错误,有时有足够的信息error=function(e) e
同样的事情error=function(e) conditionMessage(e)
是character
返回,则消息部分的错误error=function(e) NULL
忽略错误,请改为返回NULL
(或某个常量)
您还可以有条件地处理e
,包括if (grepl("not found", e)) {...} else NULL
等模式。