【问题标题】:Converting Python code that reads in and manipulates CSV to R code将读取和操作 CSV 的 Python 代码转换为 R 代码
【发布时间】:2021-10-07 06:12:54
【问题描述】:

以下是 Python 中的代码,它从 url 读取 CSV 并隔离“股票代码”,然后将其转换为列表。我是 R 的新手,我希望有一种简单、快速的方法可以将这个 Python 代码转换为 R,然后再深入了解自己。

# Read contents of csv link into string variable

cboe_csv_link = 'https://www.cboe.com/available_weeklys/get_csv_download/'
output = requests.get(cboe_csv_link).text

# Find number of rows before string

find_str = "Available Weeklys - Exchange Traded Products (ETFs and ETNs)"
# Find index of search string in output
idx = output.find(find_str)
# Count number of newlines until search string is encountered
skiprows_val = output[:idx+len(find_str)].count("\n")

# Filter out rows and columns to isolate ticker symbols

cboe_csv = pd.read_csv(cboe_csv_link, skiprows=skiprows_val, usecols=[0], header=None)
tickers_df = cboe_csv[(cboe_csv[0] != 'Available Weeklys - Exchange Traded Products (ETFs and ETNs)')
                      & (cboe_csv[0] != 'Available Weeklys - Equity')]
# Convert dataframe column to list
tickers = tickers_df[0].tolist()

【问题讨论】:

  • 男孩。那是一种额外愚蠢的文件格式。我可能只是下载文件,然后使用 sed 或 awk 提取相关的三个块(每个块由其标题标识)并使用普通 csv 阅读器从 sed 或 awk 流中读取相应的块。

标签: r list csv


【解决方案1】:

这是解决问题的一种可能方法:

library(magrittr)

tickers = readLines("https://www.cboe.com/available_weeklys/get_csv_download/") %>%  
  gsub(pattern='"', replacement="") %>% 
  subset(nzchar(.) & !grepl("Available Weekly|\\d+/\\d+/\\d+", .)) %>% 
  sub(pattern="([A-Z]+).+", replacement="\\1")

 #  [1] "AMLP"  "ARKF"  "ARKG"  "ARKK"  "ASHR"  "BRZU"  "DIA"   "DUST"  "EEM"  
 # [10] "EFA"   "EMB"   "ERX"   "EWH"   "EWJ"   "EWU"   "EWW"   "EWY"   "EWZ"  
 # [19] "FAS"   "FAZ"   "FEZ"   "FXE"   "FXI"   "FXY"   "GDX"   "GDXJ"  "GLD"  
 # [28] "HYG"   "IAU"   "IBB"   "ICLN"  "IEF"   "INDA"  "ITB"   "IVV"   "IWF"  
 # [37] "IWM"   "IYR"   "JDST"  "JETS"  "JNK"   "JNUG"  "KRE"   "KWEB"  "LABD"
 # ...

【讨论】:

    【解决方案2】:

    不是您的 Python 代码的翻译,但希望是一个公平的解释。

    cboe_csv_link <- "https://www.cboe.com/available_weeklys/get_csv_download/"
    
    rr <- readLines(cboe_csv_link)
    ss <- c(grep("Available Weeklys", rr), length(rr))
    
    l <- list()
    
    for (i in 1:(length(ss)-1)) {
        l[[i]] <- read.csv(text=rr[(ss[i]+1):(ss[i+1]-1)], header=FALSE)
    }
    names(l) <- rr[head(ss, -1)]
    
    lapply(l, head)
    
    # $`Available Weeklys - Exchange Traded Products (ETFs and ETNs)`
    #     V1                                V2
    # 1 AMLP           ALPS ETF TR ALERIAN MLP
    # 2 ARKF         ARK ETF TR FINTECH INNOVA
    # 3 ARKG        ARK ETF TR GENOMIC REV ETF
    # 4 ARKK         ARK ETF TR INNOVATION ETF
    # 5 ASHR       DBX ETF TR XTRACK HRVST CSI
    # 6 BRZU DIREXION SHS ETF TR BRZ BL 2X SHS
    # 
    # $`Available Weeklys - Equity`
    #     V1                              V2
    # 1   AA                  ALCOA CORP COM
    # 2  AAL    AMERICAN AIRLS GROUP INC COM
    # 3 AAOI APPLIED OPTOELECTRONICS INC COM
    # 4 AAPL                   APPLE INC COM
    # 5 ABBV                  ABBVIE INC COM
    # 6  ABC      AMERISOURCEBERGEN CORP COM
    

    【讨论】:

      【解决方案3】:

      这里的方法略有不同。首先我们将数据下载到一个文件中,比如weeklysmf.csv

      > url <- "https://www.cboe.com/available_weeklys/get_csv_download/"
      > download.file(url, "weeklysmf.csv", quiet=TRUE)
      >
      

      然后我们使用这样一个事实,即您感兴趣的所有行恰好有两个字段,用逗号分隔。使用这个awk 调用过滤所有包含两个字段的行,使用, 作为字段分隔符:

      $ awk -F, 'NF==2 {print $0}' weeklysmf.csv |head        
      "AMLP","ALPS ETF TR ALERIAN MLP"            
      "ARKF","ARK ETF TR FINTECH INNOVA"        
      "ARKG","ARK ETF TR GENOMIC REV ETF"     
      "ARKK","ARK ETF TR INNOVATION ETF"
      "ASHR","DBX ETF TR XTRACK HRVST CSI"
      "BRZU","DIREXION SHS ETF TR BRZ BL 2X SHS"         
      "DIA","SPDR DOW JONES INDL AVERAGE ET UT SER 1"
      "DUST","DIREXION SHS ETF TR DAILY GOLD MINER"
      "EEM","ISHARES TR MSCI EMG MKT ETF"         
      "EFA","ISHARES TR MSCI EAFE ETF"            
      $
      

      我们可以将它与 R 中的许多 csv 阅读器一起使用,它们可以从命令中读取(因为 R 提供了一个连接接口,其中 pipe() 是一个选项,file()url() 也是如此)。我喜欢data.table 所以这就变成了

      > dat <- data.table::fread(cmd="awk -F, 'NF==2 {print $0}' weeklysmf.csv")
      > dat
           AMLP            ALPS ETF TR ALERIAN MLP
        1: ARKF          ARK ETF TR FINTECH INNOVA
        2: ARKG         ARK ETF TR GENOMIC REV ETF
        3: ARKK          ARK ETF TR INNOVATION ETF
        4: ASHR        DBX ETF TR XTRACK HRVST CSI
        5: BRZU  DIREXION SHS ETF TR BRZ BL 2X SHS
       ---                                        
      611:   YY          JOYY INC ADS REPSTG COM A
      612:    Z      ZILLOW GROUP INC CL C CAP STK
      613:   ZM ZOOM VIDEO COMMUNICATIONS INC CL A
      614: ZNGA                     ZYNGA INC CL A
      615:   ZS                    ZSCALER INC COM
      > 
      

      (如果您愿意,fread 也可以返回 data.frame,有一个选项)。

      【讨论】:

        猜你喜欢
        • 2018-11-05
        • 1970-01-01
        • 2012-04-25
        • 1970-01-01
        • 1970-01-01
        • 2022-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多