Извлечь данные из среды в R или скорректировать код для сохранения в формате данных.

У меня есть следующий код: он сохраняет исторические фондовые данные из файла CSV, что именно то, что мне нужно, однако все данные в формате среды, и я не могу работать с ним. Можно ли настроить код так, чтобы информация была сохранена как "данные" для облегчения обработки. Может быть, есть способ перевести Среду в более дружественный формат, это может быть решением. В общем, у меня есть информация, которая мне нужна, но я не знаю, как использовать ее сейчас:)

#install.packages("quantmod")
library("quantmod")
#Script to download prices from yahoo
#and Save the prices to a RData file
#The tickers will be loaded from a csv file

#Script Parameters
tickerlist <- "sp500.csv"  #CSV containing tickers on rows
savefilename <- "stockdata.RData" #The file to save the data in
startDate = as.Date("2005-01-13") #Specify what date to get the prices from
maxretryattempts <- 5 #If there is an error downloading a price how many times to retry

#Load the list of ticker symbols from a csv, each row contains a ticker
stocksLst <- read.csv("sp500.csv", header = F, stringsAsFactors = F)
stockData <- new.env() #Make a new environment for quantmod to store data in
nrstocks = length(stocksLst[,1]) #The number of stocks to download

#Download all the stock data
for (i in 1:nrstocks){
for(t in 1:maxretryattempts){

   tryCatch(
       {
           #This is the statement to Try
           #Check to see if the variables exists
           #NEAT TRICK ON HOW TO TURN A STRING INTO A VARIABLE
           #SEE  http://www.r-bloggers.com/converting-a-string-to-a-variable-name-on-the-fly-and-vice-versa-in-r/
            if(!is.null(eval(parse(text=paste("stockData$",stocksLst[i,1],sep=""))))){
                #The variable exists so dont need to download data for this stock
                #So lets break out of the retry loop and process the next stock
                #cat("No need to retry")
                break
            }

          #The stock wasnt previously downloaded so lets attempt to download it
          cat("(",i,"/",nrstocks,") ","Downloading ", stocksLst[i,1] , "\t\t Attempt: ", t , "/", maxretryattempts,"\n")
          getSymbols(stocksLst[i,1], env = stockData, src = "yahoo", from = startDate)
       }
    #Specify the catch function, and the finally function
   , error = function(e) print(e))
 }
}

#Lets save the stock data to a data file
tryCatch(
{
save(stockData, file=savefilename)
cat("Sucessfully saved the stock data to %s",savefilename)
}
, error = function(e) print(e))

3 ответа

Настройка тестовой среды e содержащий IBM и MSFT. Затем дан вектор этих запасов плюс использование GOOG и TSLA setdiff исключить те, которые уже в e загрузка остатка:

# test data
e <- new.env()
stks <- c("IBM", "MSFT", "GOOG", "TSLA")
getSymbols(stks[1:2], env = e)

# run
rest <- setdiff(stks, ls(e))
getSymbols(rest, env = e)

Является ли процесс создания новой среды для ваших данных (stockData <- new.env()) типично для этой функции?

Ваш for цикл на самом деле не присваивает никаких объектов, он просто печатает результат getSymbols, Вы можете хранить их в списке, т.е.

stockData[i] <- getSymbols(<stuff>)

В сторону: рассмотрим более новый tidyquant пакет, в котором сохраняются те же результаты в формате Tidy (tibble): https://github.com/mdancho84/tidyquant

Если я понимаю вопрос, вы в конечном итоге пытаетесь получить цены акций для каждой акции в индексе. Это хороший пример использования tidyquant пакет, так как пакет уже имеет встроенную обработку ошибок. Ошибки возвращаются как NA, и удаляются из результатов при предоставлении пользователю предупреждающего сообщения.

Попробуйте это из tidyquant пакет, v0.3.0 (текущая версия CRAN):

    library(tidyquant)
    sp_500 <- tq_get("SP500", get = "stock.index") %>%
        tq_get(get = "stock.prices")

Обратите внимание, что фрагмент кода выше меняется. Мы осуждаем get = "stock.index" вариант из tq_get() для отдельной индексной функции, tq_index(), Вот что будет в следующей версии CRAN, и что будет выпущено в версии dev, v0.3.0.9030:

    library(tidyquant)
    sp_500 <- tq_index("SP500") %>%
        tq_get(get = "stock.prices", complete_cases = TRUE)

По умолчанию complete_cases = TRUE, + Изменить complete_cases = FALSE если вы хотите вернуть значения с NA. Обратите внимание, что NA возвращается, если цены на акции не могут быть получены, например, из-за неправильного символа. Если имеется NA, вы получите "вложенный" фрейм данных и предупреждающее сообщение с указанием, в каком символе произошла ошибка.

Другие вопросы по тегам