API拉取多层级利润表数据转置DataFrame优化方案问询
优化纳斯达克NKE利润表API数据格式的优雅方案
我通过API拉取纳斯达克NKE公司的年度利润表多层级列表数据,期望将其格式化为以利润表项目作为列、会计期间作为行的DataFrame。现有代码已接近目标,但存储会计期间的第一列未被正确识别,虽可手动调整实现需求,仍希望获得更优雅的解决方案。
原代码
library('httr') library('tidyr') url4 <- "https://api.nasdaq.com/api/company/NKE/financials?frequency=1" response_fin_ann <- GET(url4, add_headers(`User-Agent`= "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/119.0" ,`Accept-Language`= "en-US,en;q=0.5")) api_con_fin_ann <- content(response_fin_ann) api_con_ann_fmt<- tibble(asOf = api_con_fin_ann$data$incomeStatementTable$asOf) %>% reframe(rows = lapply(api_con_fin_ann$data$incomeStatementTable$rows, as.data.frame)) %>% tidyr::unnest(rows) cols<-api_con_fin_ann$data$incomeStatementTable$headers colnames(api_con_ann_fmt) <- cols tst3 <- as.data.frame(t(api_con_ann_fmt)) colnames(tst3) <- tst3[1,] tst3<-tst3[-1, ]
优雅解决方案
优化思路
- 直接从API返回的结构化数据中提取会计期间、利润表项目及对应数据,避免转置后手动调整行/列名的冗余操作
- 利用
dplyr和tidyr的组合完成数据重塑,逻辑更清晰,代码更简洁
优化后代码
library(httr) library(dplyr) library(tidyr) # 拉取NKE年度利润表API数据 url4 <- "https://api.nasdaq.com/api/company/NKE/financials?frequency=1" response_fin_ann <- GET( url4, add_headers( `User-Agent` = "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/119.0", `Accept-Language` = "en-US,en;q=0.5" ) ) api_con_fin_ann <- content(response_fin_ann) income_table <- api_con_fin_ann$data$incomeStatementTable # 构造目标格式的DataFrame result_df <- tibble(会计期间 = income_table$asOf) %>% # 将每个利润表项目转为单独的列 bind_cols( map_dfc(income_table$rows, ~tibble(!!.x$label := .x$value)) ) %>% # 将会计期间设为行索引 column_to_rownames(var = "会计期间") print(result_df)
代码说明
- 数据提取:直接从API返回的
incomeStatementTable中拆分出会计期间asOf和各利润表项目的rows列表 - 列构造:用
map_dfc遍历rows列表,将每个项目的标签设为列名、对应数据设为列值,直接绑定到会计期间列后 - 行索引设置:通过
column_to_rownames一步完成会计期间到行索引的转换,无需手动处理转置后的行/列名
内容的提问来源于stack exchange,提问作者RDS
相关产品推荐
相关产品推荐

