Структурирование загруженного файла JSON в R - PullRequest
0 голосов
/ 04 октября 2018

Я загрузил исторический временной ряд отчета Apple о доходах с этого сайта:

https://financialmodelingprep.com/api/financials/income-statement/AAPL

Используя этот код:

library(RJSONIO)
library(RCurl)
raw_data <- getURL("https://financialmodelingprep.com/api/financials/income-statement/AAPL")

> *"<pre>{\n  \"AAPL\":{\n    \"Revenue\": {\n            
>       \"2013-09\": \"170910\",\
>       \"2014-09\": \"182795\",\n 
>       \"2015-09\": \"233715\",\n 
>       \"2016-09\": \"215639\",\n  
>       \"2017-09\": \"229234\",\n ........"*

Как мненачать структурировать данные (в идеале - во фрейме данных)?

Заранее спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Внедрение строковых функций в HTML - это все равно, что приводить нож в перестрелку (то есть, как правило, не очень хорошая идея).Используйте некоторые базовые преобразования HTML, а затем некоторые целенаправленные споры:

library(rvest)
library(tidyverse)

pg <- read_html("https://financialmodelingprep.com/api/financials/income-statement/AAPL")

html_node(pg, "pre") %>% 
  html_text() %>% 
  jsonlite::fromJSON() -> xdat

map2_df(names(xdat[[1]]), xdat[[1]], ~{
  data_frame(
    measure = .x,
    period = names(.y),
    value = as.numeric(unlist(.y))
  )
}) %>% 
  mutate(company = names(xdat)) %>% 
  select(company, measure, period, value)
## # A tibble: 102 x 4
##    company measure         period    value
##    <chr>   <chr>           <chr>     <dbl>
##  1 AAPL    Revenue         2013-09 170910.
##  2 AAPL    Revenue         2014-09 182795.
##  3 AAPL    Revenue         2015-09 233715.
##  4 AAPL    Revenue         2016-09 215639.
##  5 AAPL    Revenue         2017-09 229234.
##  6 AAPL    Revenue         TTM     239176.
##  7 AAPL    Cost of revenue 2013-09 106606.
##  8 AAPL    Cost of revenue 2014-09 112258.
##  9 AAPL    Cost of revenue 2015-09 140089.
## 10 AAPL    Cost of revenue 2016-09 131376.
## # ... with 92 more rows
0 голосов
/ 05 октября 2018

Я бы использовал jsonlite для анализа данных после удаления тегов pre> из необработанных данных (прерывание процесса синтаксического анализа).Затем вы можете преобразовать полученный список в фрейм данных с tibble, а затем использовать tidyr для удаления всего.

raw_data %>% cat
clean_data <- stringr::str_replace_all(raw_data, '<pre>', '')
aapl_data <- jsonlite::fromJSON(clean_data) %>%
  tibble::enframe() %>%
  dplyr::mutate(value = purrr::map(value, function(x){
    tibble::enframe(x)
  })) %>%
  tidyr::unnest() %>%
  dplyr::mutate(value = purrr::map(value, function(x){ tibble::enframe(x)})) %>%
  tidyr::unnest() %>%
  tidyr::unnest()

вы должны в конечном итогес чем-то вроде этого:

# A tibble: 102 x 4
   name  name1           name2   value 
   <chr> <chr>           <chr>   <chr> 
 1 AAPL  Revenue         2013-09 170910
 2 AAPL  Revenue         2014-09 182795
 3 AAPL  Revenue         2015-09 233715
 4 AAPL  Revenue         2016-09 215639
 5 AAPL  Revenue         2017-09 229234
 6 AAPL  Revenue         TTM     239176
 7 AAPL  Cost of revenue 2013-09 106606
 8 AAPL  Cost of revenue 2014-09 112258
 9 AAPL  Cost of revenue 2015-09 140089
10 AAPL  Cost of revenue 2016-09 131376
# ... with 92 more rows
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...