Assignment – Web APIs

The task is to choose one of the New York Times APIs, construct an interface in R to read in the JSON data, and transform it into an R DataFrame.

Setting up

I will store the api-key value in an environment variable by using Sys.setenv

library(tidyverse)
library(openintro)
library(httr)
## Warning: package 'httr' was built under R version 4.0.3
library(jsonlite)
## Warning: package 'jsonlite' was built under R version 4.0.3
#Storing the API Key in an environment file
api_key <- Sys.getenv("api_key")

Connecting to the API

To connect to the API, we append the api-key as a query string value to the API URL.

#To connect to the API, we compose the url
url <- paste("https://api.nytimes.com/svc/movies/v2/reviews/picks.json?api-key=",
             api_key, sep="")
res <- GET(url)
data <- fromJSON(rawToChar(res$content))

my_data_frame <- data$results

Analyzing the Data

We begin by taking a look at the data provided by the API:

summary(my_data_frame)
##  display_title      mpaa_rating         critics_pick    byline         
##  Length:20          Length:20          Min.   :1     Length:20         
##  Class :character   Class :character   1st Qu.:1     Class :character  
##  Mode  :character   Mode  :character   Median :1     Mode  :character  
##                                        Mean   :1                       
##                                        3rd Qu.:1                       
##                                        Max.   :1                       
##    headline         summary_short      publication_date   opening_date      
##  Length:20          Length:20          Length:20          Length:20         
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##  date_updated      
##  Length:20         
##  Class :character  
##  Mode  :character  
##                    
##                    
##                    
##      link.type            link.url       link.suggested_link_text
##  Length:20           Length:20           Length:20               
##  Class :character    Class :character    Class :character        
##  Mode  :character    Mode  :character    Mode  :character        
##                                                                  
##                                                                  
##                                                                  
##   multimedia.type      multimedia.src     multimedia.width   multimedia.height 
##  Length:20           Length:20           Min.   :210         Min.   :140       
##  Class :character    Class :character    1st Qu.:210         1st Qu.:140       
##  Mode  :character    Mode  :character    Median :210         Median :140       
##  NA                  NA                  Mean   :210         Mean   :140       
##  NA                  NA                  3rd Qu.:210         3rd Qu.:140       
##  NA                  NA                  Max.   :210         Max.   :140
knitr::kable(head(my_data_frame))
## Warning in `[<-.data.frame`(`*tmp*`, , j, value = structure(list(type =
## structure(c("article", : provided 3 variables to replace 1 variables
## Warning in `[<-.data.frame`(`*tmp*`, , j, value = structure(list(type =
## structure(c("mediumThreeByTwo210", : provided 4 variables to replace 1 variables
display_title mpaa_rating critics_pick byline headline summary_short publication_date opening_date date_updated link multimedia
What the Constitution Means to Me 1 Elisabeth Vincentelli ‘What the Constitution Means to Me’ Review: Pursuits of Happiness The timing could not be better for Heidi Schreck’s affecting play about the Constitution’s impact on our daily lives, now streaming on Amazon. 2020-10-22 2020-10-16 2020-10-22 17:12:02 article mediumThreeByTwo210
Synchronic R 1 Glenn Kenny ‘Synchronic’ Review: Twisted, Trippy Trips Through Time The filmmakers Justin Benson and Aaron Moorhead bend reality in this drug-fueled sci-fi horror. 2020-10-22 2020-10-23 2020-10-24 16:44:16 article mediumThreeByTwo210
Ham on Rye 1 Glenn Kenny ‘Ham on Rye’ Review: Coming of Age, With Existential Unease Tyler Taormina’s debut film starts in the vein of classic high-school comedies until it turns toward a dark surrealism. 2020-10-22 NA 2020-10-22 11:04:07 article mediumThreeByTwo210
Belly of the Beast 1 Lovia Gyarkye ‘Belly of the Beast’ Review: Fighting for Incarcerated Women Erika Cohn’s new documentary focuses on the sterilization of women in California prisons, and the battle for a law against the practice. 2020-10-15 NA 2020-10-15 16:02:02 article mediumThreeByTwo210
White Riot 1 Glenn Kenny ‘White Riot’ Review: When Punk’s Stars Banded Against Racism Rubika Shah’s documentary about the British organization Rock Against Racism is a compelling depiction of political organizing in the 1970s. 2020-10-15 NA 2020-10-15 11:04:06 article mediumThreeByTwo210
Martin Eden 1 Manohla Dargis ‘Martin Eden’ Review: Reading and Writing His Way Out of the Pit In this bold adaptation of the Jack London novel, a young writer suffers, fights and pays as he stands alone against the world. 2020-10-15 2020-10-16 2020-10-15 11:04:08 article mediumThreeByTwo210

Because we used the Movies API to only get critic’s picks, we see the pick column value is always one.

Let’s count the movies by rating:

movies_ratings <- my_data_frame %>%
  count(mpaa_rating) %>%
  mutate(p = n /sum(n)) 

movies_ratings$mpaa_rating[1] <- "No Rating"
knitr::kable(movies_ratings)
mpaa_rating n p
No Rating 13 0.65
PG 1 0.05
PG-13 2 0.10
R 4 0.20
ggplot(data=my_data_frame, aes(x=mpaa_rating, stat="count")) + 
 geom_bar()

Conclusion

It appears that most of the NY Times Critic’s picks are not rated by the MPAA. Further analysis could be done to try to infer the probability of a movie being picked by a critic based on its description (to try to determine its genre and other descriptive features).

LS0tDQp0aXRsZTogIkRTNjA3LUhXOCINCmF1dGhvcjogIkdlb3JnZSBDcnV6Ig0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0OiBvcGVuaW50cm86OmxhYl9yZXBvcnQNCi0tLQ0KIyBBc3NpZ25tZW50IOKAkyBXZWIgQVBJcw0KDQpUaGUgdGFzayBpcyB0byBjaG9vc2Ugb25lIG9mIHRoZSBOZXcgWW9yayBUaW1lcyBBUElzLCBjb25zdHJ1Y3QgYW4gaW50ZXJmYWNlIGluIFIgdG8gcmVhZCBpbiB0aGUgSlNPTiBkYXRhLCBhbmQNCnRyYW5zZm9ybSBpdCBpbnRvIGFuIFIgRGF0YUZyYW1lLg0KDQojIyMgU2V0dGluZyB1cA0KDQpJIHdpbGwgc3RvcmUgdGhlIGFwaS1rZXkgdmFsdWUgaW4gYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgYnkgdXNpbmcgU3lzLnNldGVudg0KDQpgYGB7ciBsb2FkLXBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KG9wZW5pbnRybykNCmxpYnJhcnkoaHR0cikNCmxpYnJhcnkoanNvbmxpdGUpDQoNCiNTdG9yaW5nIHRoZSBBUEkgS2V5IGluIGFuIGVudmlyb25tZW50IGZpbGUNCmFwaV9rZXkgPC0gU3lzLmdldGVudigiYXBpX2tleSIpDQpgYGANCg0KIyMjIENvbm5lY3RpbmcgdG8gdGhlIEFQSQ0KVG8gY29ubmVjdCB0byB0aGUgQVBJLCB3ZSBhcHBlbmQgdGhlIGFwaS1rZXkgYXMgYSBxdWVyeSBzdHJpbmcgdmFsdWUgdG8gdGhlIEFQSSBVUkwuDQoNCmBgYHtyfQ0KI1RvIGNvbm5lY3QgdG8gdGhlIEFQSSwgd2UgY29tcG9zZSB0aGUgdXJsDQp1cmwgPC0gcGFzdGUoImh0dHBzOi8vYXBpLm55dGltZXMuY29tL3N2Yy9tb3ZpZXMvdjIvcmV2aWV3cy9waWNrcy5qc29uP2FwaS1rZXk9IiwNCiAgICAgICAgICAgICBhcGlfa2V5LCBzZXA9IiIpDQpyZXMgPC0gR0VUKHVybCkNCmRhdGEgPC0gZnJvbUpTT04ocmF3VG9DaGFyKHJlcyRjb250ZW50KSkNCg0KbXlfZGF0YV9mcmFtZSA8LSBkYXRhJHJlc3VsdHMNCmBgYA0KDQoNCiMjIyBBbmFseXppbmcgdGhlIERhdGENCldlIGJlZ2luIGJ5IHRha2luZyBhIGxvb2sgYXQgdGhlIGRhdGEgcHJvdmlkZWQgYnkgdGhlIEFQSToNCg0KYGBge3J9DQoNCnN1bW1hcnkobXlfZGF0YV9mcmFtZSkNCmBgYA0KDQoNCmBgYHtyfQ0Ka25pdHI6OmthYmxlKGhlYWQobXlfZGF0YV9mcmFtZSkpDQpgYGANCg0KQmVjYXVzZSB3ZSB1c2VkIHRoZSBNb3ZpZXMgQVBJIHRvIG9ubHkgZ2V0IGNyaXRpYydzIHBpY2tzLCB3ZSBzZWUgdGhlIHBpY2sgY29sdW1uIHZhbHVlIGlzIGFsd2F5cyBvbmUuIA0KDQpMZXQncyBjb3VudCB0aGUgbW92aWVzIGJ5IHJhdGluZzogDQpgYGB7cn0NCm1vdmllc19yYXRpbmdzIDwtIG15X2RhdGFfZnJhbWUgJT4lDQogIGNvdW50KG1wYWFfcmF0aW5nKSAlPiUNCiAgbXV0YXRlKHAgPSBuIC9zdW0obikpIA0KDQptb3ZpZXNfcmF0aW5ncyRtcGFhX3JhdGluZ1sxXSA8LSAiTm8gUmF0aW5nIg0Ka25pdHI6OmthYmxlKG1vdmllc19yYXRpbmdzKQ0KYGBgDQoNCg0KYGBge3IgY29kZS1jaHVuay1sYWJlbH0NCmdncGxvdChkYXRhPW15X2RhdGFfZnJhbWUsIGFlcyh4PW1wYWFfcmF0aW5nLCBzdGF0PSJjb3VudCIpKSArIA0KIGdlb21fYmFyKCkNCmBgYA0KDQojIyMgQ29uY2x1c2lvbg0KSXQgYXBwZWFycyB0aGF0IG1vc3Qgb2YgdGhlIE5ZIFRpbWVzIENyaXRpYydzIHBpY2tzIGFyZSBub3QgcmF0ZWQgYnkgdGhlIE1QQUEuICBGdXJ0aGVyIGFuYWx5c2lzIGNvdWxkIGJlIGRvbmUgdG8gdHJ5IHRvIGluZmVyIHRoZSBwcm9iYWJpbGl0eSBvZiBhIG1vdmllIGJlaW5nIHBpY2tlZCBieSBhIGNyaXRpYyBiYXNlZCBvbiBpdHMgZGVzY3JpcHRpb24gKHRvIHRyeSB0byBkZXRlcm1pbmUgaXRzIGdlbnJlIGFuZCBvdGhlciBkZXNjcmlwdGl2ZSBmZWF0dXJlcykuDQoNCg0KDQouLi4NCg0K