getFinancials (quantmod) 和 tq_get (tidy quant) 不工作?
getFinancials (quantmod) and tq_get (tidy quant) not working?
我在财务数据的 quantmod 和 tinyquant 中都遇到了同样的错误。谁能看看这是否可重现?这是 google 财务服务器问题吗? None 以下功能一直在为 me.I 工作,我不确定是我还是服务器。
tq_get("AAPL", get= "financials")
[1] NA
Warning message:
x = 'AAPL', get = 'financials': Error in thead[x]:thead[x + 1]: NA/NaN
argument
和:
getFin("AAPL")
Error in thead[x]:thead[x + 1] : NA/NaN argument
有人可以帮忙吗?
是的,我在过去几天也遇到了同样的问题。我认为这可能与 Google 财务方面的变化有关。该站点现在不同了,url 也是如此。
试试这个:
library(jsonlite)
library(httr)
transpose_df <- function(df_list){
df_list$maxAge <- NULL
myColnames <- df_list$endDate$fmt
df_list$endDate <- NULL
mydf <- data.frame(row.names = colnames(df_list))
for (i in 1:length(df_list)) {
for (j in 1:4) {
tryCatch(
{
mydf[i,j] <- df_list[j,i]$raw
},
error = function(cond){
mydf[i,j] <- NA
}
)
}
}
colnames(mydf) <- myColnames
return(mydf)
}
scrapy_stocks <- function(stock){
for (i in 1:length(stock)) {
tryCatch(
{
url <- paste0('https://query1.finance.yahoo.com/v10/finance/quoteSummary/',stock[i],'?formatted=true&lang=en-US®ion=US&modules=incomeStatementHistory%2CcashflowStatementHistory%2CbalanceSheetHistory&corsDomain=finance.yahoo.com')
a <- GET(url)
a <- content(a, as="text")
df <- fromJSON(a, simplifyDataFrame = TRUE)
df_is <- df$quoteSummary$result$incomeStatementHistory$incomeStatementHistory[[1]]
df_is <- transpose_df(df_is)
df_bs <- df$quoteSummary$result$balanceSheetHistory$balanceSheetStatements[[1]]
df_bs <- transpose_df(df_bs)
df_cs <- df$quoteSummary$result$cashflowStatementHistory$cashflowStatements[[1]]
df_cs <- transpose_df(df_cs)
assign(paste0(stock[i],'.f'),value = list(IS = df_is,BS = df_bs,CF = df_cs),envir = parent.frame())
},
error = function(cond){
message(stock[i], "Give error ",cond)
}
)
}
}
scrapy_stocks(c('PETR4.SA','VALE3.SA'))
您可以将其称为 scrapy_stocks(c("AAPL","GOOGL"))
并以 AAPL.f$IS
、AAPL.f$BS
或 AAPL.f$CF
.
访问其数据
我已经有一段时间没有使用 R 了,所以可能有更好的方法来做到这一点,特别是转置 Dataframe,但我认为它是有效的。我希望它可以帮助某人。
在 URL 中,如果您使用 balanceSheetHistory
,您将获得 Anual 值,如果您改为使用 balanceSheetHistoryQuarterly
,您还可以获得季度数字。可以很容易地为此调整功能。
我调整了 scrapy_stocks 函数以适应 Yahoo 页面更新。我还没有彻底审查这个解决方案,但它似乎在我迄今为止的所有试验中都运行良好。请注意两件事:
- 如果您拥有 Yahoo Premium,我认为这不会奏效。我没有,所以无法测试。但是如果你这样做了,更新应该不会太难。
- 我对 rvest 没有太多经验,但由于页面的性质,它必须设置函数,如果缺少一个值,则整行都将丢失。
试试这个:
scrapy_stocks2 <- function(stock){
if ("rvest" %in% installed.packages()) {
library(rvest)
}else{
install.packages("rvest")
library(rvest)
}
if ("xml2" %in% installed.packages()) {
library(xml2)
}else{
install.packages("xml2")
library(xml2)
}
for (stocknum in 1:length(stock)) {
tryCatch(
{
# Income Statement
url <- "https://finance.yahoo.com/quote/"
url <- paste0(url,stock[stocknum],"/financials?p=",stock[stocknum])
wahis.session <- html_session(url)
nodes <- wahis.session %>%
html_nodes(xpath = '//*[@id="Col1-1-Financials-Proxy"]/section/div[4]//span')
yh_data <- nodes %>%
xml_text() %>%
gsub(pattern = ',', replacement = '')
colnums <- 1:6
col_nms <- yh_data[colnums]
yh_data <- yh_data[-colnums]
lab_inds <- nodes %>%
html_attr(name = 'class') == "Va(m)"
lab_inds[is.na(lab_inds)] <- FALSE
lab_inds <- lab_inds[-colnums]
data <- matrix(NA, nrow = sum(lab_inds), ncol = 5, dimnames = list(yh_data[lab_inds], col_nms[-1]))
row_num <- 1
for (i in 2:(length(lab_inds)-4)) {
t_ind <- !lab_inds[i:(i+4)]
if (sum(t_ind) == 5) {
data[row_num, 1:5] <- as.numeric(yh_data[i:(i+4)])
}
if (lab_inds[i]) {
row_num <- row_num+1
}
}
temp1 <- as.data.frame(data)
print(paste(stock[stocknum],' Income Statement Success'))
# Balance Sheet
url <- "https://finance.yahoo.com/quote/"
url <- paste0(url,stock[stocknum],"/balance-sheet?p=",stock[stocknum])
wahis.session <- html_session(url)
nodes <- wahis.session %>%
html_nodes(xpath = '//*[@id="Col1-1-Financials-Proxy"]/section/div[4]/div[1]/div[1]//span')
yh_data <- nodes %>%
xml_text() %>%
gsub(pattern = ',', replacement = '')
colnums <- 1:5
col_nms <- yh_data[colnums]
yh_data <- yh_data[-colnums]
lab_inds <- nodes %>%
html_attr(name = 'class') == "Va(m)"
lab_inds[is.na(lab_inds)] <- FALSE
lab_inds <- lab_inds[-colnums]
data <- matrix(NA, nrow = sum(lab_inds), ncol = 4, dimnames = list(yh_data[lab_inds], col_nms[-1]))
row_num <- 1
for (i in 2:(length(lab_inds)-3)) {
t_ind <- !lab_inds[i:(i+3)]
if (sum(t_ind) == 4) {
data[row_num, 1:4] <- as.numeric(yh_data[i:(i+3)])
}
if (lab_inds[i]) {
row_num <- row_num+1
}
}
temp2 <- as.data.frame(data)
print(paste(stock[stocknum],' Balance Sheet Success'))
# Cash Flow
url <- "https://finance.yahoo.com/quote/"
url <- paste0(url,stock[stocknum],"/cash-flow?p=",stock[stocknum])
wahis.session <- html_session(url)
nodes <- wahis.session %>%
html_nodes(xpath = '//*[@id="Col1-1-Financials-Proxy"]/section/div[4]/div[1]/div[1]//span')
yh_data <- nodes %>%
xml_text() %>%
gsub(pattern = ',', replacement = '')
colnums <- 1:6
col_nms <- yh_data[colnums]
yh_data <- yh_data[-colnums]
lab_inds <- nodes %>%
html_attr(name = 'class') == "Va(m)"
lab_inds[is.na(lab_inds)] <- FALSE
lab_inds <- lab_inds[-colnums]
data <- matrix(NA, nrow = sum(lab_inds), ncol = 5, dimnames = list(yh_data[lab_inds], col_nms[-1]))
row_num <- 1
for (i in 2:(length(lab_inds)-4)) {
t_ind <- !lab_inds[i:(i+4)]
if (sum(t_ind) == 5) {
data[row_num, 1:5] <- as.numeric(yh_data[i:(i+4)])
}
if (lab_inds[i]) {
row_num <- row_num+1
}
}
temp3 <- as.data.frame(data)
print(paste(stock[stocknum],' Cash Flow Statement Success'))
assign(paste0(stock[stocknum],'.f'),value = list(IS = temp1,BS = temp2,CF = temp3),envir = parent.frame())
},
error = function(cond){
message(stock[stocknum], "Give error ",cond)
}
)
}
}
我在财务数据的 quantmod 和 tinyquant 中都遇到了同样的错误。谁能看看这是否可重现?这是 google 财务服务器问题吗? None 以下功能一直在为 me.I 工作,我不确定是我还是服务器。
tq_get("AAPL", get= "financials")
[1] NA
Warning message:
x = 'AAPL', get = 'financials': Error in thead[x]:thead[x + 1]: NA/NaN
argument
和:
getFin("AAPL")
Error in thead[x]:thead[x + 1] : NA/NaN argument
有人可以帮忙吗?
是的,我在过去几天也遇到了同样的问题。我认为这可能与 Google 财务方面的变化有关。该站点现在不同了,url 也是如此。
试试这个:
library(jsonlite)
library(httr)
transpose_df <- function(df_list){
df_list$maxAge <- NULL
myColnames <- df_list$endDate$fmt
df_list$endDate <- NULL
mydf <- data.frame(row.names = colnames(df_list))
for (i in 1:length(df_list)) {
for (j in 1:4) {
tryCatch(
{
mydf[i,j] <- df_list[j,i]$raw
},
error = function(cond){
mydf[i,j] <- NA
}
)
}
}
colnames(mydf) <- myColnames
return(mydf)
}
scrapy_stocks <- function(stock){
for (i in 1:length(stock)) {
tryCatch(
{
url <- paste0('https://query1.finance.yahoo.com/v10/finance/quoteSummary/',stock[i],'?formatted=true&lang=en-US®ion=US&modules=incomeStatementHistory%2CcashflowStatementHistory%2CbalanceSheetHistory&corsDomain=finance.yahoo.com')
a <- GET(url)
a <- content(a, as="text")
df <- fromJSON(a, simplifyDataFrame = TRUE)
df_is <- df$quoteSummary$result$incomeStatementHistory$incomeStatementHistory[[1]]
df_is <- transpose_df(df_is)
df_bs <- df$quoteSummary$result$balanceSheetHistory$balanceSheetStatements[[1]]
df_bs <- transpose_df(df_bs)
df_cs <- df$quoteSummary$result$cashflowStatementHistory$cashflowStatements[[1]]
df_cs <- transpose_df(df_cs)
assign(paste0(stock[i],'.f'),value = list(IS = df_is,BS = df_bs,CF = df_cs),envir = parent.frame())
},
error = function(cond){
message(stock[i], "Give error ",cond)
}
)
}
}
scrapy_stocks(c('PETR4.SA','VALE3.SA'))
您可以将其称为 scrapy_stocks(c("AAPL","GOOGL"))
并以 AAPL.f$IS
、AAPL.f$BS
或 AAPL.f$CF
.
我已经有一段时间没有使用 R 了,所以可能有更好的方法来做到这一点,特别是转置 Dataframe,但我认为它是有效的。我希望它可以帮助某人。
在 URL 中,如果您使用 balanceSheetHistory
,您将获得 Anual 值,如果您改为使用 balanceSheetHistoryQuarterly
,您还可以获得季度数字。可以很容易地为此调整功能。
我调整了 scrapy_stocks 函数以适应 Yahoo 页面更新。我还没有彻底审查这个解决方案,但它似乎在我迄今为止的所有试验中都运行良好。请注意两件事:
- 如果您拥有 Yahoo Premium,我认为这不会奏效。我没有,所以无法测试。但是如果你这样做了,更新应该不会太难。
- 我对 rvest 没有太多经验,但由于页面的性质,它必须设置函数,如果缺少一个值,则整行都将丢失。
试试这个:
scrapy_stocks2 <- function(stock){
if ("rvest" %in% installed.packages()) {
library(rvest)
}else{
install.packages("rvest")
library(rvest)
}
if ("xml2" %in% installed.packages()) {
library(xml2)
}else{
install.packages("xml2")
library(xml2)
}
for (stocknum in 1:length(stock)) {
tryCatch(
{
# Income Statement
url <- "https://finance.yahoo.com/quote/"
url <- paste0(url,stock[stocknum],"/financials?p=",stock[stocknum])
wahis.session <- html_session(url)
nodes <- wahis.session %>%
html_nodes(xpath = '//*[@id="Col1-1-Financials-Proxy"]/section/div[4]//span')
yh_data <- nodes %>%
xml_text() %>%
gsub(pattern = ',', replacement = '')
colnums <- 1:6
col_nms <- yh_data[colnums]
yh_data <- yh_data[-colnums]
lab_inds <- nodes %>%
html_attr(name = 'class') == "Va(m)"
lab_inds[is.na(lab_inds)] <- FALSE
lab_inds <- lab_inds[-colnums]
data <- matrix(NA, nrow = sum(lab_inds), ncol = 5, dimnames = list(yh_data[lab_inds], col_nms[-1]))
row_num <- 1
for (i in 2:(length(lab_inds)-4)) {
t_ind <- !lab_inds[i:(i+4)]
if (sum(t_ind) == 5) {
data[row_num, 1:5] <- as.numeric(yh_data[i:(i+4)])
}
if (lab_inds[i]) {
row_num <- row_num+1
}
}
temp1 <- as.data.frame(data)
print(paste(stock[stocknum],' Income Statement Success'))
# Balance Sheet
url <- "https://finance.yahoo.com/quote/"
url <- paste0(url,stock[stocknum],"/balance-sheet?p=",stock[stocknum])
wahis.session <- html_session(url)
nodes <- wahis.session %>%
html_nodes(xpath = '//*[@id="Col1-1-Financials-Proxy"]/section/div[4]/div[1]/div[1]//span')
yh_data <- nodes %>%
xml_text() %>%
gsub(pattern = ',', replacement = '')
colnums <- 1:5
col_nms <- yh_data[colnums]
yh_data <- yh_data[-colnums]
lab_inds <- nodes %>%
html_attr(name = 'class') == "Va(m)"
lab_inds[is.na(lab_inds)] <- FALSE
lab_inds <- lab_inds[-colnums]
data <- matrix(NA, nrow = sum(lab_inds), ncol = 4, dimnames = list(yh_data[lab_inds], col_nms[-1]))
row_num <- 1
for (i in 2:(length(lab_inds)-3)) {
t_ind <- !lab_inds[i:(i+3)]
if (sum(t_ind) == 4) {
data[row_num, 1:4] <- as.numeric(yh_data[i:(i+3)])
}
if (lab_inds[i]) {
row_num <- row_num+1
}
}
temp2 <- as.data.frame(data)
print(paste(stock[stocknum],' Balance Sheet Success'))
# Cash Flow
url <- "https://finance.yahoo.com/quote/"
url <- paste0(url,stock[stocknum],"/cash-flow?p=",stock[stocknum])
wahis.session <- html_session(url)
nodes <- wahis.session %>%
html_nodes(xpath = '//*[@id="Col1-1-Financials-Proxy"]/section/div[4]/div[1]/div[1]//span')
yh_data <- nodes %>%
xml_text() %>%
gsub(pattern = ',', replacement = '')
colnums <- 1:6
col_nms <- yh_data[colnums]
yh_data <- yh_data[-colnums]
lab_inds <- nodes %>%
html_attr(name = 'class') == "Va(m)"
lab_inds[is.na(lab_inds)] <- FALSE
lab_inds <- lab_inds[-colnums]
data <- matrix(NA, nrow = sum(lab_inds), ncol = 5, dimnames = list(yh_data[lab_inds], col_nms[-1]))
row_num <- 1
for (i in 2:(length(lab_inds)-4)) {
t_ind <- !lab_inds[i:(i+4)]
if (sum(t_ind) == 5) {
data[row_num, 1:5] <- as.numeric(yh_data[i:(i+4)])
}
if (lab_inds[i]) {
row_num <- row_num+1
}
}
temp3 <- as.data.frame(data)
print(paste(stock[stocknum],' Cash Flow Statement Success'))
assign(paste0(stock[stocknum],'.f'),value = list(IS = temp1,BS = temp2,CF = temp3),envir = parent.frame())
},
error = function(cond){
message(stock[stocknum], "Give error ",cond)
}
)
}
}