Как получить информацию о нескольких компаниях с помощью edgarWebR

Я пытаюсь получить компании и их информацию от EDGAR, используя пакет edgarWebR. В частности, я хочу использовать две функции из пакета - 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 тысяч.

Кто-нибудь знает, как я могу автоматически выполнять эти две функции на БОЛЬШОМ векторе.

Спасибо


person Sharif    schedule 25.02.2021    source источник
comment
res <- lapply(setNames(nm=comp_file$href), filing_information) даст вам list возвращаемых значений. Если его возврат равен data.frame, вы можете объединить результаты с одним из: do.call(rbind.data.frame, res), dplyr::bind_rows(res, .id="href") или data.table::rbindlist(res, idcol="href").   -  person r2evans    schedule 25.02.2021
comment
@r2evans отлично работает. как я могу сделать это для company_filing. Я попробовал этот для company_filing - res2 <- lapply(setNames(nm=df2$cik), company_filings), и он работает, но как добавить другие аргументы функции company_filing, такие как before = "20201231",type = "10-K", count = 100, page = 1   -  person Sharif    schedule 25.02.2021


Ответы (1)


В общем, когда функция (обращающаяся к 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=.) является защитой, позволяющей нам узнать, какой идентификатор компании использовался для каждого элемента. Если он включен в возвращаемые данные, его можно удалить.

Предполагая, что возвращаемое значение всегда равно data.frame, вы можете либо оставить их в списке (и работать с ними как со списком кадров, ср., 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)

Базовая обработка ошибок, если у вас есть идентификаторы/ссылки, которые не соответствуют запросу:

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.

person r2evans    schedule 25.02.2021
comment
Большое спасибо. - person Sharif; 25.02.2021
comment
когда я пытаюсь запустить код с моими реальными данными, я получаю следующие ошибки - Error in strsplit(URL, "") : non-character argument. На самом деле я запускаю следующий код — comp_file_list <- lapply( setNames(nm=companies), function(comp) company_filings(comp, before = "20201231", type = "10-K", count = 1000) ), где companies включает все мои cik. - person Sharif; 26.02.2021
comment
Это может произойти, если ваш companies не character. Если ваш companies является вектором, попробуйте lapply(setNames(nm=as.character(companies)),...). Если companies не вектор, то... это неправильно :-) - person r2evans; 26.02.2021
comment
на самом деле, я изменил код после вашего последнего комментария, но он показывает это - Error in curl::curl_fetch_memory(url, handle = handle) : necessary data rewind wasn't possible, я на самом деле запускаю это - comp_file_list <- lapply( setNames(nm=as.character(companies)), function(comp) company_filings(comp, before = "20201231", type = "10-K", count = 1000) ). мой вектор такой - head (companies) # A tibble: 6 x 1 cik2 <chr> 1 730052 2 1750 3 313368 4 910627 5 702511 6 61478 - person Sharif; 26.02.2021
comment
Ошибка завитка, вероятно, не связана с этим вопросом. Быстрый поиск предполагает, что это либо (а) сбой сервера, (б) пробел в имени файла, либо (в) какой-то другой неверный URL-адрес. Или что-то другое. Извините, я не гуру завивки для этого. Я предлагаю вам обернуть company_filings try(...,silent=TRUE), чтобы определить, какой URL-адрес вызывает ошибку. Если это тот же URL, то вы будете знать, куда копать глубже. Если вы получаете разные результаты при разных запусках с одним и тем же companies, это указывает на проблему с сетью или библиотекой (вероятно, что это R). - person r2evans; 26.02.2021
comment
Можете ли вы пролить свет, как я могу найти те cik, у которых есть проблемы? Я на самом деле новичок в R. Спасибо за все ваши усилия. На самом деле я могу найти cik, запустив приведенный выше код, который показывает, что он не находит этот cik, как 100045. то я могу отфильтровать его. но это займет у меня огромное время. - person Sharif; 26.02.2021
comment
Смотрите мою правку. Для получения дополнительной информации об использовании try и tryCatch в Интернете есть множество руководств и пошаговых руководств по расширенной обработке ошибок R, включая adv-r.had.co.nz/Exceptions-Debugging.html. Надеюсь это поможет! - person r2evans; 26.02.2021