---
title: 'Guided Project: New York Solar Resource Data'
author: "Dataquest"
date: "11/26/2020"
output: html_document
---

# Finding the Suitable Endpoint and Parameters to Query the API
```{r}
# Storing my api key in a variable
the_key = "" #TODO Store your API key here

# Identifying the API URL
url <- "https://developer.nrel.gov/api/solar/solar_resource/v1.json"

# Specifying the necessary parameters to request the New York City solar data
parameters_list <- list(api_key = the_key, lat = 41, lon = -75)
```

# Extracting the New York Solar Resource Data 
```{r}
# Loading the `httr` package
library(httr)

# Using the `GET()` function to request the data from the API with `url` and `parameters_list`
response <- GET(url, query = parameters_list)

# Tracking errors 
## Displaying the status code with the `status_code()` function
print(status_code(response))

## Displaying the API response format
print(http_type(response))

# Extracting the API response content as text
json_text <- content(response, "text")

# Displaying this content to check how it looks visually.
print(json_text)
```

# Parsing the JSON into R Object
```{r}
# Parsing the `json_text` to a R object using the `jsonlite::fromJSON()` function
json_lists <- jsonlite::fromJSON(json_text)

# Displaying the structure of the R object using the `str()` function
str(json_lists)
```

# How to Create a Datarame from a Complex List

# Building Datarame from a Complex List
```{r}
# Extracting the outputs data
outputs_list <- json_lists$outputs

# Extracting the monthly vector (`monthly`) from the (`avg_dni`) list in the outputs data
avg_dni <- outputs_list$avg_dni$monthly

# Extracting the monthly vector (`monthly`) from the (`avg_ghi`) list in the outputs data
avg_ghi <- outputs_list$avg_ghi$monthly

# Extracting the monthly vector (`monthly`) from the (`avg_lat_tilt`) list in the outputs data
avg_lat_tilt <- outputs_list$avg_lat_tilt$monthly

# Combining the monthly vectors into a dataframe using the `tibble::tibble()` function
## Adding the `month` column containing month abbreviations: `Jan`, `Fev`,...,`Dec`
dataframe <- tibble::tibble("avg_dni" = avg_dni, 
                            "avg_ghi" = avg_ghi, 
                            "avg_lat_tilt" = avg_lat_tilt, 
                            "month" = month.abb)

# Displaying the dataframe
dataframe
```

We can see that all the columns are still lists containing one item. For future use of this dataframe, it would probably be necessary to convert these columns to numeric.

# Extracting Datarame from a Complex List: 
```{r}
# Extracting the outputs list
outputs_list <- json_lists$outputs

# Simplifying the outputs list
simplified_outputs_list <- unlist(outputs_list)

# Restructuring the simplified list into a matrix of 13 rows (the annual value and 12 months values)
data_matrix <- matrix(data = simplified_outputs_list, nrow = 13)

# Removing the annual values from the data matrix
data_matrix <- data_matrix[-1, ]

# Converting the matrix into a dataframe using the `as.data.frame()` function
another_dataframe <- as.data.frame(data_matrix)

# Displaying the dataframe
another_dataframe
```

# Putting all together
```{r}
library(httr)
library(dplyr)
the_key = "" #TODO Store your API key here 

# Creating the custom `nrel_api_json_get_df()` function inspiring from what we did in the previous missions
## The function has two parameters
### The `endpoint` parameter represents the endpoint we need
### The `queries` parameter represents the list of API request parameters.
nrel_api_json_get_df <- function(endpoint, queries = list()) {

  ## Preparing the URL 
  url <- modify_url("https://developer.nrel.gov", path = endpoint)
  
  ## Querying the API
  response <- GET(url, query = queries)

  ## Tracking errors
  if ( http_error(response) ){
    print(status_code(response))
    print(http_status(response))
    stop("Something went wrong.", call. = FALSE)
  }
    
  if (http_type(response) != "application/json") {
    stop("API did not return json", call. = FALSE)
  }
  
  ## Extracting content
  json_text <- content(response, "text")
    
  ## Converting content into Dataframe
  table_lst <- jsonlite::fromJSON(json_text)

  dataframe <- tibble::tibble("avg_dni" = as.numeric(table_lst$outputs$avg_dni$monthly), 
                            "avg_ghi" = as.numeric(table_lst$outputs$avg_ghi$monthly), 
                            "avg_lat_tilt" = as.numeric(table_lst$outputs$avg_lat_tilt$monthly), 
                            "month" = month.abb)
    
  ## Returning the dataframe  
  dataframe
    
}

# Using the custom `nrel_api_json_get_df()` function to extract the solar resource as a dataframe
## Providing the `"api/solar/solar_resource/v1.json"` as the `endpoint` parameter
## Providing the `parameters_list` variable as `queries` parameter
solar_resource_df <- nrel_api_json_get_df("api/solar/solar_resource/v1.json", parameters_list)

# Printing the output dataframe
solar_resource_df
```

# Visualizing New York City Solar Resource Data
```{r}
# Loading the `ggplot2` and `dplyr` packages
library(ggplot2)
library(dplyr)

# Using the `ggplot()` function to plot the `avg_dni` value for each month 
ggplot(data = solar_resource_df,
       aes(x = month, y = avg_dni, group = 1)) +
  geom_line() +
  geom_point() +
  theme_bw()

ggsave("plot_avg_dni_before_factor.svg")

# Converting the `month` column into factor using the following command  
solar_resource_df <- solar_resource_df %>% 
  mutate(month = factor(month, levels = month.abb))

# Replotting the `avg_dni` value for each month 
ggplot(data = solar_resource_df,
       aes(x = month, y = avg_dni, group = 1)) +
  geom_line() +
  geom_point() +
  theme_bw()

ggsave("plot_avg_dni_after_factor.svg")
```

The first plot x-axis is ordered alphabetically, while the second is in the natural order of months, from January to December. 

This operation allows ordering the labels in the plot as we wish.

