我正在嘗試使用某些股票獲取資料,當我只為 1 只股票做時它就起作用了。但是,當我嘗試將其自動化以列出多個股票代碼時,我沒有得到結果quantmod
下面的代碼通過將其設為靜態來僅獲取 1 個股票代碼資料:
library(tidyverse)
library(quantmod)
# Creating Empty dataframe to collect final results
df_append <- setNames(data.frame(matrix(ncol = 8, nrow = 0)),
c("Date", "Symbol", "Open","High","Low","Close","Volume","Adjusted"))
fetch_stock_data_fn <- function(){
# Fetching Stock data for each symbol
df_quant <- quantmod::getSymbols(Symbols = "SHREECEM.NS", src="yahoo",
from = "2021-05-01",auto.assign = F) %>%
# converting time series to dataframe
data.frame(as.matrix(.), Date=time(.), row.names = NULL) %>%
# Adding Symbol Column
mutate(Symbol = "SHREECEM.NS",
Symbol = str_remove(Symbol, ".NS")) %>%
select(Date,Symbol,everything())
# Removing String from Column Names
for (col in 3: ncol(df_quant)){
colnames(df_quant)[col] <- str_remove(colnames(df_quant)[col],"SHREECEM.NS.")
}
# Selecting Required columns only
df_quant <- df_quant %>%
select(Date:Adjusted)
# Append data to final dataframe
df_append <- rbind(df_append,df_quant)
return(df_append)
}
fetch_stock_data_fn()
現在,當我嘗試修改它以接受多個符號的股票代碼名稱時,我沒有得到結果。我想我已經接近解決方案了,但在將它們作為函式呼叫中的引數傳遞時可能會弄亂引號中的名稱:
library(tidyverse)
library(quantmod)
# Creating Empty dataframe to collect final results
df_append <- setNames(data.frame(matrix(ncol = 8, nrow = 0)),
c("Date", "Symbol", "Open","High","Low","Close","Volume","Adjusted"))
fetch_stock_data_fn <- function(stock_name){
# Fetching Stock data for each symbol
df_quant <- quantmod::getSymbols(Symbols = {{stock_name}}, src="yahoo",
from = "2021-05-01",auto.assign = F) %>%
# converting time series to dataframe
data.frame(as.matrix(.), Date=time(.), row.names = NULL) %>%
# Adding Symbol Column
mutate(Symbol = {{stock_name}},
Symbol = str_remove(Symbol, ".NS")) %>%
select(Date,Symbol,everything())
# Removing String from Column Names
for (col in 3: ncol(df_quant)){
colnames(df_quant)[col] <- str_remove(colnames(df_quant)[col],paste0({{stock_name}},"."))
}
# Selecting Required columns only
df_quant <- df_quant %>%
select(Date:Adjusted)
# Append data to final dataframe
df_append <- rbind(df_append,df_quant)
return(df_append)
}
呼叫函式:
test_vector <- c("SHREECEM.NS","ADANIPORTS.NS")
for (vec_count in 1: length(test_vector)){
# print(test_vector[vec_count])
fetch_stock_data_fn(test_vector[vec_count])
}
uj5u.com熱心網友回復:
purrr::map_df
您可以通過使用例如擺脫rbind
函式中的 for 和 for 回圈來稍微簡化您的代碼。此外,我rename_with
用來重命名列名,最后恕我直言,{{
因為您正在傳遞字串:
library(tidyverse)
library(quantmod)
fetch_stock_data_fn <- function(stock_name) {
# Fetching Stock data for each symbol
df_quant <- quantmod::getSymbols(
Symbols = stock_name, src = "yahoo",
from = "2021-05-01", auto.assign = F
)
df_quant <- df_quant %>%
# converting time series to dataframe
data.frame(as.matrix(.), Date = time(.), row.names = NULL) %>%
# Adding Symbol Column
mutate(Symbol = str_remove(stock_name, ".NS")) %>%
select(Date, Symbol, everything()) %>%
# Removing String from Column Names
rename_with(~ str_remove(.x, paste0(stock_name, "."))) %>%
select(Date:Adjusted)
return(df_quant)
}
test_vector <- c("SHREECEM.NS", "ADANIPORTS.NS")
df_append <- purrr::map_df(test_vector, fetch_stock_data_fn)
head(df_append)
#> Date Symbol Open High Low Close Volume Adjusted
#> 1 2021-05-03 SHREECEM 27500.00 28080.55 27327.6 27989.85 38741 27817.85
#> 2 2021-05-04 SHREECEM 28111.35 28111.50 27531.0 27753.30 41857 27582.75
#> 3 2021-05-05 SHREECEM 27850.00 28044.40 27713.3 27844.20 24250 27673.09
#> 4 2021-05-06 SHREECEM 27845.00 27946.25 27500.0 27736.20 33337 27565.75
#> 5 2021-05-07 SHREECEM 27847.00 27948.25 27700.0 27840.00 21548 27668.92
#> 6 2021-05-10 SHREECEM 27979.00 28035.15 27238.4 27309.95 49736 27142.12
count(df_append, Symbol)
#> Symbol n
#> 1 ADANIPORTS 338
#> 2 SHREECEM 338
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/506848.html