Цикл по 4 различным культурам для получения данных из USDA NASS с помощью функции API - PullRequest
0 голосов
/ 02 апреля 2019

Я очень плохо знаком с R, и я пытаюсь перебрать 4 разных урожая и загрузить данные для этих культур, используя функцию API из USDA NASS.

У меня есть список из 4 культур: кукуруза, соя, рис и пшеница, и я пытаюсь получить данные о ценах на эти четыре культуры на уровне штата из USDA NASS, используя функцию API. Я пытаюсь сделать это с помощью цикла for, и мне не нужно загружать данные отдельно для каждого урожая.

R коды

library(tidyverse)
library(tidyverse)
library(plyr)
library(dplyr)
library(httr)
library(lubridate)
library(jsonlite)

crops<-c("CORN", "SOYBEANS", "RICE", "WHEAT")
for(i in 1:length(crops)){
  crop<-crops[i]
   #access ag land values data form nass using api
  data_url <- paste(
    "http://quickstats.nass.usda.gov/api/api_GET/?key=my_API_KEY",
    "&commodity_desc=crops",
    "&short_desc=PRICE RECEIVED, MEASURED IN $ / BU",
    "&state_alpha=KS",
    "&year=2017",
    "&format=CSV",
    sep=""
  )
  download.file(data_url, destfile="cropprices.csv")
}

Это иллюстрация моего ожидаемого результата

Year    State   Commodity   Value
2017    ALABAMA WHEAT   4.6
2017    ALASKA  CORN    4.2
2017    ARIZONA CORN    4.55

1 Ответ

0 голосов
/ 03 апреля 2019

Рассмотрите возможность создания фрейма данных всех пар штатов США и культур с использованием expand.grid. Затем используйте Map (обертка для mapply) для поэлементного итерации по данным для загрузки каждого соответствующего CSV. Даже верните read.csv() загруженного csv, чтобы создать список фреймов данных. Вы даже можете добавить год !

К счастью, R имеет встроенный набор данных для штатов США ( state.abb ). Кроме того, поскольку загрузка включает цикл, Sys.sleep() приостанавливает обработку во время загрузки данных. Наконец, поскольку API-интерфейсы включают стороннюю внешнюю обработку, которая может по разным причинам завершиться с ошибкой, используется tryCatch.

proc_download <- function(s, c) {
   cat(paste(s, c, "\n"))       # PRINTS CURRENT LOOPED STATE & CROP TO SCREEN

   tryCatch({
      data_url <- paste0(
          "http://quickstats.nass.usda.gov/api/api_GET/?key=my_API_KEY",
          "&commodity_desc=", c,
          "&short_desc=PRICE RECEIVED, MEASURED IN $ / BU",
          "&state_alpha=", s,
          "&year=2017",
          "&format=CSV"
        )

     my_file <- paste0(s, "_", c, "_prices.csv")
     download.file(data_url, destfile=my_file)
     Sys.sleep(1)              # ADJUSTS SECONDS AS NEEDED

     df <- read.csv(my_file)
     return(df)

  }, error = function(e) {
        print(e)               # PRINTS ERROR MESSAGE TO SCREEN
        return(NA)             
  })
}

state_crops <- expand.grid(state = state.abb, crop = c("CORN", "SOYBEANS", "RICE", "WHEAT"))

# DOWNLOAD DATA AND BUILD LIST OF DATA FRAMES
df_list <- Map(proc_download, state_crops$state, state_crops$crop)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...