Нужна помощь в оптимизации цикла в больших задачах - PullRequest
0 голосов
/ 22 февраля 2019

Я работаю над сольным проектом, который начинается с генерирования биржевых данных с использованием пакета rvest для веб-скрапинга и сохранения его в виде данных.

Цикл тянет часть биржевых тикеровс веб-сайта и сохраняет его в информационном кадре.Мой код чрезвычайно архаичный (я думаю), отчасти из-за того, как организован сайт.Веб-сайт размещает символы на страницах в алфавитном порядке, с разным количеством тикеров на каждой странице (1 страница на букву) - да, мне приходилось считать, сколько на странице.То, что я закончил с работами, но работает очень медленно:

#GET AMEX tickers
alphabet <- c('A','B','C','D','E','F','G','H','I','J','K',
          'L','M','N','O','P','Q','R','S','T','U','V',
          'W','X','Y','Z')
#start at 2
lengths <- c(65,96,89,125,161,154,86,62,173,83,26,43,62,51,
         37,126,25,81,149,52,77,74,34,50,8,11)

amexurls <- paste0("http://findata.co.nz/markets/AMEX/symbols/",toupper(alphabet),".htm",
 sep = "")

iterator <- 0
for(j in 1:26){
  url <- amexurls[j]
  for(k in 2:lengths[j]){

html <- read_html(as.character(url))
iterator 
test <- html_nodes(html,as.character(paste0("tr:nth-child(",k,") a")))
test <- toString(test)
test <-  gsub("<[^>]+>", "", test)
amexsymbols[k-2+iterator] <- test

  }
  iterator <- iterator + lengths[j] + 1
}

Для цикла выше для выполнения требуется более часа.Я думаю, что это может быть главным образом из-за многочисленных звонков в Интернет.

Я пытаюсь лучше понять векторизацию и другие приемы, чтобы максимизировать эффективность R, особенно в таком большом проекте, как этот.

Вещи, которые я пробовал / видел:

-Я вынул столько же из тела цикла (особенно в строке paste0

-Переключение из фрейма данных в режим данных

- В более старом посте пользователь @Gregor (еще раз спасибо) показал мне, что я могу использовать paste0 как векторизованную функцию, и, следовательно, amexurls не использует цикл for дляхранить - но, к сожалению, это не медленная часть кода

Это всего лишь фрагмент гораздо большего кода веб-очистки. Если я могу оптимизировать этот фрагмент, я могу применить его ко всем остальным.Буду весьма признателен за улучшения в моем коде или советы / хитрости. Спасибо за ваше время.

1 Ответ

0 голосов
/ 22 февраля 2019

Я не могу проверить это сейчас из-за ограничений брандмауэра.Но я бы порекомендовал попробовать что-то, используя функцию html_table() из rvest для сбора данных.Это было бы гораздо более динамично, чем ручное указание количества акций на каждой странице и просмотр каждой строки по отдельности.

library(rvest)

amexurls <- paste0("http://findata.co.nz/markets/AMEX/symbols/", LETTERS,".htm")

ldf <- list()
iterator <- 0

for(url in amexurls){
  iterator <- iterator + 1
  html <- read_html(url)
  ldf[[iterator]] <- html_table(html_nodes(html, "table")[[2]])
}

df <- do.call(rbind, ldf)
...