Am aflat recent de pe blogul lui Allen Downey că Lumea noastră în date oferă acces API la datele lor. Lumea noastră din date găzduiește seturi de date pe mai multe subiecte importante, de la populație și schimbări demografice, sărăcie și dezvoltare economică, până la drepturile omului și democrația. Din noiembrie 2024, lumea noastră în date „(oferă) URL -uri directe pentru accesarea datelor în format CSV și metadate cuprinzătoare în format JSON” (Aceasta este ceea ce ei numesc ei API de grafic public)
Consultați acest link pentru documentația completă pe API -ul de date grafic. Postarea pe blog a lui Allen Downey arată cum să folosești această API în Python; În această postare voi arăta codul corespunzător în R.
Descărcarea metadatelor
Pagina API -ul Datelor Chart ne spune ce API sunt disponibile pentru noi. Punctul de plecare este o adresă URL de bază pe care o denotăm
. Aceasta este ceea ce ne este disponibil:
– Pagina de pe site -ul web unde puteți vedea graficul.
– Datele pentru acest grafic, de obicei ceea ce vrem să descărcăm..csv
– Metadatele pentru acest grafic, de exemplu, titlul graficului, unitățile, cum să citez sursele de date..metadata.json
– setul de date, metadatele și un fișier de readme ca zip..zip
Să începem să analizăm metadatele pentru temperatura medie lunară a suprafeței:
library(tidyverse) library(httr) library(jsonlite) # define URL and query parameters url <- "https://ourworldindata.org/grapher/average-monthly-surface-temperature.metadata.json" query_params <- list( v = "1", csvType = "full", useColumnShortNames = "true" ) # get metadata headers <- add_headers(`User-Agent` = "Our World In Data data fetch/1.0") response <- GET(url, query = query_params, headers) metadata <- fromJSON(content(response, as = "text", encoding = "UTF-8"))
Obiectul de metadate returnat este o listă cu câteva taste:
# view the metadata keys names(metadata) #> (1) "chart" "columns" "dateDownloaded" "activeFilters"
chart
Elementul ne oferă informații la nivel înalt ale graficului:
glimpse(metadata$chart) #> List of 5 #> $ title : chr "Average monthly surface temperature" #> $ subtitle : chr "The temperature of the air measured 2 meters above the ground, encompassing land, sea, and in-land water surfaces." #> $ citation : chr "Contains modified Copernicus Climate Change Service information (2025)" #> $ originalChartUrl: chr "https://ourworldindata.org/grapher/average-monthly-surface-temperature?v=1&csvType=full&useColumnShortNames=true" #> $ selection : chr "World"
Există mai multe informații despre setul de date din metadata$columns$temperature_2m
names(metadata$columns$temperature_2m) #> (1) "titleShort" "titleLong" "descriptionShort" "descriptionProcessing" "shortUnit" "unit" #> (7) "timespan" "type" "owidVariableId" "shortName" "lastUpdated" "citationShort" #> (13) "citationLong" "fullMetadata"
(De ce temperature_2m
? Uitându -se la metadata$columns$temperature_2m$shortName
se pare că temperature_2m
este numele scurt pentru setul de date.)
Descărcarea setului de date
Aici este descărcarea codului temperatura medie a suprafeței lunare pentru SUA:
# define the URL and query parameters url <- "https://ourworldindata.org/grapher/average-monthly-surface-temperature.csv" query_params <- list( v = "1", csvType = "filtered", useColumnShortNames = "true", tab = "chart", country = "USA" ) # get data headers <- add_headers(`User-Agent` = "Our World In Data data fetch/1.0") response <- GET(url, query = query_params, headers) df <- read_csv(content(response, as = "text", encoding = "UTF-8")) head(df) #> # A tibble: 6 × 6 #> Entity Code year Day temperature_2m...5 temperature_2m...6 #>#> 1 United States USA 1941 1941-12-15 -1.88 8.02 #> 2 United States USA 1942 1942-01-15 -4.78 7.85 #> 3 United States USA 1942 1942-02-15 -3.87 7.85 #> 4 United States USA 1942 1942-03-15 0.0978 7.85 #> 5 United States USA 1942 1942-04-15 7.54 7.85 #> 6 United States USA 1942 1942-05-15 12.1 7.85
Allen Downey observă că ultima coloană este nedocumentată, iar bazată pe context este probabil temperatura medie anuală.
Iată un complot simplu al datelor:
plot(df$Day, df$temperature_2m...5, type = "l", main = "USA ave monthly temperature", xlab = "Date", ylab = "Temperature in C")
Dacă doriți întregul set de date, folosiți doar csvType = "full"
În parametrii de solicitare, la fel ca:
# define the URL and query parameters url <- "https://ourworldindata.org/grapher/average-monthly-surface-temperature.csv" query_params <- list( v = "1", csvType = "full", useColumnShortNames = "true", tab = "chart" ) # same code for the http request works, see above
De unde știi ce filtre puteți aplica? Nu există o documentație extinsă despre filtrele pe care le puteți aplica, dar pe măsură ce faceți clic pe URL -ul de bază pentru a schimba graficul, URL -ul se schimbă. Puteți utiliza acest lucru pentru a deduce parametrii de interogare pentru a adăuga.
De exemplu, am dat clic pe grafic pentru a obține această adresă URL: https://ourworldindata.org/grapher/average-monthly-surface-temperature?tab=chart&time=2001-05-15..2024-05-15&country=owid_wrl ~ Tha. Codul de mai jos arată cum puteți descărca datele și puteți reproduce graficul:
# define the URL and query parameters url <- "https://ourworldindata.org/grapher/average-monthly-surface-temperature.csv" query_params <- list( v = "1", csvType = "filtered", useColumnShortNames = "true", tab = "chart", time = "2001-05-15..2024-05-15", country = "OWID_WRL~THA" ) # get data headers <- add_headers(`User-Agent` = "Our World In Data data fetch/1.0") response <- GET(url, query = query_params, headers) df <- read_csv(content(response, as = "text", encoding = "UTF-8")) ggplot(df) + geom_line(aes(x = Day, y = temperature_2m...5, col = Entity)) + labs(title = "Ave monthly temperature for World & Thailand", x = "Date", y = "Temperature in C") + theme_bw() + theme(legend.position = "bottom")