gpt4 book ai didi

r - 如何在For-Loop中进行错误处理,以便从代码列表中检索Yahoo Finance数据

转载 作者:行者123 更新时间:2023-12-03 07:42:13 25 4
gpt4 key购买 nike

因此,我编写了一些代码,使用一维数组中包含的Ticker符号“列表”从雅虎财务中提取csv文件。我面临的挑战是股票代码之一可能没有任何数据(或输入错误)。因此,我建立了一个tryCatch命令,但是它不能很好地工作。下面是我的代码(我使用source(“代码名称”)访问该代码,后面是它生成的错误:

#URL Builder for Yahoo Finance
#Requests Input from User, Builds URL, downloads csv.file from site
#Requests are for:
#Ticker (2-4 letter - character string)
#Start Month (00 - 11 integer)
#Start Day (1 - 31 integer)
#Start Year (Four digit integer)
#End Month (00 - 11 integer)
#End Day (1 - 31 integer)
#End Year (Four digit integer)

#Retrieve Ticker File
setwd(personal_directory)
#tickers <- read.csv("Tickers.csv")

#Here are some example tickers, since you will not have the Ticker.csv file (the S ticker generates the error to be handled
tickers <- data.frame(Ticker = c("XOM", "DVN", "S"))
tickers <- tickers[order(tickers[,1]),]
setwd("Ticker Data")

#Functions
Get_Month_Begin <- function(){as.numeric(readline("Enter the start month 00 - 11(MM):>>> "))}
Get_Day_Begin <- function(){as.numeric(readline("Enter the start day (1-31) :>>> "))}
Get_Year_Begin <- function(){as.numeric(readline("Enter the start year (YYYY) :>>> "))}
Get_Month_End <- function(){as.numeric(readline("Enter the end month (MM) :>>> "))}
Get_Day_End <- function(){as.numeric(readline("Enter the end day (1-31) :>>> "))}
Get_Year_End <- function(){as.numeric(readline("Enter the end year :>>> "))}

#Function Calls
Month_Begin <- Get_Month_Begin()
Day_Begin <- Get_Day_Begin()
Year_Begin <- Get_Year_Begin()
Month_End <- Get_Month_End()
Day_End <- Get_Day_End()
Year_End <- Get_Year_End()

#Build URL
#Example URL: http://ichart.finance.yahoo.com/table.csvs=DVN&a=00&b=1&c=1992&d=11&e=31&f=2013&g=d&ignore=.csv
CSV_Base_URL <- "http://ichart.finance.yahoo.com/table.csv?s="
yahoo_data_date_format <- "%Y-%m-%d"

for(i in 1:nrow(tickers)){
Ticker <- tickers[i, 1]
CSV_URL_Complete <- paste(CSV_Base_URL,Ticker,"&a=",Month_Begin,"&b=",Day_Begin,"&c=",Year_Begin,"&d=",Month_End,"&e=",Day_End,"&f=",Year_End,"&g=d&ignore=.csv",sep="")

#Download CSV
options(warn=2)
potential_error <- tryCatch(Yahoo_Finance_TBL <- read.csv(CSV_URL_Complete), error = function(e) e)

if(!inherits(potential_error, "error")){
Yahoo_Finance_TBL <- Yahoo_Finance_TBL[,c(1,7)]
colnames(Yahoo_Finance_TBL) <- gsub(" ", ".", colnames(Yahoo_Finance_TBL))
Yahoo_Finance_TBL[, 1] <- as.Date(Yahoo_Finance_TBL[, 1], yahoo_data_date_format)

#Write CSV File
write.csv(Yahoo_Finance_TBL, file=paste(Ticker,"_Yahoo_Finance_File.csv", sep=""), row.names=FALSE)
}
}

此代码生成以下错误:
Error in if (file == "") file <- stdin() else { : 
missing value where TRUE/FALSE needed

我知道这是if条件中的问题,我想知道是否需要在某处放置“== TRUE”语句。

感谢您的帮助!

注意:
我已经运行了没有for循环的代码,只需将Ticker <-“S”设置为查看生成的错误类型。原来这是一个警告(而不是错误),所以我编写了以下代码(上面编辑):
options(warn = 2)

这会使所有警告错误,但仍然没有喜悦。

最佳答案

您显示的错误可能是由write.table调用的write.csv引起的。该错误告诉您缺少file(NA)。但是,我遇到了其他错误,其中一个是Error in 1:nrow(tickers) : argument of length 0,我将在下面进行详细说明。

我将代码作为字符 vector 存储,而不是将它们存储在data.frame中,但是如果要将它们存储在data.frame中,则必须注意两件事:stringsAsFactorsdrop
tickers <- data.frame(Ticker = c("XOM", "DVN", "S"))将股票行情存储为因素

> str(tickers)
'data.frame': 3 obs. of 1 variable:
$ Ticker: Factor w/ 3 levels "DVN","S","XOM": 3 1 2
tickers <- tickers[order(tickers[,1]),]data.frame vector 替换 Factor,因为默认情况下 drop=TRUE中的 [.data.frame
> tickers[order(tickers[,1]),]
[1] DVN S XOM
Levels: DVN S XOM

但是,稍后您将其视为仍然是1列 data.frame: nrow(tickers)为NULL,而 tickers[1, 1]是错误。

您可以更改作为 vector 子集的代码,也可以使用 drop=FALSE将其保留为 data.frame
> tickers[order(tickers[,1]),,drop=FALSE]
Ticker
2 DVN
3 S
1 XOM

如果您打算为此使用 data.frame,建议您使用 stringsAsFactors=FALSE,这样您的股票代码将存储为 character
> tickers <- data.frame(Ticker = c("XOM", "DVN", "S"), stringsAsFactors=FALSE)
> str(tickers)
'data.frame': 3 obs. of 1 variable:
$ Ticker: chr "XOM" "DVN" "S"

最后,应该使用 1:nrow(tickers)而不是 seq_len(tickers)。否则,如果'nrow(tickers)为0,您将得到意想不到的结果
>for(i in 1:0) print(i)
[1] 1
[1] 0

关于r - 如何在For-Loop中进行错误处理,以便从代码列表中检索Yahoo Finance数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17633335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com