Ранее у меня был следующий код, который работал хорошо, он использовал пакет quantmod для загрузки финансовой информации из Google. Однако с тех пор эта функция перестала работать. К счастью, кто-то попытался получить данные с Yahoo здесь.
library(tidyquant)
#symbols <- c("HOG", "GOOG", "GE")
stockinfo <- tq_index("SP500")
symbols <- stockinfo$symbol
library(quantmod)
symbols.f <- sapply(symbols, function(x) { paste0(x, ".f") })
symbols <- sub("\\.f","", symbols.f)
tickers <- new.env()
lapply(symbols, getFinancials, env=tickers)
BS <- data.frame(lapply(tickers, function(x) {viewFinancials(x, type= 'BS', period = 'A')}))
IS <- data.frame(lapply(tickers, function(x) {viewFinancials(x, type= 'IS', period = 'A')}))
CF <- data.frame(lapply(tickers, function(x) {viewFinancials(x, type= 'CF', period = 'A')}))
Я применяю следующий код, который включает функцию загрузки финансовой информации с Yahoo;
#########################################################
#Set the function to scrape Yahoo finance
getFin <- function(stock){
if ("rvest" %in% installed.packages()) {
library(rvest)
}else{
install.packages("rvest")
library(rvest)
}
for (i in 1:length(stock)) {
tryCatch(
{
url <- "https://finance.yahoo.com/quote/"
url <- paste0(url,stock[i],"/financials?p = ",stock[i])
wahis.session <- html_session(url)
p <- wahis.session %>%
html_nodes(xpath = '//*[@id = "Col1-1-Financials-Proxy"]/section/div[3]/table')%>%
html_table(fill = TRUE)
IS <- p[[1]]
colnames(IS) <- paste(IS[1,])
IS <- IS[-c(1,5,12,20,25),]
names_row <- paste(IS[,1])
IS <- IS[,-1]
IS <- apply(IS,2,function(x){gsub(",","",x)})
IS <- as.data.frame(apply(IS,2,as.numeric))
rownames(IS) <- paste(names_row)
temp1 <- IS
url <- "https://finance.yahoo.com/quote/"
url <- paste0(url,stock[i],"/balance-sheet?p = ",stock[i])
wahis.session <- html_session(url)
p <- wahis.session %>%
html_nodes(xpath = '//*[@id = "Col1-1-Financials-Proxy"]/section/div[3]/table')%>%
html_table(fill = TRUE)
BS <- p[[1]]
colnames(BS) <- BS[1,]
BS <- BS[-c(1,2,17,28),]
names_row <- BS[,1]
BS <- BS[,-1]
BS <- apply(BS,2,function(x){gsub(",","",x)})
BS <- as.data.frame(apply(BS,2,as.numeric))
rownames(BS) <- paste(names_row)
temp2 <- BS
url <- "https://finance.yahoo.com/quote/"
url <- paste0(url,stock[i],"/cash-flow?p = ",stock[i])
wahis.session <- html_session(url)
p <- wahis.session %>%
html_nodes(xpath = '//*[@id = "Col1-1-Financials-Proxy"]/section/div[3]/table')%>%
html_table(fill = TRUE)
CF <- p[[1]]
colnames(CF) <- CF[1,]
CF <- CF[-c(1,3,11,16),]
names_row <- CF[,1]
CF <- CF[,-1]
CF <- apply(CF,2,function(x){gsub(",","",x)})
CF <- as.data.frame(apply(CF,2,as.numeric))
rownames(CF) <- paste(names_row)
temp3 <- CF
assign(paste0(stock[i],'.f'),value = list(IS = temp1,BS = temp2,CF = temp3),envir = parent.frame())
},
error = function(cond){
message(stock[i], "Give error ",cond)
}
)
}
}
################## END OF FUNCTION ######################
#
#########################################################
symbols <- c("HOG", "GOOG", "GE")
Я могу использовать следующий getFin(symbols), который загружает финансовую отчетность. Однако я столкнулся с проблемой, так как хочу иметь данные в том виде, в котором они были раньше, используя;
tickers <- new.env()
lapply(symbols, getFin, env=tickers)
BS <- data.frame(lapply(tickers, function(x) {viewFinancials(x, type= 'BS', period = 'A')}))
IS <- data.frame(lapply(tickers, function(x) {viewFinancials(x, type= 'IS', period = 'A')}))
CF <- data.frame(lapply(tickers, function(x) {viewFinancials(x, type= 'CF', period = 'A')}))
Я столкнулся с ошибкой на lapply(symbols, getFin, env=tickers) и не совсем понимаю, почему, поскольку я помещаю данные в тот же формат, что и раньше.
Обновлено:
Чтобы дать представление о том, чего я пытаюсь достичь (в качестве конечной цели). Мне нужны 3 отдельных фрейма данных для BS - Балансовый отчет, IS - Отчет о прибылях и убытках и CF - Денежный поток`, где каждая из фирм указана в столбце.
Извините, это ошибка, с которой я столкнулся с lapply(symbols, getFin, env=tickers) Error in FUN(X[[i]], ...) : unused argument (env = <environment>)
Что ж, ваша функция getFin() определяется только одним параметром (запасом). У него нет параметра с именем env=. Вы не можете передать параметр функции, если она этого не запрашивает.
да .. так проблема в том, что env = tickers не определяется в функции getFin?
Да, getFin имеет только один параметр - stock. Когда вы делаете вызов lapply(symbols, getFin, env=tickers), lapply пытается передать tickers аргументу env для getFin, которого не существует.





Какое точное сообщение об ошибке вы получите?