【问题标题】:Why isn't my for-loop reassigning the data frame each time?为什么我的 for 循环不是每次都重新分配数据帧?
【发布时间】:2019-09-11 02:31:22
【问题描述】:

我正在尝试从我拥有的列表中筛选出不满足一定水平的积极趋势存在条件的股票。我通过要求时间和股票价格之间的相关系数至少为 0.4 来做到这一点,这意味着应该存在某种程度的积极趋势。

我将 for 循环与 if else 语句相结合,以便检查列表中每只股票的相关性。我的目标是,如果股票的相关性 > .4,它将保留在列表中,否则我将过滤到新的数据框 Stock_list 并过滤数据,以便除了被拒绝的股票之外的所有代码都将保留。但是,我发现即使满足 else 条件,也没有应用过滤器。此外,我添加到 else 条件中要求它打印“rejected”的第二部分运行成功。我真的很困惑为什么会出现这个问题。我将 google.drive 链接附加到我正在使用的 CSV。它的空间很小——只有大约 400 行和 6 列。

https://drive.google.com/file/d/1h4E6yg9U6oDeKUvsWhsQbFlxL3a6Fx-K/view?usp=sharing

我已经以我能想象到的所有方式对代码进行了调整(虽然不多,但仍然需要相当长的时间),但我根本无法让它工作。我不知道为什么没有在循环的每次迭代中应用过滤器。我正在使用 quantmod 来提取历史股票数据。

library(tidyverse)
library(quantmod)


    Stocks <- read_csv("2018-19-KWHS-Approved-Securities.csv")
    Stocks <- filter(Stocks, EXCHANGE == "New York Stock Exchange" |  EXCHANGE == "NASDAQ Stock Market" | EXCHANGE == "NASDAQ - Industrial" | EXCHANGE == "NASDAQ Bank - Insurance" | EXCHANGE == "NYSE MKT LLC")
    Stocks <- read_csv("2018-19-KWHS-Approved-Securities.csv")
Stocks <- filter(Stocks, EXCHANGE == "New York Stock Exchange" |  EXCHANGE == "NASDAQ Stock Market" | EXCHANGE == "NASDAQ - Industrial" | EXCHANGE == "NASDAQ Bank - Insurance" | EXCHANGE == "NYSE MKT LLC")
Stocks <- filter(Stocks, TICKER != "AMCN" & TICKER != "CHKE" & TICKER != "DFBG" & TICKER != "GPIC" & TICKER != "NTRI" & TICKER != "BORN" & TICKER != "WMIH" & TICKER != "DWDP" & TICKER != "TAHO" & TICKER != "LABL" & TICKER != "SMI " & TICKER != "UTSI" & TICKER != "SMI")

    Stock_List <- Stocks


    Stock_filter <- function (na.rm = TRUE) {


      for (i in seq_along(Stocks$TICKER)){
    z <- getSymbols.yahoo(Stocks$TICKER[i],
                          globalenv(),
                          index.class = 'Date',
                          fr0m = "2018-01-01",
                          to = Sys.Date(), header = TRUE,
                          periodicity = "daily",
                          curl.options = list(),  auto.assign = FALSE)
    z <- data.frame(date=index(z), coredata(z))  
    names(z)[5]<- "Close_Price" 
    z <- transform(z, date = as.numeric(date))

    x <<- Stocks$TICKER[i]
    if (cor(z$Close_Price, z$date) > .4) {print(x)}
    else {Stock_List <<- Stocks %>% filter(TICKER != x)
    print("Rejected")}
    }}

我已将数据集调整为无错误,但如前所述,我希望过滤器在满足 else 条件的每次迭代中发生,但这根本不会发生。

【问题讨论】:

    标签: r


    【解决方案1】:

    当我添加以下代码行时,它会运行并给出结果,但出现错误......你得到了什么?

    Stock_filter(Stock_List)
    
    WARNING: There have been significant changes to Yahoo Finance data.
    Please see the Warning section of ‘?getSymbols.yahoo’ for details.
    
    This message is shown once per session and may be disabled by setting
    options("getSymbols.yahoo.warning"=FALSE).
    [1] "Rejected"
    [1] "Rejected"
    [1] "AMZN"
    [1] "Rejected"
    [1] "AOBC"
    [1] "APTV"
    [1] "Rejected"
    [1] "Rejected"
    [1] "Rejected"
    [1] "BBY"
    

    ... ...

    [1] "MSFT"
    [1] "NTES"
    [1] "ORCL"
    [1] "SINA"
    [1] "Rejected"
    [1] "Rejected"
    [1] "Rejected"
    [1] "Rejected"
    Error in if (cor(z$Close_Price, z$date) > 0.4) { : 
      missing value where TRUE/FALSE needed
    In addition: Warning message:
    UTSI contains missing values. Some functions will not work if objects contain missing values in the middle of the series. Consider using na.omit(), na.approx(), na.fill(), etc to remove or replace them. 
    > 
    

    【讨论】:

    • 我添加了过滤器以帮助删除一些错误数据。您可以使用问题中的当前代码再试一次吗?
    • @rocbak 请在程序底部添加“Stock_filter(Stock_List)”一行代码。并运行它。你的预期结果是什么? stock_filter 是一个函数,它只在原始代码中定义,但从未执行过。这就是为什么需要添加一行代码来执行过滤器的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多