From 41e095b1fdc31ea3b9b5a63689c578c8d618e665 Mon Sep 17 00:00:00 2001 From: robinlovelace Date: Fri, 9 Aug 2024 14:14:54 +0100 Subject: [PATCH 01/21] Add local dev info --- README.md | 36 +++++++++++++++++-------- README.qmd | 14 ++++++++++ man/figures/README-disaggregated-1.png | Bin 191037 -> 195435 bytes 3 files changed, 39 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 4e98533..68d5025 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,20 @@ Load it as follows: library(spanishoddata) ``` +Local development: to load the package locally, clone it and navigate to +the root of the package in the terminal, e.g. with the following: + +``` bash +gh repo clone Robinlovelace/spanishoddata +code spanishoddata +``` + +then run the following command from the R console: + +``` r +devtools::load_all() +``` + # Setting the data directory You can specify the data directory globally by setting the @@ -93,16 +107,16 @@ metadata # A tibble: 9,442 × 6 target_url pub_ts file_extension data_ym data_ymd - 1 https://movilidad-o… 2024-07-16 11:22:03 gz NA 2022-10-23 - 2 https://movilidad-o… 2024-07-16 11:18:41 gz NA 2022-10-22 - 3 https://movilidad-o… 2024-07-16 11:15:06 gz NA 2022-10-20 - 4 https://movilidad-o… 2024-07-16 11:11:35 gz NA 2022-10-18 - 5 https://movilidad-o… 2024-07-16 11:07:58 gz NA 2022-10-17 - 6 https://movilidad-o… 2024-07-16 11:04:18 gz NA 2022-10-12 - 7 https://movilidad-o… 2024-07-16 11:00:20 gz NA 2022-10-07 - 8 https://movilidad-o… 2024-07-16 10:56:03 gz NA 2022-08-07 - 9 https://movilidad-o… 2024-07-16 10:51:05 gz NA 2022-08-06 - 10 https://movilidad-o… 2024-07-16 10:46:24 gz NA 2022-08-05 + 1 https://movilidad-o… 2024-07-30 10:54:08 gz NA 2022-10-23 + 2 https://movilidad-o… 2024-07-30 10:51:07 gz NA 2022-10-22 + 3 https://movilidad-o… 2024-07-30 10:47:52 gz NA 2022-10-20 + 4 https://movilidad-o… 2024-07-30 10:14:55 gz NA 2022-10-18 + 5 https://movilidad-o… 2024-07-30 10:11:58 gz NA 2022-10-17 + 6 https://movilidad-o… 2024-07-30 10:09:03 gz NA 2022-10-12 + 7 https://movilidad-o… 2024-07-30 10:05:57 gz NA 2022-10-07 + 8 https://movilidad-o… 2024-07-30 10:02:12 gz NA 2022-08-07 + 9 https://movilidad-o… 2024-07-30 09:58:34 gz NA 2022-08-06 + 10 https://movilidad-o… 2024-07-30 09:54:30 gz NA 2022-08-05 # ℹ 9,432 more rows # ℹ 1 more variable: local_path @@ -174,7 +188,7 @@ od_multi_list[[1]] ``` # Source: SQL [?? x 15] - # Database: DuckDB v0.10.2 [robin@Linux 6.5.0-45-generic:R 4.4.1/:memory:] + # Database: DuckDB v1.0.0 [robin@Linux 6.5.0-45-generic:R 4.4.1/:memory:] fecha periodo origen destino distancia actividad_origen actividad_destino 1 20240307 00 01009_… 01001 0.5-2 frecuente casa diff --git a/README.qmd b/README.qmd index f3d7d0d..f90f42d 100644 --- a/README.qmd +++ b/README.qmd @@ -45,6 +45,20 @@ Load it as follows: library(spanishoddata) ``` +Local development: to load the package locally, clone it and navigate to the root of the package in the terminal, e.g. with the following: + +```bash +gh repo clone Robinlovelace/spanishoddata +code spanishoddata +``` + +then run the following command from the R console: + +```{r} +#| eval: false +devtools::load_all() +``` + # Setting the data directory You can specify the data directory globally by setting the `SPANISH_OD_DATA_DIR` environment variable, e.g. with the following command: diff --git a/man/figures/README-disaggregated-1.png b/man/figures/README-disaggregated-1.png index 8f2a045c5c4e69a114ef288b00e5c5b99e0183d9..73170267809a6015b79d3866d778233cc6535f54 100644 GIT binary patch literal 195435 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%0A>P)Z#bZl*HrKQU{CJ4Tfn^G?xN?$^NR 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%0A19H> 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

Wxz#K{m9cr_NK1G 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

2z{yVn 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


`yF-)6ppBE+_Fxl+UH5 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 Ua%4`*DU6Ds9XhI=Lp>AxZ>gzO3;+NC From 8f217a61e3a18e13d45608188f30052b531b99f7 Mon Sep 17 00:00:00 2001 From: Egor Kotov Date: Fri, 9 Aug 2024 16:14:31 +0200 Subject: [PATCH 02/21] add duckdb powered `spod_get_od_v1()` --- DESCRIPTION | 2 +- R/download_data.R | 13 +- R/duckdb_helpers.R | 200 ++++++++++++++++++ R/folders.R | 7 +- R/get_v1_data.R | 88 ++++++-- R/internal_utils.R | 50 ++++- inst/extdata/sql-queries/provinces-enum.txt | 53 +++++ .../sql-queries/when-recode-provinces.txt | 52 +++++ man/spod_download_data.Rd | 6 +- man/spod_duckdb_od_v1.Rd | 79 +++++++ man/spod_get_od.Rd | 41 ---- man/spod_get_od_v1.Rd | 54 +++++ man/spod_get_valid_dates.Rd | 18 ++ man/spod_get_zones_v1.Rd | 10 +- man/spod_sql_where_dates.Rd | 18 ++ man/spod_subfolder_raw_data_cache.Rd | 18 ++ 16 files changed, 625 insertions(+), 84 deletions(-) create mode 100644 R/duckdb_helpers.R create mode 100644 inst/extdata/sql-queries/provinces-enum.txt create mode 100644 inst/extdata/sql-queries/when-recode-provinces.txt create mode 100644 man/spod_duckdb_od_v1.Rd delete mode 100644 man/spod_get_od.Rd create mode 100644 man/spod_get_od_v1.Rd create mode 100644 man/spod_get_valid_dates.Rd create mode 100644 man/spod_sql_where_dates.Rd create mode 100644 man/spod_subfolder_raw_data_cache.Rd diff --git a/DESCRIPTION b/DESCRIPTION index 142e58a..6048112 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -29,8 +29,8 @@ Imports: lubridate, purrr, readr, - rlang (>= 1.1.0), sf, + stats, stringr, tibble, xml2 diff --git a/R/download_data.R b/R/download_data.R index 10101b3..ed16179 100644 --- a/R/download_data.R +++ b/R/download_data.R @@ -2,7 +2,7 @@ #' #' This function downloads the data files of the specified type, zones, dates and data version. #' @param type The type of data to download. Can be `"origin-destination"` (or ust `"od"`), or `"trips_per_person"` (or just `"tpp"`) for v1 data. For v2 data `"overnight_stays"` (or just `"os"`) is also available. More data types to be supported in the future. See respective codebooks for more information. **ADD CODEBOOKS! to the package** -#' @param zones The zones for which to download the data. Can be `"districts"` (or `"dist"`, `"distr"`) or `"municipalities"` (or `"muni"`, `"municip"`) for v1 data. Additionaly, these can be `"large_urban_areas"` (or `"lau"`) for v2 data. +#' @param zones The zones for which to download the data. Can be `"districts"` (or `"dist"`, `"distr"`, or the original Spanish `"distritos"`) or `"municipalities"` (or `"muni"`, `"municip"`, or the original Spanish `"municipios"`). Additionaly, these can be `"large_urban_areas"` (or `"lau"`, or the original Spanish `"grandes_areas_urbanas"`, or `"gau"`) for v2 data. #' @inheritParams spod_dates_argument_to_dates_seq #' @param data_dir The directory where the data is stored. Defaults to the value returned by `spod_get_data_dir()` which returns the value of the environment variable `SPANISH_OD_DATA_DIR` or a temporary directory if the variable is not set. #' @param quiet Logical. If `TRUE`, the function does not print messages to the console. Defaults to `FALSE`. @@ -31,9 +31,9 @@ spod_download_data <- function( "od", "origin-destination", "os", "overnight_stays", "tpp", "trips_per_person"), - zones = c("districts", "dist", "distr", - "municipalities", "muni", "municip", - "lau", "large_urban_areas"), # implement "urban_areas" for v2 data + zones = c("districts", "dist", "distr", "distritos", + "municipalities", "muni", "municip", "municipios", + "lau", "large_urban_areas", "gau", "grandes_areas_urbanas"), # implement "urban_areas" for v2 data dates = NULL, data_dir = spod_get_data_dir(), quiet = FALSE, @@ -43,13 +43,12 @@ spod_download_data <- function( zones <- match.arg(zones) zones <- spod_zone_names_en2es(zones) - # this is where the date arguments are processed - # for all the wrapper functions that use the spod_download_data() function the dates are also processed here dates_to_use <- spod_dates_argument_to_dates_seq(dates = dates) + # check version # replace this argument with automatic version detection based on the dates requested? - ver <- spod_infer_data_v_from_dates(dates_to_use) # this leads to a second call to an internal spod_get_valid_dates() which in turn causes a second call to spod_available_data_v1() or spod_get_metadata(). This results in reading the xml files with metadata for the second time. This is not optimal and should be fixed. + ver <- spod_infer_data_v_from_dates(dates_to_use) # this leads to a second call to an internal spod_get_valid_dates() which in turn causes a second call to spod_available_data_v1() or spod_get_metadata(). This results in reading thedates_to_use <- spod_dates_argument_to_dates_seq(dates = dates) xml files with metadata for the second time. This is not optimal and should be fixed. if (isFALSE(quiet)) message("Data version detected from dates: ", ver) # convert english data type names to spanish words used in the default data paths diff --git a/R/duckdb_helpers.R b/R/duckdb_helpers.R new file mode 100644 index 0000000..1610ada --- /dev/null +++ b/R/duckdb_helpers.R @@ -0,0 +1,200 @@ + +#' Function to create a duckdb connection to v1 OD data +#' +#' This function creates a duckdb connection to the v1 OD data. +#' @inheritParams spod_download_data +#' @return A duckdb connection object with 3 views: +#' +#' * `all_od_v1_csv_files` - a raw table view of all cached CSV files with the origin-destination data that has benn previosly cached in $SPANISH_OD_DATA_DIR +#' +#' * `od`` - a cleaned-up table view of `all_od_v1_csv_files` with column names and values translated and mapped to English. This still includes all cached data +#' +#' * `od_filtered` - a filtered view of `od` with the desired dates +#' +#' The structure of the cleaned up views `od` and `od_filtered` is as follows: +#' +#' \describe{ +#' \item{full_date}{\code{Date}. The full date of the trip, including year, month, and day.} +#' \item{id_origin}{\code{factor}. The identifier for the origin location of the trip, formatted as a code (e.g., '01001_AM').} +#' \item{id_destination}{\code{factor}. The identifier for the destination location of the trip, formatted as a code (e.g., '01001_AM').} +#' \item{activity_origin}{\code{factor}. The type of activity at the origin location (e.g., 'home', 'work').} +#' \item{activity_destination}{\code{factor}. The type of activity at the destination location (e.g., 'home', 'other').} +#' \item{residence_province}{\code{factor}. The province of residence for the individual making the trip.} +#' \item{time_slot}{\code{integer}. The time slot during which the trip started, represented as an integer (e.g., 0, 1, 2).} +#' \item{distance}{\code{factor}. The distance category of the trip, represented as a code (e.g., '002-005' for 2-5 km).} +#' \item{n_trips}{\code{double}. The number of trips taken within the specified time slot and distance.} +#' \item{trips_total_length_km}{\code{double}. The total length of all trips in kilometers for the specified time slot and distance.} +#' \item{year}{\code{double}. The year of the trip.} +#' \item{month}{\code{double}. The month of the trip.} +#' \item{day}{\code{double}. The day of the trip.} +#' } +#' +#' The structure of the original data in `all_od_v1_csv_files` is as follows: +#' +#' #' \describe{ +#' \item{fecha}{\code{Date}. The date of the trip, including year, month, and day.} +#' \item{origen}{\code{character}. The identifier for the origin location of the trip, formatted as a character string (e.g., '01001_AM').} +#' \item{destino}{\code{character}. The identifier for the destination location of the trip, formatted as a character string (e.g., '01001_AM').} +#' \item{actividad_origen}{\code{character}. The type of activity at the origin location (e.g., 'casa', 'trabajo').} +#' \item{actividad_destino}{\code{character}. The type of activity at the destination location (e.g., 'otros', 'trabajo').} +#' \item{residencia}{\code{character}. The code representing the residence of the individual making the trip (e.g., '01').} +#' \item{edad}{\code{character}. The age of the individual making the trip, if available. This field may contain 'NA' if the age is not recorded.} +#' \item{periodo}{\code{integer}. The time period during which the trip started, represented as an integer (e.g., 0, 1, 2).} +#' \item{distancia}{\code{character}. The distance category of the trip, represented as a character string (e.g., '002-005' for 2-5 km).} +#' \item{viajes}{\code{double}. The number of trips taken within the specified time period and distance.} +#' \item{viajes_km}{\code{double}. The total length of all trips in kilometers for the specified time period and distance.} +#' \item{day}{\code{double}. The day of the trip.} +#' \item{month}{\code{double}. The month of the trip.} +#' \item{year}{\code{double}. The year of the trip.} +#' } +#' +#' @keywords internal +spod_duckdb_od_v1 <- function( + zones = c("districts", "dist", "distr", "distritos", + "municipalities", "muni", "municip", "municipios", + "lau", "large_urban_areas", "gau", "grandes_areas_urbanas"), + dates = NULL, + data_dir = spod_get_data_dir() +) { + ver <- 1 + + csv_folder <- paste0( + data_dir, "/", + spod_subfolder_raw_data_cache(ver = ver), + "/maestra1-mitma-", spod_zone_names_en2es(zones), + "/ficheros-diarios/" + ) + + # create in memory duckdb connection + drv = duckdb::duckdb() + con = DBI::dbConnect(drv, dbdir = ":memory:", read_only = TRUE) + + # create view of csv files and preset variable types + DBI::dbSendStatement(con, + dplyr::sql( + glue::glue( + "CREATE VIEW all_od_v1_csv_files AS SELECT * + FROM read_csv_auto('{csv_folder}**/*.txt.gz', delim='|', header=TRUE, hive_partitioning=TRUE, + columns={{ + 'fecha': 'DATE', + 'origen': 'VARCHAR', 'destino': 'VARCHAR', + 'actividad_origen': 'VARCHAR', 'actividad_destino': 'VARCHAR', + 'residencia': 'VARCHAR', + 'edad': 'VARCHAR', + 'periodo': 'INTEGER', + 'distancia': 'VARCHAR', + 'viajes': 'DOUBLE', 'viajes_km': 'DOUBLE'}}, + dateformat='%Y%m%d');" + ) + ) + ) + + # preview table + # DBI::dbGetQuery(con, "SELECT * FROM all_od_v1_csv_files LIMIT 10") |> dplyr::glimpse() # for debugging + + # create ENUMs + + # zones ENUMs + zones <- spod_zone_names_en2es(zones) + spatial_data <- spod_get_zones_v1(zones, quiet = TRUE) + unique_ids <- unique(spatial_data$id) + DBI::dbSendStatement( + con, + dplyr::sql( + paste0("CREATE TYPE ZONES_ENUM AS ENUM ('", + paste0(unique_ids, collapse = "','"), + "');" + ) + ) + ) + + # create ACTIV_ENUM + DBI::dbSendStatement( + con, + dplyr::sql("CREATE TYPE ACTIV_ENUM AS ENUM ('home', 'work', 'other')") + ) + + # create DISTANCE_ENUM + DBI::dbSendStatement( + con, + dplyr::sql("CREATE TYPE DISTANCE_ENUM AS ENUM ('002-005', '005-010', '010-050', '0005-002', '050-100', '100+');") + ) + + # create INE province ENUM + spod_duckdb_create_province_enum(con) + # DBI::dbGetQuery(con, "SELECT enum_range(NULL::INE_PROV_ENUM)") # check that it was created, remove this line when package is stable + + # create second view with desired data types including ENUMs + # create view to fix variable types and recode values to English + # NOTE: thsi raises non-ASCII character WARNING on R CMD check, so will need to store this query in a text file + # load when_then_provinces from a system file in inst/extdata/sql-queries/when-recode-provinces.txt + when_then_provinces <- readLines(system.file("extdata/sql-queries/when-recode-provinces.txt", package = "spanishoddata")) |> paste(collapse = "\n") + + # now execute the query pasting in the contents of when_then_provinces + DBI::dbSendStatement(con, + dplyr::sql( + "CREATE VIEW od AS SELECT + fecha AS full_date, + CAST(origen AS ZONES_ENUM) AS id_origin, + CAST(destino AS ZONES_ENUM) AS id_destination, + CAST(CASE actividad_origen + WHEN 'casa' THEN 'home' + WHEN 'otros' THEN 'other' + WHEN 'trabajo_estudio' THEN 'work' + END AS ACTIV_ENUM) AS activity_origin, + CAST(CASE actividad_destino + WHEN 'casa' THEN 'home' + WHEN 'otros' THEN 'other' + WHEN 'trabajo_estudio' THEN 'work_or_study' + END AS ACTIV_ENUM) AS activity_destination, + CAST (CASE residencia + {when_then_provinces} + END AS INE_PROV_ENUM) AS residence_province, + periodo AS time_slot, + CAST(distancia AS DISTANCE_ENUM) AS distance, + viajes AS n_trips, + viajes_km AS trips_total_length_km, + year AS year, + month AS month, + day AS day + FROM all_od_v1_csv_files;" + ) + ) + + # preview result for debugging + # DBI::dbGetQuery(con, "SELECT * FROM trips_view LIMIT 10") |> dplyr::glimpse() + + # prepare query to filter by dates + query <- dplyr::sql( + paste0( + "CREATE VIEW od_filtered AS SELECT * FROM od ", + spod_sql_where_dates(dates) + ) + ) + + # create a view with a filter to the desired dates + DBI::dbSendStatement(con, query) + + # preview the new view for debugging + # DBI::dbGetQuery(con, "SELECT * FROM trips LIMIT 10") |> dplyr::glimpse() + + # return the connection as duckdb object + return(con) +} + + +spod_duckdb_create_province_enum <- function(con){ + + # load provinces with non-ASCII names + provinces_enum <- readLines(system.file("extdata/sql-queries/provinces-enum.txt", package = "spanishoddata")) |> paste(collapse = "\n") + # create INE_PROV_ENUM + DBI::dbExecute( + con, + dplyr::sql(paste0( + "CREATE TYPE INE_PROV_ENUM AS ENUM ( + {provinces_enum} + );" + )) + ) + return(con) +} diff --git a/R/folders.R b/R/folders.R index 795a68e..b29e627 100644 --- a/R/folders.R +++ b/R/folders.R @@ -1,6 +1,9 @@ -# change subfolder name for raw data cache here to apply globally +#' Change subfolder name for raw data cache here to apply globally +#' @param ver Integer. The version of the data. Must be 1 or 2. +#' @return Character string with the subfolder name for the raw data cache. +#' @keywords internal spod_subfolder_raw_data_cache <- function(ver = 1) { - rlang:::check_number_whole(ver) + ver <- as.integer(ver) if (!ver %in% c(1, 2)) { stop("Invalid version number. Must be 1 or 2.") } diff --git a/R/get_v1_data.R b/R/get_v1_data.R index 1da532c..9e571d4 100644 --- a/R/get_v1_data.R +++ b/R/get_v1_data.R @@ -128,7 +128,8 @@ spod_available_data_v1 <- function(data_dir = spod_get_data_dir(), #' It can retrieve either "distritos" or "municipios" zones data. #' #' @param data_dir The directory where the data is stored. -#' @param zones The zones for which to download the data. Can be `"districts"` (or `"dist"`, `"distr"`) or `"municipalities"` (or `"muni"`, `"municip"`). +#' @param zones The zones for which to download the data. Can be `"districts"` (or `"dist"`, `"distr"`, or the original Spanish `"distritos"`) or `"municipalities"` (or `"muni"`, `"municip"`, or the original Spanish `"municipios"`). +#' @param quiet Whether to suppress messages. Defaults to `FALSE`. #' @return A spatial object containing the zones data. #' @export #' @examples @@ -136,9 +137,10 @@ spod_available_data_v1 <- function(data_dir = spod_get_data_dir(), #' zones <- spod_get_zones() #' } spod_get_zones_v1 <- function( - zones = c("districts", "dist", "distr", - "municipalities", "muni", "municip"), - data_dir = spod_get_data_dir() + zones = c("districts", "dist", "distr", "distritos", + "municipalities", "muni", "municip", "municipios"), + data_dir = spod_get_data_dir(), + quiet = FALSE ) { zones <- match.arg(zones) zones <- spod_zone_names_en2es(zones) @@ -146,7 +148,7 @@ spod_get_zones_v1 <- function( # check if shp files are already extracted expected_gpkg_path <- fs::path(data_dir, glue::glue("clean_data/v1//zones/{zones}_mitma.gpkg")) if (fs::file_exists(expected_gpkg_path)) { - message("Loading .gpkg file that already exists in data dir: ", expected_gpkg_path) + if (isFALSE(quiet)) message("Loading .gpkg file that already exists in data dir: ", expected_gpkg_path) return(sf::read_sf(expected_gpkg_path)) } @@ -162,14 +164,14 @@ spod_get_zones_v1 <- function( } if (!fs::file_exists(metadata_zones$local_path)) { - message("Downloading the file to: ", metadata_zones$local_path) + if (isFALSE(quiet)) message("Downloading the file to: ", metadata_zones$local_path) downloaded_file <- curl::curl_download(metadata_zones$target_url, destfile = metadata_zones$local_path, mode = "wb", quiet = FALSE) } else { - message("File already exists: ", metadata_zones$local_path) + if (isFALSE(quiet)) message("File already exists: ", metadata_zones$local_path) downloaded_file <- metadata_zones$local_path } - message("Unzipping the file: ", downloaded_file) + if (isFALSE(quiet)) message("Unzipping the file: ", downloaded_file) utils::unzip(downloaded_file, exdir = fs::path_dir(downloaded_file) ) @@ -209,35 +211,81 @@ spod_clean_zones_v1 <- function(zones_path) { } -#' Retrieve the origin-destination v1 data (2020-2021) +#' Load the origin-destination v1 data (2020-2021) for specified dates #' -#' This function retrieves the v1 (2020-2021) origin-destination data from the specified data directory. -#' @param read_fun The function to read the data. Defaults to `duckdb::tbl_file`. +#' This function retrieves the v1 (2020-2021) origin_destination_data for the specified dates. It checks if the requested data is already cached locally and downloads it if it is not. When all the requested data is cached, it creates a `DuckDB` connection to the cache data folder and provides an table #' @inheritParams spod_download_data -#' @return A tibble with the origin-destination data. -spod_get_od <- function( +#' @return A duckdb table connection object. It can be manupulated using `dplyr` verbs, or can be loaded into memory using `dplyr::collect()`. The structure of the object is as follows: +#' +#' \describe{ +#' \item{full_date}{\code{Date}. The full date of the trip, including year, month, and day.} +#' \item{id_origin}{\code{factor}. The identifier for the origin location of the trip, formatted as a code (e.g., '01001_AM').} +#' \item{id_destination}{\code{factor}. The identifier for the destination location of the trip, formatted as a code (e.g., '01001_AM').} +#' \item{activity_origin}{\code{factor}. The type of activity at the origin location (e.g., 'home', 'work').} +#' \item{activity_destination}{\code{factor}. The type of activity at the destination location (e.g., 'home', 'other').} +#' \item{residence_province}{\code{factor}. The province of residence for the individual making the trip.} +#' \item{time_slot}{\code{integer}. The time slot during which the trip started, represented as an integer (e.g., 0, 1, 2).} +#' \item{distance}{\code{factor}. The distance category of the trip, represented as a code (e.g., '002-005' for 2-5 km).} +#' \item{n_trips}{\code{double}. The number of trips taken within the specified time slot and distance.} +#' \item{trips_total_length_km}{\code{double}. The total length of all trips in kilometers for the specified time slot and distance.} +#' \item{year}{\code{double}. The year of the trip.} +#' \item{month}{\code{double}. The month of the trip.} +#' \item{day}{\code{double}. The day of the trip.} +#' } +#' +spod_get_od_v1 <- function( zones = c("districts", "dist", "distr", "municipalities", "muni", "municip"), # add "urban_areas" for v2 data dates = NULL, data_dir = spod_get_data_dir(), - quiet = FALSE, - read_fun = duckdb::tbl_file + quiet = FALSE ) { - # Processing of the date arguments is performed in `spod_download_data()` + # hardcode od as this is a wrapper to get origin-destiation data + type <- "od" zones <- match.arg(zones) + dates <- spod_dates_argument_to_dates_seq(dates = dates) + # use the spot_download_data() function to download any missing data - downloaded_files <- spod_download_data( - type = "od", + spod_download_data( + type = type, zones = zones, dates = dates, - data_dir = data_dir + data_dir = data_dir, + return_output = FALSE ) + # attach the od folder with predefined and cleaned up data types + con <- spod_duckdb_od_v1( + zones = zones, + dates = dates, + data_dir = data_dir + ) - # read data from cached files + # DBI::dbListTables(con) # for debugging only + # dplyr::tbl(con, "trips_view") |> dplyr::glimpse() # for debugging only + # DBI::dbDisconnect(con) # for debugging only + # speed comparison REMOVE a bit later AFTER TESTING + # b1 <- bench::mark(iterations = 5, check = FALSE, + # hive_date = {dplyr::tbl(con, "trips") |> + # dplyr::distinct(full_date) |> + # dplyr::collect()}, # this is prefiltered using custom SQL query using only the columns (year, month, day) that we know are constructed from the hive style partitioning + # full_date = {dplyr::tbl(con, "trips_view") |> + # dplyr::filter(full_date %in% dates) |> + # dplyr::distinct(full_date) |> + # dplyr::collect()} # this is causing DuckDB to scan ALL csv.gz files in the folder because it has to match the desired dates with full_date column + # ) + # bench:::plot.bench_mark(b1, type = "violin") + ggpubr::theme_pubclean(base_size = 24) + # perhaps let's not confuse the user with the duckdb connection, see help for the @return of the spod_duckdb_od_v1() function + # return(con) + + # return the tbl conection for user friendly data manipulation + # this may have an implication that there is no way for the user to properly disconnect the db connection, should think how this can be addressed + # not a problem! can be done with: + # DBI::dbDisconnect(od$src$con) + return(dplyr::tbl(con, "od_filtered")) } diff --git a/R/internal_utils.R b/R/internal_utils.R index 7eca22d..8711e10 100644 --- a/R/internal_utils.R +++ b/R/internal_utils.R @@ -147,9 +147,12 @@ spod_expand_dates_from_regex <- function(date_regex) { return(matching_dates) } - +#' Get valid dates for the specified data version +#' @param ver The version of the data to use. Defaults to 1. Can be 1 or 2. +#' @return A Dates vector of valid dates for the specified data version. +#' @keywords internal spod_get_valid_dates <- function(ver = 1) { - rlang:::check_number_whole(ver) + ver <- as.integer(ver) if (!ver %in% c(1, 2)) { stop("Invalid version number. Must be 1 or 2.") } @@ -174,15 +177,18 @@ spod_get_valid_dates <- function(ver = 1) { spod_zone_names_en2es <- function( - zones = c("districts", "dist", "distr", - "municipalities", "muni", "municip") + zones = c("districts", "dist", "distr", "distritos", + "municipalities", "muni", "municip", "municipios", + "lau", "large_urban_areas", "gau", "grandes_areas_urbanas") ) { zones <- tolower(zones) zones <- match.arg(zones) - if(zones %in% c("districts", "dist", "distr")) { + if (zones %in% c("districts", "dist", "distr", "distritos")) { return("distritos") - } else if(zones %in% c("municipalities", "muni", "municip")) { + } else if (zones %in% c("municipalities", "muni", "municip", "municipios")) { return("municipios") + } else if (zones %in% c("lau", "large_urban_areas", "gau", "grandes_areas_urbanas")) { + return("GAU") } } @@ -197,7 +203,6 @@ spod_match_data_type <- function( "tpp", "trips_per_person"), ver = c(1, 2) ){ - rlang:::check_number_whole(ver) if (!ver %in% c(1, 2)) { stop("Invalid version number. Must be 1 or 2.") } @@ -226,3 +231,34 @@ spod_match_data_type <- function( # need to add a warning here that the type is not recognized return(NULL) } + + +#' Function to generate the SQL query from a sequence of dates +#' @param dates A Dates vector of dates to process. +#' @return A character vector of the SQL query. +#' @keywords internal +spod_sql_where_dates <- function(dates) { + # Extract unique year, month, and day combinations from the dates + date_parts <- data.frame( + year = format(dates, "%Y"), + month = format(dates, "%m"), + day = format(dates, "%d") + ) + + # Get distinct rows and sort them by year, month, and day + date_parts <- date_parts[!duplicated(date_parts), ] + date_parts <- date_parts[order(date_parts$year, date_parts$month, date_parts$day), ] + + # Create the WHERE conditions for each unique date + where_conditions <- stats::aggregate(day ~ year + month, data = date_parts, FUN = function(x) paste(x, collapse = ", ")) + where_conditions$condition <- paste0("(year = ", where_conditions$year, + " AND month = ", where_conditions$month, + " AND day IN (", where_conditions$day, "))") + + # Combine all conditions into a single WHERE clause + sql_query <- paste0("WHERE ", + paste(where_conditions$condition, collapse = " OR ") + ) + + return(sql_query) +} diff --git a/inst/extdata/sql-queries/provinces-enum.txt b/inst/extdata/sql-queries/provinces-enum.txt new file mode 100644 index 0000000..3c2fd6f --- /dev/null +++ b/inst/extdata/sql-queries/provinces-enum.txt @@ -0,0 +1,53 @@ +'UNDEFINED', +'Araba/Álava', +'Albacete', +'Alicante/Alacant', +'Almería', +'Ávila', +'Badajoz', +'Balears, Illes', +'Barcelona', +'Burgos', +'Cáceres', +'Cádiz', +'Castellón/Castelló', +'Ciudad Real', +'Córdoba', +'Coruña, A', +'Cuenca', +'Girona', +'Granada', +'Guadalajara', +'Gipuzkoa', +'Huelva', +'Huesca', +'Jaén', +'León', +'Lleida', +'Rioja, La', +'Lugo', +'Madrid', +'Málaga', +'Murcia', +'Navarra', +'Ourense', +'Asturias', +'Palencia', +'Palmas, Las', +'Pontevedra', +'Salamanca', +'Santa Cruz de Tenerife', +'Cantabria', +'Segovia', +'Sevilla', +'Soria', +'Tarragona', +'Teruel', +'Toledo', +'Valencia/València', +'Valladolid', +'Bizkaia', +'Zamora', +'Zaragoza', +'Ceuta', +'Melilla' diff --git a/inst/extdata/sql-queries/when-recode-provinces.txt b/inst/extdata/sql-queries/when-recode-provinces.txt new file mode 100644 index 0000000..05344cb --- /dev/null +++ b/inst/extdata/sql-queries/when-recode-provinces.txt @@ -0,0 +1,52 @@ +WHEN '01' THEN 'Araba/Álava' +WHEN '02' THEN 'Albacete' +WHEN '03' THEN 'Alicante/Alacant' +WHEN '04' THEN 'Almería' +WHEN '05' THEN 'Ávila' +WHEN '06' THEN 'Badajoz' +WHEN '07' THEN 'Balears, Illes' +WHEN '08' THEN 'Barcelona' +WHEN '09' THEN 'Burgos' +WHEN '10' THEN 'Cáceres' +WHEN '11' THEN 'Cádiz' +WHEN '12' THEN 'Castellón/Castelló' +WHEN '13' THEN 'Ciudad Real' +WHEN '14' THEN 'Córdoba' +WHEN '15' THEN 'Coruña, A' +WHEN '16' THEN 'Cuenca' +WHEN '17' THEN 'Girona' +WHEN '18' THEN 'Granada' +WHEN '19' THEN 'Guadalajara' +WHEN '20' THEN 'Gipuzkoa' +WHEN '21' THEN 'Huelva' +WHEN '22' THEN 'Huesca' +WHEN '23' THEN 'Jaén' +WHEN '24' THEN 'León' +WHEN '25' THEN 'Lleida' +WHEN '26' THEN 'Rioja, La' +WHEN '27' THEN 'Lugo' +WHEN '28' THEN 'Madrid' +WHEN '29' THEN 'Málaga' +WHEN '30' THEN 'Murcia' +WHEN '31' THEN 'Navarra' +WHEN '32' THEN 'Ourense' +WHEN '33' THEN 'Asturias' +WHEN '34' THEN 'Palencia' +WHEN '35' THEN 'Palmas, Las' +WHEN '36' THEN 'Pontevedra' +WHEN '37' THEN 'Salamanca' +WHEN '38' THEN 'Santa Cruz de Tenerife' +WHEN '39' THEN 'Cantabria' +WHEN '40' THEN 'Segovia' +WHEN '41' THEN 'Sevilla' +WHEN '42' THEN 'Soria' +WHEN '43' THEN 'Tarragona' +WHEN '44' THEN 'Teruel' +WHEN '45' THEN 'Toledo' +WHEN '46' THEN 'Valencia/València' +WHEN '47' THEN 'Valladolid' +WHEN '48' THEN 'Bizkaia' +WHEN '49' THEN 'Zamora' +WHEN '50' THEN 'Zaragoza' +WHEN '51' THEN 'Ceuta' +WHEN '52' THEN 'Melilla' diff --git a/man/spod_download_data.Rd b/man/spod_download_data.Rd index 3639bc5..4b54e42 100644 --- a/man/spod_download_data.Rd +++ b/man/spod_download_data.Rd @@ -7,8 +7,8 @@ spod_download_data( type = c("od", "origin-destination", "os", "overnight_stays", "tpp", "trips_per_person"), - zones = c("districts", "dist", "distr", "municipalities", "muni", "municip", "lau", - "large_urban_areas"), + zones = c("districts", "dist", "distr", "distritos", "municipalities", "muni", + "municip", "municipios", "lau", "large_urban_areas", "gau", "grandes_areas_urbanas"), dates = NULL, data_dir = spod_get_data_dir(), quiet = FALSE, @@ -18,7 +18,7 @@ spod_download_data( \arguments{ \item{type}{The type of data to download. Can be \code{"origin-destination"} (or ust \code{"od"}), or \code{"trips_per_person"} (or just \code{"tpp"}) for v1 data. For v2 data \code{"overnight_stays"} (or just \code{"os"}) is also available. More data types to be supported in the future. See respective codebooks for more information. \strong{ADD CODEBOOKS! to the package}} -\item{zones}{The zones for which to download the data. Can be \code{"districts"} (or \code{"dist"}, \code{"distr"}) or \code{"municipalities"} (or \code{"muni"}, \code{"municip"}) for v1 data. Additionaly, these can be \code{"large_urban_areas"} (or \code{"lau"}) for v2 data.} +\item{zones}{The zones for which to download the data. Can be \code{"districts"} (or \code{"dist"}, \code{"distr"}, or the original Spanish \code{"distritos"}) or \code{"municipalities"} (or \code{"muni"}, \code{"municip"}, or the original Spanish \code{"municipios"}). Additionaly, these can be \code{"large_urban_areas"} (or \code{"lau"}, or the original Spanish \code{"grandes_areas_urbanas"}, or \code{"gau"}) for v2 data.} \item{dates}{A \code{character} or \code{Date} vector of dates to process. Kindly keep in mind that v1 and v2 data follow different data collection methodologies and may not be directly comparable. Therefore, do not try to request data from both versions for the same date range. If you need to compare data from both versions, please refer to the respective codebooks and methodology documents. The v1 data covers the period from 2020-02-14 to 2021-05-09, and the v2 data covers the period from 2022-01-01 to the present until further notice. The true dates range is checked against the available data for each version on every function run. diff --git a/man/spod_duckdb_od_v1.Rd b/man/spod_duckdb_od_v1.Rd new file mode 100644 index 0000000..2f73d6d --- /dev/null +++ b/man/spod_duckdb_od_v1.Rd @@ -0,0 +1,79 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/duckdb_helpers.R +\name{spod_duckdb_od_v1} +\alias{spod_duckdb_od_v1} +\title{Function to create a duckdb connection to v1 OD data} +\usage{ +spod_duckdb_od_v1( + zones = c("districts", "dist", "distr", "distritos", "municipalities", "muni", + "municip", "municipios", "lau", "large_urban_areas", "gau", "grandes_areas_urbanas"), + dates = NULL, + data_dir = spod_get_data_dir() +) +} +\arguments{ +\item{zones}{The zones for which to download the data. Can be \code{"districts"} (or \code{"dist"}, \code{"distr"}, or the original Spanish \code{"distritos"}) or \code{"municipalities"} (or \code{"muni"}, \code{"municip"}, or the original Spanish \code{"municipios"}). Additionaly, these can be \code{"large_urban_areas"} (or \code{"lau"}, or the original Spanish \code{"grandes_areas_urbanas"}, or \code{"gau"}) for v2 data.} + +\item{dates}{A \code{character} or \code{Date} vector of dates to process. Kindly keep in mind that v1 and v2 data follow different data collection methodologies and may not be directly comparable. Therefore, do not try to request data from both versions for the same date range. If you need to compare data from both versions, please refer to the respective codebooks and methodology documents. The v1 data covers the period from 2020-02-14 to 2021-05-09, and the v2 data covers the period from 2022-01-01 to the present until further notice. The true dates range is checked against the available data for each version on every function run. + +The possible values can be any of the following: +\itemize{ +\item A single date in ISO (YYYY-MM-DD) or YYYYMMDD format. \code{character} or \code{Date} object. +\item A vector of dates in ISO (YYYY-MM-DD) or YYYYMMDD format. \code{character} or \code{Date} object. Can be any non-consecutive sequence of dates. +\item A date range +\item eigher a \code{character} or \code{Date} object of length 2 with clearly named elements \code{start} and \code{end} in ISO (YYYY-MM-DD) or YYYYMMDD format. E.g. \code{c(start = "2020-02-15", end = "2020-02-17")}; +\item or a \code{character} object of the form \code{YYYY-MM-DD_YYYY-MM-DD} or \code{YYYYMMDD_YYYYMMDD}. For example, \verb{2020-02-15_2020-02-17} or \verb{20200215_20200217}. +\item A regular expression to match dates in the format \code{YYYYMMDD}. \code{character} object. For example, \verb{^202002} will match all dates in February 2020. +}} + +\item{data_dir}{The directory where the data is stored. Defaults to the value returned by \code{spod_get_data_dir()} which returns the value of the environment variable \code{SPANISH_OD_DATA_DIR} or a temporary directory if the variable is not set.} +} +\value{ +A duckdb connection object with 3 views: +\itemize{ +\item \code{all_od_v1_csv_files} - a raw table view of all cached CSV files with the origin-destination data that has benn previosly cached in $SPANISH_OD_DATA_DIR +\item \verb{od`` - a cleaned-up table view of }all_od_v1_csv_files` with column names and values translated and mapped to English. This still includes all cached data +\item \code{od_filtered} - a filtered view of \code{od} with the desired dates +} + +The structure of the cleaned up views \code{od} and \code{od_filtered} is as follows: + +\describe{ +\item{full_date}{\code{Date}. The full date of the trip, including year, month, and day.} +\item{id_origin}{\code{factor}. The identifier for the origin location of the trip, formatted as a code (e.g., '01001_AM').} +\item{id_destination}{\code{factor}. The identifier for the destination location of the trip, formatted as a code (e.g., '01001_AM').} +\item{activity_origin}{\code{factor}. The type of activity at the origin location (e.g., 'home', 'work').} +\item{activity_destination}{\code{factor}. The type of activity at the destination location (e.g., 'home', 'other').} +\item{residence_province}{\code{factor}. The province of residence for the individual making the trip.} +\item{time_slot}{\code{integer}. The time slot during which the trip started, represented as an integer (e.g., 0, 1, 2).} +\item{distance}{\code{factor}. The distance category of the trip, represented as a code (e.g., '002-005' for 2-5 km).} +\item{n_trips}{\code{double}. The number of trips taken within the specified time slot and distance.} +\item{trips_total_length_km}{\code{double}. The total length of all trips in kilometers for the specified time slot and distance.} +\item{year}{\code{double}. The year of the trip.} +\item{month}{\code{double}. The month of the trip.} +\item{day}{\code{double}. The day of the trip.} +} + +The structure of the original data in \code{all_od_v1_csv_files} is as follows: + +#' \describe{ +\item{fecha}{\code{Date}. The date of the trip, including year, month, and day.} +\item{origen}{\code{character}. The identifier for the origin location of the trip, formatted as a character string (e.g., '01001_AM').} +\item{destino}{\code{character}. The identifier for the destination location of the trip, formatted as a character string (e.g., '01001_AM').} +\item{actividad_origen}{\code{character}. The type of activity at the origin location (e.g., 'casa', 'trabajo').} +\item{actividad_destino}{\code{character}. The type of activity at the destination location (e.g., 'otros', 'trabajo').} +\item{residencia}{\code{character}. The code representing the residence of the individual making the trip (e.g., '01').} +\item{edad}{\code{character}. The age of the individual making the trip, if available. This field may contain 'NA' if the age is not recorded.} +\item{periodo}{\code{integer}. The time period during which the trip started, represented as an integer (e.g., 0, 1, 2).} +\item{distancia}{\code{character}. The distance category of the trip, represented as a character string (e.g., '002-005' for 2-5 km).} +\item{viajes}{\code{double}. The number of trips taken within the specified time period and distance.} +\item{viajes_km}{\code{double}. The total length of all trips in kilometers for the specified time period and distance.} +\item{day}{\code{double}. The day of the trip.} +\item{month}{\code{double}. The month of the trip.} +\item{year}{\code{double}. The year of the trip.} +} +} +\description{ +This function creates a duckdb connection to the v1 OD data. +} +\keyword{internal} diff --git a/man/spod_get_od.Rd b/man/spod_get_od.Rd deleted file mode 100644 index 939a4d7..0000000 --- a/man/spod_get_od.Rd +++ /dev/null @@ -1,41 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/get_v1_data.R -\name{spod_get_od} -\alias{spod_get_od} -\title{Retrieve the origin-destination v1 data (2020-2021)} -\usage{ -spod_get_od( - zones = c("districts", "dist", "distr", "municipalities", "muni", "municip"), - dates = NULL, - data_dir = spod_get_data_dir(), - quiet = FALSE, - read_fun = duckdb::tbl_file -) -} -\arguments{ -\item{zones}{The zones for which to download the data. Can be \code{"districts"} (or \code{"dist"}, \code{"distr"}) or \code{"municipalities"} (or \code{"muni"}, \code{"municip"}) for v1 data. Additionaly, these can be \code{"large_urban_areas"} (or \code{"lau"}) for v2 data.} - -\item{dates}{A \code{character} or \code{Date} vector of dates to process. Kindly keep in mind that v1 and v2 data follow different data collection methodologies and may not be directly comparable. Therefore, do not try to request data from both versions for the same date range. If you need to compare data from both versions, please refer to the respective codebooks and methodology documents. The v1 data covers the period from 2020-02-14 to 2021-05-09, and the v2 data covers the period from 2022-01-01 to the present until further notice. The true dates range is checked against the available data for each version on every function run. - -The possible values can be any of the following: -\itemize{ -\item A single date in ISO (YYYY-MM-DD) or YYYYMMDD format. \code{character} or \code{Date} object. -\item A vector of dates in ISO (YYYY-MM-DD) or YYYYMMDD format. \code{character} or \code{Date} object. Can be any non-consecutive sequence of dates. -\item A date range -\item eigher a \code{character} or \code{Date} object of length 2 with clearly named elements \code{start} and \code{end} in ISO (YYYY-MM-DD) or YYYYMMDD format. E.g. \code{c(start = "2020-02-15", end = "2020-02-17")}; -\item or a \code{character} object of the form \code{YYYY-MM-DD_YYYY-MM-DD} or \code{YYYYMMDD_YYYYMMDD}. For example, \verb{2020-02-15_2020-02-17} or \verb{20200215_20200217}. -\item A regular expression to match dates in the format \code{YYYYMMDD}. \code{character} object. For example, \verb{^202002} will match all dates in February 2020. -}} - -\item{data_dir}{The directory where the data is stored. Defaults to the value returned by \code{spod_get_data_dir()} which returns the value of the environment variable \code{SPANISH_OD_DATA_DIR} or a temporary directory if the variable is not set.} - -\item{quiet}{Logical. If \code{TRUE}, the function does not print messages to the console. Defaults to \code{FALSE}.} - -\item{read_fun}{The function to read the data. Defaults to \code{duckdb::tbl_file}.} -} -\value{ -A tibble with the origin-destination data. -} -\description{ -This function retrieves the v1 (2020-2021) origin-destination data from the specified data directory. -} diff --git a/man/spod_get_od_v1.Rd b/man/spod_get_od_v1.Rd new file mode 100644 index 0000000..012ec47 --- /dev/null +++ b/man/spod_get_od_v1.Rd @@ -0,0 +1,54 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/get_v1_data.R +\name{spod_get_od_v1} +\alias{spod_get_od_v1} +\title{Load the origin-destination v1 data (2020-2021) for specified dates} +\usage{ +spod_get_od_v1( + zones = c("districts", "dist", "distr", "municipalities", "muni", "municip"), + dates = NULL, + data_dir = spod_get_data_dir(), + quiet = FALSE +) +} +\arguments{ +\item{zones}{The zones for which to download the data. Can be \code{"districts"} (or \code{"dist"}, \code{"distr"}, or the original Spanish \code{"distritos"}) or \code{"municipalities"} (or \code{"muni"}, \code{"municip"}, or the original Spanish \code{"municipios"}). Additionaly, these can be \code{"large_urban_areas"} (or \code{"lau"}, or the original Spanish \code{"grandes_areas_urbanas"}, or \code{"gau"}) for v2 data.} + +\item{dates}{A \code{character} or \code{Date} vector of dates to process. Kindly keep in mind that v1 and v2 data follow different data collection methodologies and may not be directly comparable. Therefore, do not try to request data from both versions for the same date range. If you need to compare data from both versions, please refer to the respective codebooks and methodology documents. The v1 data covers the period from 2020-02-14 to 2021-05-09, and the v2 data covers the period from 2022-01-01 to the present until further notice. The true dates range is checked against the available data for each version on every function run. + +The possible values can be any of the following: +\itemize{ +\item A single date in ISO (YYYY-MM-DD) or YYYYMMDD format. \code{character} or \code{Date} object. +\item A vector of dates in ISO (YYYY-MM-DD) or YYYYMMDD format. \code{character} or \code{Date} object. Can be any non-consecutive sequence of dates. +\item A date range +\item eigher a \code{character} or \code{Date} object of length 2 with clearly named elements \code{start} and \code{end} in ISO (YYYY-MM-DD) or YYYYMMDD format. E.g. \code{c(start = "2020-02-15", end = "2020-02-17")}; +\item or a \code{character} object of the form \code{YYYY-MM-DD_YYYY-MM-DD} or \code{YYYYMMDD_YYYYMMDD}. For example, \verb{2020-02-15_2020-02-17} or \verb{20200215_20200217}. +\item A regular expression to match dates in the format \code{YYYYMMDD}. \code{character} object. For example, \verb{^202002} will match all dates in February 2020. +}} + +\item{data_dir}{The directory where the data is stored. Defaults to the value returned by \code{spod_get_data_dir()} which returns the value of the environment variable \code{SPANISH_OD_DATA_DIR} or a temporary directory if the variable is not set.} + +\item{quiet}{Logical. If \code{TRUE}, the function does not print messages to the console. Defaults to \code{FALSE}.} +} +\value{ +A duckdb table connection object. It can be manupulated using \code{dplyr} verbs, or can be loaded into memory using \code{dplyr::collect()}. The structure of the object is as follows: + +\describe{ +\item{full_date}{\code{Date}. The full date of the trip, including year, month, and day.} +\item{id_origin}{\code{factor}. The identifier for the origin location of the trip, formatted as a code (e.g., '01001_AM').} +\item{id_destination}{\code{factor}. The identifier for the destination location of the trip, formatted as a code (e.g., '01001_AM').} +\item{activity_origin}{\code{factor}. The type of activity at the origin location (e.g., 'home', 'work').} +\item{activity_destination}{\code{factor}. The type of activity at the destination location (e.g., 'home', 'other').} +\item{residence_province}{\code{factor}. The province of residence for the individual making the trip.} +\item{time_slot}{\code{integer}. The time slot during which the trip started, represented as an integer (e.g., 0, 1, 2).} +\item{distance}{\code{factor}. The distance category of the trip, represented as a code (e.g., '002-005' for 2-5 km).} +\item{n_trips}{\code{double}. The number of trips taken within the specified time slot and distance.} +\item{trips_total_length_km}{\code{double}. The total length of all trips in kilometers for the specified time slot and distance.} +\item{year}{\code{double}. The year of the trip.} +\item{month}{\code{double}. The month of the trip.} +\item{day}{\code{double}. The day of the trip.} +} +} +\description{ +This function retrieves the v1 (2020-2021) origin_destination_data for the specified dates. It checks if the requested data is already cached locally and downloads it if it is not. When all the requested data is cached, it creates a \code{DuckDB} connection to the cache data folder and provides an table +} diff --git a/man/spod_get_valid_dates.Rd b/man/spod_get_valid_dates.Rd new file mode 100644 index 0000000..d4c8367 --- /dev/null +++ b/man/spod_get_valid_dates.Rd @@ -0,0 +1,18 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/internal_utils.R +\name{spod_get_valid_dates} +\alias{spod_get_valid_dates} +\title{Get valid dates for the specified data version} +\usage{ +spod_get_valid_dates(ver = 1) +} +\arguments{ +\item{ver}{The version of the data to use. Defaults to 1. Can be 1 or 2.} +} +\value{ +A Dates vector of valid dates for the specified data version. +} +\description{ +Get valid dates for the specified data version +} +\keyword{internal} diff --git a/man/spod_get_zones_v1.Rd b/man/spod_get_zones_v1.Rd index 79ec9ff..b99d0ef 100644 --- a/man/spod_get_zones_v1.Rd +++ b/man/spod_get_zones_v1.Rd @@ -5,14 +5,18 @@ \title{Retrieves the zones for v1 data} \usage{ spod_get_zones_v1( - zones = c("districts", "dist", "distr", "municipalities", "muni", "municip"), - data_dir = spod_get_data_dir() + zones = c("districts", "dist", "distr", "distritos", "municipalities", "muni", + "municip", "municipios"), + data_dir = spod_get_data_dir(), + quiet = FALSE ) } \arguments{ -\item{zones}{The zones for which to download the data. Can be \code{"districts"} (or \code{"dist"}, \code{"distr"}) or \code{"municipalities"} (or \code{"muni"}, \code{"municip"}).} +\item{zones}{The zones for which to download the data. Can be \code{"districts"} (or \code{"dist"}, \code{"distr"}, or the original Spanish \code{"distritos"}) or \code{"municipalities"} (or \code{"muni"}, \code{"municip"}, or the original Spanish \code{"municipios"}).} \item{data_dir}{The directory where the data is stored.} + +\item{quiet}{Whether to suppress messages. Defaults to \code{FALSE}.} } \value{ A spatial object containing the zones data. diff --git a/man/spod_sql_where_dates.Rd b/man/spod_sql_where_dates.Rd new file mode 100644 index 0000000..19986cf --- /dev/null +++ b/man/spod_sql_where_dates.Rd @@ -0,0 +1,18 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/internal_utils.R +\name{spod_sql_where_dates} +\alias{spod_sql_where_dates} +\title{Function to generate the SQL query from a sequence of dates} +\usage{ +spod_sql_where_dates(dates) +} +\arguments{ +\item{dates}{A Dates vector of dates to process.} +} +\value{ +A character vector of the SQL query. +} +\description{ +Function to generate the SQL query from a sequence of dates +} +\keyword{internal} diff --git a/man/spod_subfolder_raw_data_cache.Rd b/man/spod_subfolder_raw_data_cache.Rd new file mode 100644 index 0000000..373669f --- /dev/null +++ b/man/spod_subfolder_raw_data_cache.Rd @@ -0,0 +1,18 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/folders.R +\name{spod_subfolder_raw_data_cache} +\alias{spod_subfolder_raw_data_cache} +\title{Change subfolder name for raw data cache here to apply globally} +\usage{ +spod_subfolder_raw_data_cache(ver = 1) +} +\arguments{ +\item{ver}{Integer. The version of the data. Must be 1 or 2.} +} +\value{ +Character string with the subfolder name for the raw data cache. +} +\description{ +Change subfolder name for raw data cache here to apply globally +} +\keyword{internal} From 1517a20bd9120559da9948db106d0d9a19c1e142 Mon Sep 17 00:00:00 2001 From: Egor Kotov Date: Fri, 9 Aug 2024 16:58:01 +0200 Subject: [PATCH 03/21] fixes to to pass R cmd check --- DESCRIPTION | 1 + R/duckdb_helpers.R | 96 ++++++++++++++++++++++++---------------- R/get_v1_data.R | 7 +-- man/spod_duckdb_od_v1.Rd | 2 +- man/spod_get_od_v1.Rd | 5 ++- 5 files changed, 68 insertions(+), 43 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 6048112..6e4c3c2 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -23,6 +23,7 @@ Depends: Imports: curl, DBI, + dplyr, duckdb, fs, glue, diff --git a/R/duckdb_helpers.R b/R/duckdb_helpers.R index 1610ada..03c4ee4 100644 --- a/R/duckdb_helpers.R +++ b/R/duckdb_helpers.R @@ -19,7 +19,7 @@ #' \item{id_destination}{\code{factor}. The identifier for the destination location of the trip, formatted as a code (e.g., '01001_AM').} #' \item{activity_origin}{\code{factor}. The type of activity at the origin location (e.g., 'home', 'work').} #' \item{activity_destination}{\code{factor}. The type of activity at the destination location (e.g., 'home', 'other').} -#' \item{residence_province}{\code{factor}. The province of residence for the individual making the trip.} +#' \item{residence_province}{\code{factor}. The province of residence for the individual making the trip (e.g. 'Cuenca', 'Girona').} #' \item{time_slot}{\code{integer}. The time slot during which the trip started, represented as an integer (e.g., 0, 1, 2).} #' \item{distance}{\code{factor}. The distance category of the trip, represented as a code (e.g., '002-005' for 2-5 km).} #' \item{n_trips}{\code{double}. The number of trips taken within the specified time slot and distance.} @@ -58,6 +58,9 @@ spod_duckdb_od_v1 <- function( ) { ver <- 1 + zones <- match.arg(zones) + zones <- spod_zone_names_en2es(zones) + csv_folder <- paste0( data_dir, "/", spod_subfolder_raw_data_cache(ver = ver), @@ -66,8 +69,8 @@ spod_duckdb_od_v1 <- function( ) # create in memory duckdb connection - drv = duckdb::duckdb() - con = DBI::dbConnect(drv, dbdir = ":memory:", read_only = TRUE) + drv <- duckdb::duckdb() + con <- DBI::dbConnect(drv, dbdir = ":memory:", read_only = TRUE) # create view of csv files and preset variable types DBI::dbSendStatement(con, @@ -123,41 +126,49 @@ spod_duckdb_od_v1 <- function( # create INE province ENUM spod_duckdb_create_province_enum(con) # DBI::dbGetQuery(con, "SELECT enum_range(NULL::INE_PROV_ENUM)") # check that it was created, remove this line when package is stable - + # for debugging + # DBI::dbSendStatement(con, "DROP TYPE INE_PROV_ENUM") # remove this line when package is stable + # create second view with desired data types including ENUMs # create view to fix variable types and recode values to English # NOTE: thsi raises non-ASCII character WARNING on R CMD check, so will need to store this query in a text file # load when_then_provinces from a system file in inst/extdata/sql-queries/when-recode-provinces.txt - when_then_provinces <- readLines(system.file("extdata/sql-queries/when-recode-provinces.txt", package = "spanishoddata")) |> paste(collapse = "\n") + when_then_provinces <- readLines( + system.file( + "extdata/sql-queries/when-recode-provinces.txt", + package = "spanishoddata")) |> + paste(collapse = "\n") # now execute the query pasting in the contents of when_then_provinces DBI::dbSendStatement(con, dplyr::sql( - "CREATE VIEW od AS SELECT - fecha AS full_date, - CAST(origen AS ZONES_ENUM) AS id_origin, - CAST(destino AS ZONES_ENUM) AS id_destination, - CAST(CASE actividad_origen - WHEN 'casa' THEN 'home' - WHEN 'otros' THEN 'other' - WHEN 'trabajo_estudio' THEN 'work' - END AS ACTIV_ENUM) AS activity_origin, - CAST(CASE actividad_destino - WHEN 'casa' THEN 'home' - WHEN 'otros' THEN 'other' - WHEN 'trabajo_estudio' THEN 'work_or_study' - END AS ACTIV_ENUM) AS activity_destination, - CAST (CASE residencia - {when_then_provinces} - END AS INE_PROV_ENUM) AS residence_province, - periodo AS time_slot, - CAST(distancia AS DISTANCE_ENUM) AS distance, - viajes AS n_trips, - viajes_km AS trips_total_length_km, - year AS year, - month AS month, - day AS day - FROM all_od_v1_csv_files;" + glue::glue( + "CREATE VIEW od AS SELECT + fecha AS full_date, + CAST(origen AS ZONES_ENUM) AS id_origin, + CAST(destino AS ZONES_ENUM) AS id_destination, + CAST(CASE actividad_origen + WHEN 'casa' THEN 'home' + WHEN 'otros' THEN 'other' + WHEN 'trabajo_estudio' THEN 'work' + END AS ACTIV_ENUM) AS activity_origin, + CAST(CASE actividad_destino + WHEN 'casa' THEN 'home' + WHEN 'otros' THEN 'other' + WHEN 'trabajo_estudio' THEN 'work_or_study' + END AS ACTIV_ENUM) AS activity_destination, + CAST (CASE residencia + {when_then_provinces} + END AS INE_PROV_ENUM) AS residence_province, + periodo AS time_slot, + CAST(distancia AS DISTANCE_ENUM) AS distance, + viajes AS n_trips, + viajes_km AS trips_total_length_km, + year AS year, + month AS month, + day AS day + FROM all_od_v1_csv_files;" + ) ) ) @@ -186,15 +197,26 @@ spod_duckdb_od_v1 <- function( spod_duckdb_create_province_enum <- function(con){ # load provinces with non-ASCII names - provinces_enum <- readLines(system.file("extdata/sql-queries/provinces-enum.txt", package = "spanishoddata")) |> paste(collapse = "\n") + provinces_enum <- readLines( + system.file("extdata/sql-queries/provinces-enum.txt", + package = "spanishoddata")) |> + paste(collapse = "\n") + # create INE_PROV_ENUM - DBI::dbExecute( + DBI::dbSendStatement( con, - dplyr::sql(paste0( - "CREATE TYPE INE_PROV_ENUM AS ENUM ( - {provinces_enum} - );" - )) + dplyr::sql( + glue::glue( + "CREATE TYPE INE_PROV_ENUM AS ENUM ( + {provinces_enum} + );" + ) + ) ) + + # for debugging + # DBI::dbGetQuery(con, "SELECT enum_range(NULL::INE_PROV_ENUM)") # check that it was created, remove this line when package is stable + # DBI::dbSendStatement(con, "DROP TYPE INE_PROV_ENUM") # remove this line when package is stable + return(con) } diff --git a/R/get_v1_data.R b/R/get_v1_data.R index 9e571d4..d9db8a5 100644 --- a/R/get_v1_data.R +++ b/R/get_v1_data.R @@ -223,7 +223,7 @@ spod_clean_zones_v1 <- function(zones_path) { #' \item{id_destination}{\code{factor}. The identifier for the destination location of the trip, formatted as a code (e.g., '01001_AM').} #' \item{activity_origin}{\code{factor}. The type of activity at the origin location (e.g., 'home', 'work').} #' \item{activity_destination}{\code{factor}. The type of activity at the destination location (e.g., 'home', 'other').} -#' \item{residence_province}{\code{factor}. The province of residence for the individual making the trip.} +#' \item{residence_province}{\code{factor}. The province of residence for the individual making the trip (e.g. 'Cuenca', 'Girona').} #' \item{time_slot}{\code{integer}. The time slot during which the trip started, represented as an integer (e.g., 0, 1, 2).} #' \item{distance}{\code{factor}. The distance category of the trip, represented as a code (e.g., '002-005' for 2-5 km).} #' \item{n_trips}{\code{double}. The number of trips taken within the specified time slot and distance.} @@ -234,8 +234,8 @@ spod_clean_zones_v1 <- function(zones_path) { #' } #' spod_get_od_v1 <- function( - zones = c("districts", "dist", "distr", - "municipalities", "muni", "municip"), # add "urban_areas" for v2 data + zones = c("districts", "dist", "distr", "distritos", + "municipalities", "muni", "municip", "municipios"), dates = NULL, data_dir = spod_get_data_dir(), quiet = FALSE @@ -244,6 +244,7 @@ spod_get_od_v1 <- function( type <- "od" zones <- match.arg(zones) + zones <- spod_zone_names_en2es(zones) dates <- spod_dates_argument_to_dates_seq(dates = dates) diff --git a/man/spod_duckdb_od_v1.Rd b/man/spod_duckdb_od_v1.Rd index 2f73d6d..ae14865 100644 --- a/man/spod_duckdb_od_v1.Rd +++ b/man/spod_duckdb_od_v1.Rd @@ -44,7 +44,7 @@ The structure of the cleaned up views \code{od} and \code{od_filtered} is as fol \item{id_destination}{\code{factor}. The identifier for the destination location of the trip, formatted as a code (e.g., '01001_AM').} \item{activity_origin}{\code{factor}. The type of activity at the origin location (e.g., 'home', 'work').} \item{activity_destination}{\code{factor}. The type of activity at the destination location (e.g., 'home', 'other').} -\item{residence_province}{\code{factor}. The province of residence for the individual making the trip.} +\item{residence_province}{\code{factor}. The province of residence for the individual making the trip (e.g. 'Cuenca', 'Girona').} \item{time_slot}{\code{integer}. The time slot during which the trip started, represented as an integer (e.g., 0, 1, 2).} \item{distance}{\code{factor}. The distance category of the trip, represented as a code (e.g., '002-005' for 2-5 km).} \item{n_trips}{\code{double}. The number of trips taken within the specified time slot and distance.} diff --git a/man/spod_get_od_v1.Rd b/man/spod_get_od_v1.Rd index 012ec47..532f96a 100644 --- a/man/spod_get_od_v1.Rd +++ b/man/spod_get_od_v1.Rd @@ -5,7 +5,8 @@ \title{Load the origin-destination v1 data (2020-2021) for specified dates} \usage{ spod_get_od_v1( - zones = c("districts", "dist", "distr", "municipalities", "muni", "municip"), + zones = c("districts", "dist", "distr", "distritos", "municipalities", "muni", + "municip", "municipios"), dates = NULL, data_dir = spod_get_data_dir(), quiet = FALSE @@ -39,7 +40,7 @@ A duckdb table connection object. It can be manupulated using \code{dplyr} verbs \item{id_destination}{\code{factor}. The identifier for the destination location of the trip, formatted as a code (e.g., '01001_AM').} \item{activity_origin}{\code{factor}. The type of activity at the origin location (e.g., 'home', 'work').} \item{activity_destination}{\code{factor}. The type of activity at the destination location (e.g., 'home', 'other').} -\item{residence_province}{\code{factor}. The province of residence for the individual making the trip.} +\item{residence_province}{\code{factor}. The province of residence for the individual making the trip (e.g. 'Cuenca', 'Girona').} \item{time_slot}{\code{integer}. The time slot during which the trip started, represented as an integer (e.g., 0, 1, 2).} \item{distance}{\code{factor}. The distance category of the trip, represented as a code (e.g., '002-005' for 2-5 km).} \item{n_trips}{\code{double}. The number of trips taken within the specified time slot and distance.} From 848c13df53518df78246b28a406578a219395569 Mon Sep 17 00:00:00 2001 From: Egor Kotov Date: Fri, 9 Aug 2024 17:18:16 +0200 Subject: [PATCH 04/21] missing params --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 1fceb1f..212345e 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,5 @@ private /.quarto/ .Rproj.user +inst/doc +.Renviron From 9057916c001e2b6ad7e6f32aa2fcfedfeedfbd23 Mon Sep 17 00:00:00 2001 From: Egor Kotov Date: Fri, 9 Aug 2024 17:18:35 +0200 Subject: [PATCH 05/21] missing params --- DESCRIPTION | 3 +++ NAMESPACE | 1 + R/get.R | 3 ++- man/spod_get_data_dir.Rd | 3 +++ vignettes/.gitignore | 2 ++ 5 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 vignettes/.gitignore diff --git a/DESCRIPTION b/DESCRIPTION index 6e4c3c2..497c8d1 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -39,5 +39,8 @@ Encoding: UTF-8 Roxygen: list(markdown = TRUE) RoxygenNote: 7.3.2 Suggests: + knitr, + rmarkdown, testthat (>= 3.0.0) Config/testthat/edition: 3 +VignetteBuilder: knitr diff --git a/NAMESPACE b/NAMESPACE index f2616bc..2ffba9e 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -3,6 +3,7 @@ export(spod_available_data_v1) export(spod_download_data) export(spod_get) +export(spod_get_data_dir) export(spod_get_latest_v1_file_list) export(spod_get_latest_v2_xml) export(spod_get_metadata) diff --git a/R/get.R b/R/get.R index 2bfe88f..9484729 100644 --- a/R/get.R +++ b/R/get.R @@ -79,8 +79,9 @@ spod_get_metadata = function(data_dir = spod_get_data_dir(), quiet = FALSE) { #' #' This function retrieves the data directory from the environment variable SPANISH_OD_DATA_DIR. #' If the environment variable is not set, it returns the temporary directory. -#' +#' @param quiet Logical. If `TRUE`, the function does not print messages to the console. Defaults to `FALSE`. #' @return The data directory. +#' @export #' @keywords internal spod_get_data_dir = function(quiet = FALSE) { data_dir_env = Sys.getenv("SPANISH_OD_DATA_DIR") diff --git a/man/spod_get_data_dir.Rd b/man/spod_get_data_dir.Rd index f291402..52e0b8b 100644 --- a/man/spod_get_data_dir.Rd +++ b/man/spod_get_data_dir.Rd @@ -6,6 +6,9 @@ \usage{ spod_get_data_dir(quiet = FALSE) } +\arguments{ +\item{quiet}{Logical. If \code{TRUE}, the function does not print messages to the console. Defaults to \code{FALSE}.} +} \value{ The data directory. } diff --git a/vignettes/.gitignore b/vignettes/.gitignore new file mode 100644 index 0000000..097b241 --- /dev/null +++ b/vignettes/.gitignore @@ -0,0 +1,2 @@ +*.html +*.R From fc0e73bb30d19ab30f64392e21a7568f611ba9aa Mon Sep 17 00:00:00 2001 From: Egor Kotov Date: Fri, 9 Aug 2024 17:33:32 +0200 Subject: [PATCH 06/21] export the spod_get_od_v1() --- NAMESPACE | 1 + R/get_v1_data.R | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/NAMESPACE b/NAMESPACE index 2ffba9e..c907dee 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -7,5 +7,6 @@ export(spod_get_data_dir) export(spod_get_latest_v1_file_list) export(spod_get_latest_v2_xml) export(spod_get_metadata) +export(spod_get_od_v1) export(spod_get_zones) export(spod_get_zones_v1) diff --git a/R/get_v1_data.R b/R/get_v1_data.R index d9db8a5..0099be4 100644 --- a/R/get_v1_data.R +++ b/R/get_v1_data.R @@ -232,7 +232,7 @@ spod_clean_zones_v1 <- function(zones_path) { #' \item{month}{\code{double}. The month of the trip.} #' \item{day}{\code{double}. The day of the trip.} #' } -#' +#' @export spod_get_od_v1 <- function( zones = c("districts", "dist", "distr", "distritos", "municipalities", "muni", "municip", "municipios"), From 8dcaeed5dc9b28bff05612be8f212f027767281b Mon Sep 17 00:00:00 2001 From: Egor Kotov Date: Fri, 9 Aug 2024 18:10:44 +0200 Subject: [PATCH 07/21] fixes for od in municipalities v1 as they have less fewer columns --- R/duckdb_helpers.R | 172 +++++++++++++++++++++++++-------------- man/spod_duckdb_od_v1.Rd | 6 +- 2 files changed, 112 insertions(+), 66 deletions(-) diff --git a/R/duckdb_helpers.R b/R/duckdb_helpers.R index 03c4ee4..bce9dfb 100644 --- a/R/duckdb_helpers.R +++ b/R/duckdb_helpers.R @@ -17,9 +17,9 @@ #' \item{full_date}{\code{Date}. The full date of the trip, including year, month, and day.} #' \item{id_origin}{\code{factor}. The identifier for the origin location of the trip, formatted as a code (e.g., '01001_AM').} #' \item{id_destination}{\code{factor}. The identifier for the destination location of the trip, formatted as a code (e.g., '01001_AM').} -#' \item{activity_origin}{\code{factor}. The type of activity at the origin location (e.g., 'home', 'work').} -#' \item{activity_destination}{\code{factor}. The type of activity at the destination location (e.g., 'home', 'other').} -#' \item{residence_province}{\code{factor}. The province of residence for the individual making the trip (e.g. 'Cuenca', 'Girona').} +#' \item{activity_origin}{\code{factor}. The type of activity at the origin location (e.g., 'home', 'work'). \txtbf{Note:} Only available for district level data.} +#' \item{activity_destination}{\code{factor}. The type of activity at the destination location (e.g., 'home', 'other'). \txtbf{Note:} Only available for district level data.} +#' \item{residence_province}{\code{factor}. The province of residence for the individual making the trip (e.g. 'Cuenca', 'Girona'). \txtbf{Note:} Only available for district level data.} #' \item{time_slot}{\code{integer}. The time slot during which the trip started, represented as an integer (e.g., 0, 1, 2).} #' \item{distance}{\code{factor}. The distance category of the trip, represented as a code (e.g., '002-005' for 2-5 km).} #' \item{n_trips}{\code{double}. The number of trips taken within the specified time slot and distance.} @@ -73,24 +73,49 @@ spod_duckdb_od_v1 <- function( con <- DBI::dbConnect(drv, dbdir = ":memory:", read_only = TRUE) # create view of csv files and preset variable types - DBI::dbSendStatement(con, - dplyr::sql( - glue::glue( - "CREATE VIEW all_od_v1_csv_files AS SELECT * - FROM read_csv_auto('{csv_folder}**/*.txt.gz', delim='|', header=TRUE, hive_partitioning=TRUE, - columns={{ - 'fecha': 'DATE', - 'origen': 'VARCHAR', 'destino': 'VARCHAR', - 'actividad_origen': 'VARCHAR', 'actividad_destino': 'VARCHAR', - 'residencia': 'VARCHAR', - 'edad': 'VARCHAR', - 'periodo': 'INTEGER', - 'distancia': 'VARCHAR', - 'viajes': 'DOUBLE', 'viajes_km': 'DOUBLE'}}, - dateformat='%Y%m%d');" + if (zones == "distritos") { + DBI::dbSendStatement(con, + dplyr::sql( + glue::glue( + "CREATE VIEW all_od_v1_csv_files AS SELECT * + FROM read_csv_auto('{csv_folder}**/*.txt.gz', delim='|', header=TRUE, hive_partitioning=TRUE, + columns={{ + 'fecha': 'DATE', + 'origen': 'VARCHAR', + 'destino': 'VARCHAR', + 'actividad_origen': 'VARCHAR', + 'actividad_destino': 'VARCHAR', + 'residencia': 'VARCHAR', + 'edad': 'VARCHAR', + 'periodo': 'INTEGER', + 'distancia': 'VARCHAR', + 'viajes': 'DOUBLE', + 'viajes_km': 'DOUBLE' + }}, + dateformat='%Y%m%d');" + ) ) ) - ) + } else if (zones == "municipios") { + DBI::dbSendStatement(con, + dplyr::sql( + glue::glue( + "CREATE VIEW all_od_v1_csv_files AS SELECT * + FROM read_csv_auto('{csv_folder}**/*.txt.gz', delim='|', header=TRUE, hive_partitioning=TRUE, + columns={{ + 'fecha': 'DATE', + 'origen': 'VARCHAR', + 'destino': 'VARCHAR', + 'periodo': 'INTEGER', + 'distancia': 'VARCHAR', + 'viajes': 'DOUBLE', + 'viajes_km': 'DOUBLE' + }}, + dateformat='%Y%m%d');" + ) + ) + ) + } # preview table # DBI::dbGetQuery(con, "SELECT * FROM all_od_v1_csv_files LIMIT 10") |> dplyr::glimpse() # for debugging @@ -112,10 +137,12 @@ spod_duckdb_od_v1 <- function( ) # create ACTIV_ENUM - DBI::dbSendStatement( + if (zones == "distritos") { + DBI::dbSendStatement( con, dplyr::sql("CREATE TYPE ACTIV_ENUM AS ENUM ('home', 'work', 'other')") - ) + ) + } # create DISTANCE_ENUM DBI::dbSendStatement( @@ -124,53 +151,72 @@ spod_duckdb_od_v1 <- function( ) # create INE province ENUM - spod_duckdb_create_province_enum(con) - # DBI::dbGetQuery(con, "SELECT enum_range(NULL::INE_PROV_ENUM)") # check that it was created, remove this line when package is stable - # for debugging - # DBI::dbSendStatement(con, "DROP TYPE INE_PROV_ENUM") # remove this line when package is stable - - # create second view with desired data types including ENUMs - # create view to fix variable types and recode values to English - # NOTE: thsi raises non-ASCII character WARNING on R CMD check, so will need to store this query in a text file - # load when_then_provinces from a system file in inst/extdata/sql-queries/when-recode-provinces.txt - when_then_provinces <- readLines( - system.file( - "extdata/sql-queries/when-recode-provinces.txt", - package = "spanishoddata")) |> - paste(collapse = "\n") + if (zones == "distritos") { + spod_duckdb_create_province_enum(con) + # DBI::dbGetQuery(con, "SELECT enum_range(NULL::INE_PROV_ENUM)") # check that it was created, remove this line when package is stable + # for debugging + # DBI::dbSendStatement(con, "DROP TYPE INE_PROV_ENUM") # remove this line when package is stable + + # create second view with desired data types including ENUMs + # create view to fix variable types and recode values to English + # NOTE: thsi raises non-ASCII character WARNING on R CMD check, so will need to store this query in a text file + # load when_then_provinces from a system file in inst/extdata/sql-queries/when-recode-provinces.txt + when_then_provinces <- readLines( + system.file( + "extdata/sql-queries/when-recode-provinces.txt", + package = "spanishoddata")) |> + paste(collapse = "\n") - # now execute the query pasting in the contents of when_then_provinces - DBI::dbSendStatement(con, - dplyr::sql( - glue::glue( + # now execute the query pasting in the contents of when_then_provinces + DBI::dbSendStatement(con, + dplyr::sql( + glue::glue( + "CREATE VIEW od AS SELECT + fecha AS full_date, + CAST(origen AS ZONES_ENUM) AS id_origin, + CAST(destino AS ZONES_ENUM) AS id_destination, + CAST(CASE actividad_origen + WHEN 'casa' THEN 'home' + WHEN 'otros' THEN 'other' + WHEN 'trabajo_estudio' THEN 'work' + END AS ACTIV_ENUM) AS activity_origin, + CAST(CASE actividad_destino + WHEN 'casa' THEN 'home' + WHEN 'otros' THEN 'other' + WHEN 'trabajo_estudio' THEN 'work_or_study' + END AS ACTIV_ENUM) AS activity_destination, + CAST (CASE residencia + {when_then_provinces} + END AS INE_PROV_ENUM) AS residence_province, + periodo AS time_slot, + CAST(distancia AS DISTANCE_ENUM) AS distance, + viajes AS n_trips, + viajes_km AS trips_total_length_km, + year AS year, + month AS month, + day AS day + FROM all_od_v1_csv_files;" + ) + ) + ) + } else if (zones == "municipios") { + DBI::dbSendStatement(con, + dplyr::sql( "CREATE VIEW od AS SELECT - fecha AS full_date, - CAST(origen AS ZONES_ENUM) AS id_origin, - CAST(destino AS ZONES_ENUM) AS id_destination, - CAST(CASE actividad_origen - WHEN 'casa' THEN 'home' - WHEN 'otros' THEN 'other' - WHEN 'trabajo_estudio' THEN 'work' - END AS ACTIV_ENUM) AS activity_origin, - CAST(CASE actividad_destino - WHEN 'casa' THEN 'home' - WHEN 'otros' THEN 'other' - WHEN 'trabajo_estudio' THEN 'work_or_study' - END AS ACTIV_ENUM) AS activity_destination, - CAST (CASE residencia - {when_then_provinces} - END AS INE_PROV_ENUM) AS residence_province, - periodo AS time_slot, - CAST(distancia AS DISTANCE_ENUM) AS distance, - viajes AS n_trips, - viajes_km AS trips_total_length_km, - year AS year, - month AS month, - day AS day + fecha AS full_date, + CAST(origen AS ZONES_ENUM) AS id_origin, + CAST(destino AS ZONES_ENUM) AS id_destination, + periodo AS time_slot, + CAST(distancia AS DISTANCE_ENUM) AS distance, + viajes AS n_trips, + viajes_km AS trips_total_length_km, + year AS year, + month AS month, + day AS day FROM all_od_v1_csv_files;" ) ) - ) + } # preview result for debugging # DBI::dbGetQuery(con, "SELECT * FROM trips_view LIMIT 10") |> dplyr::glimpse() diff --git a/man/spod_duckdb_od_v1.Rd b/man/spod_duckdb_od_v1.Rd index ae14865..37862ed 100644 --- a/man/spod_duckdb_od_v1.Rd +++ b/man/spod_duckdb_od_v1.Rd @@ -42,9 +42,9 @@ The structure of the cleaned up views \code{od} and \code{od_filtered} is as fol \item{full_date}{\code{Date}. The full date of the trip, including year, month, and day.} \item{id_origin}{\code{factor}. The identifier for the origin location of the trip, formatted as a code (e.g., '01001_AM').} \item{id_destination}{\code{factor}. The identifier for the destination location of the trip, formatted as a code (e.g., '01001_AM').} -\item{activity_origin}{\code{factor}. The type of activity at the origin location (e.g., 'home', 'work').} -\item{activity_destination}{\code{factor}. The type of activity at the destination location (e.g., 'home', 'other').} -\item{residence_province}{\code{factor}. The province of residence for the individual making the trip (e.g. 'Cuenca', 'Girona').} +\item{activity_origin}{\code{factor}. The type of activity at the origin location (e.g., 'home', 'work'). \txtbf{Note:} Only available for district level data.} +\item{activity_destination}{\code{factor}. The type of activity at the destination location (e.g., 'home', 'other'). \txtbf{Note:} Only available for district level data.} +\item{residence_province}{\code{factor}. The province of residence for the individual making the trip (e.g. 'Cuenca', 'Girona'). \txtbf{Note:} Only available for district level data.} \item{time_slot}{\code{integer}. The time slot during which the trip started, represented as an integer (e.g., 0, 1, 2).} \item{distance}{\code{factor}. The distance category of the trip, represented as a code (e.g., '002-005' for 2-5 km).} \item{n_trips}{\code{double}. The number of trips taken within the specified time slot and distance.} From 6334be5d5988d97fba3741bcd19f55279adc9b36 Mon Sep 17 00:00:00 2001 From: Egor Kotov Date: Fri, 9 Aug 2024 18:15:57 +0200 Subject: [PATCH 08/21] build vignettes with quarto --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 497c8d1..94d86d7 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -43,4 +43,4 @@ Suggests: rmarkdown, testthat (>= 3.0.0) Config/testthat/edition: 3 -VignetteBuilder: knitr +VignetteBuilder: quarto From 064507effaffa7a3801b24101acd2a36b720100b Mon Sep 17 00:00:00 2001 From: Egor Kotov Date: Fri, 9 Aug 2024 18:43:16 +0200 Subject: [PATCH 09/21] fix docs --- .Rbuildignore | 2 ++ .gitignore | 2 ++ R/duckdb_helpers.R | 21 ++++++++++----------- man/spod_duckdb_od_v1.Rd | 20 ++++++++++---------- 4 files changed, 24 insertions(+), 21 deletions(-) diff --git a/.Rbuildignore b/.Rbuildignore index d7e1207..027748e 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -12,3 +12,5 @@ README.qmd ^.*\.Rproj$ ^\.Rproj\.user$ ^private$ +^doc$ +^Meta$ diff --git a/.gitignore b/.gitignore index 212345e..bad9e2f 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,5 @@ private .Rproj.user inst/doc .Renviron +/doc/ +/Meta/ diff --git a/R/duckdb_helpers.R b/R/duckdb_helpers.R index bce9dfb..ed00739 100644 --- a/R/duckdb_helpers.R +++ b/R/duckdb_helpers.R @@ -5,21 +5,21 @@ #' @inheritParams spod_download_data #' @return A duckdb connection object with 3 views: #' -#' * `all_od_v1_csv_files` - a raw table view of all cached CSV files with the origin-destination data that has benn previosly cached in $SPANISH_OD_DATA_DIR +#' * `all_od_v1_csv_files` - a raw table view of all cached CSV files with the origin-destination data that has been previously cached in $SPANISH_OD_DATA_DIR #' -#' * `od`` - a cleaned-up table view of `all_od_v1_csv_files` with column names and values translated and mapped to English. This still includes all cached data +#' * `od` - a cleaned-up table view of `all_od_v1_csv_files` with column names and values translated and mapped to English. This still includes all cached data. #' -#' * `od_filtered` - a filtered view of `od` with the desired dates +#' * `od_filtered` - a filtered view of `od` with the desired dates. #' -#' The structure of the cleaned up views `od` and `od_filtered` is as follows: +#' The structure of the cleaned-up views `od` and `od_filtered` is as follows: #' #' \describe{ #' \item{full_date}{\code{Date}. The full date of the trip, including year, month, and day.} #' \item{id_origin}{\code{factor}. The identifier for the origin location of the trip, formatted as a code (e.g., '01001_AM').} #' \item{id_destination}{\code{factor}. The identifier for the destination location of the trip, formatted as a code (e.g., '01001_AM').} -#' \item{activity_origin}{\code{factor}. The type of activity at the origin location (e.g., 'home', 'work'). \txtbf{Note:} Only available for district level data.} -#' \item{activity_destination}{\code{factor}. The type of activity at the destination location (e.g., 'home', 'other'). \txtbf{Note:} Only available for district level data.} -#' \item{residence_province}{\code{factor}. The province of residence for the individual making the trip (e.g. 'Cuenca', 'Girona'). \txtbf{Note:} Only available for district level data.} +#' \item{activity_origin}{\code{factor}. The type of activity at the origin location (e.g., 'home', 'work'). \strong{Note:} Only available for district level data.} +#' \item{activity_destination}{\code{factor}. The type of activity at the destination location (e.g., 'home', 'other'). \strong{Note:} Only available for district level data.} +#' \item{residence_province}{\code{factor}. The province of residence for the individual making the trip (e.g., 'Cuenca', 'Girona'). Provinces are stored as factors, and are encoded in a way that the province code can be used for queries. \strong{Note:} Only available for district level data.} #' \item{time_slot}{\code{integer}. The time slot during which the trip started, represented as an integer (e.g., 0, 1, 2).} #' \item{distance}{\code{factor}. The distance category of the trip, represented as a code (e.g., '002-005' for 2-5 km).} #' \item{n_trips}{\code{double}. The number of trips taken within the specified time slot and distance.} @@ -31,14 +31,14 @@ #' #' The structure of the original data in `all_od_v1_csv_files` is as follows: #' -#' #' \describe{ +#' \describe{ #' \item{fecha}{\code{Date}. The date of the trip, including year, month, and day.} #' \item{origen}{\code{character}. The identifier for the origin location of the trip, formatted as a character string (e.g., '01001_AM').} #' \item{destino}{\code{character}. The identifier for the destination location of the trip, formatted as a character string (e.g., '01001_AM').} #' \item{actividad_origen}{\code{character}. The type of activity at the origin location (e.g., 'casa', 'trabajo').} #' \item{actividad_destino}{\code{character}. The type of activity at the destination location (e.g., 'otros', 'trabajo').} -#' \item{residencia}{\code{character}. The code representing the residence of the individual making the trip (e.g., '01').} -#' \item{edad}{\code{character}. The age of the individual making the trip, if available. This field may contain 'NA' if the age is not recorded.} +#' \item{residencia}{\code{character}. The code representing the residence of the individual making the trip (e.g., '01') according to the official INE classification.} +#' \item{edad}{\code{character}. The age of the individual making the trip. This data is actaully filled with 'NA' values, which is why this column is removed in the cleaned-up and translated view described above.} #' \item{periodo}{\code{integer}. The time period during which the trip started, represented as an integer (e.g., 0, 1, 2).} #' \item{distancia}{\code{character}. The distance category of the trip, represented as a character string (e.g., '002-005' for 2-5 km).} #' \item{viajes}{\code{double}. The number of trips taken within the specified time period and distance.} @@ -47,7 +47,6 @@ #' \item{month}{\code{double}. The month of the trip.} #' \item{year}{\code{double}. The year of the trip.} #' } -#' #' @keywords internal spod_duckdb_od_v1 <- function( zones = c("districts", "dist", "distr", "distritos", diff --git a/man/spod_duckdb_od_v1.Rd b/man/spod_duckdb_od_v1.Rd index 37862ed..b75ca75 100644 --- a/man/spod_duckdb_od_v1.Rd +++ b/man/spod_duckdb_od_v1.Rd @@ -31,20 +31,20 @@ The possible values can be any of the following: \value{ A duckdb connection object with 3 views: \itemize{ -\item \code{all_od_v1_csv_files} - a raw table view of all cached CSV files with the origin-destination data that has benn previosly cached in $SPANISH_OD_DATA_DIR -\item \verb{od`` - a cleaned-up table view of }all_od_v1_csv_files` with column names and values translated and mapped to English. This still includes all cached data -\item \code{od_filtered} - a filtered view of \code{od} with the desired dates +\item \code{all_od_v1_csv_files} - a raw table view of all cached CSV files with the origin-destination data that has been previously cached in $SPANISH_OD_DATA_DIR +\item \code{od} - a cleaned-up table view of \code{all_od_v1_csv_files} with column names and values translated and mapped to English. This still includes all cached data. +\item \code{od_filtered} - a filtered view of \code{od} with the desired dates. } -The structure of the cleaned up views \code{od} and \code{od_filtered} is as follows: +The structure of the cleaned-up views \code{od} and \code{od_filtered} is as follows: \describe{ \item{full_date}{\code{Date}. The full date of the trip, including year, month, and day.} \item{id_origin}{\code{factor}. The identifier for the origin location of the trip, formatted as a code (e.g., '01001_AM').} \item{id_destination}{\code{factor}. The identifier for the destination location of the trip, formatted as a code (e.g., '01001_AM').} -\item{activity_origin}{\code{factor}. The type of activity at the origin location (e.g., 'home', 'work'). \txtbf{Note:} Only available for district level data.} -\item{activity_destination}{\code{factor}. The type of activity at the destination location (e.g., 'home', 'other'). \txtbf{Note:} Only available for district level data.} -\item{residence_province}{\code{factor}. The province of residence for the individual making the trip (e.g. 'Cuenca', 'Girona'). \txtbf{Note:} Only available for district level data.} +\item{activity_origin}{\code{factor}. The type of activity at the origin location (e.g., 'home', 'work'). \strong{Note:} Only available for district level data.} +\item{activity_destination}{\code{factor}. The type of activity at the destination location (e.g., 'home', 'other'). \strong{Note:} Only available for district level data.} +\item{residence_province}{\code{factor}. The province of residence for the individual making the trip (e.g., 'Cuenca', 'Girona'). Provinces are stored as factors, and are encoded in a way that the province code can be used for queries. \strong{Note:} Only available for district level data.} \item{time_slot}{\code{integer}. The time slot during which the trip started, represented as an integer (e.g., 0, 1, 2).} \item{distance}{\code{factor}. The distance category of the trip, represented as a code (e.g., '002-005' for 2-5 km).} \item{n_trips}{\code{double}. The number of trips taken within the specified time slot and distance.} @@ -56,14 +56,14 @@ The structure of the cleaned up views \code{od} and \code{od_filtered} is as fol The structure of the original data in \code{all_od_v1_csv_files} is as follows: -#' \describe{ +\describe{ \item{fecha}{\code{Date}. The date of the trip, including year, month, and day.} \item{origen}{\code{character}. The identifier for the origin location of the trip, formatted as a character string (e.g., '01001_AM').} \item{destino}{\code{character}. The identifier for the destination location of the trip, formatted as a character string (e.g., '01001_AM').} \item{actividad_origen}{\code{character}. The type of activity at the origin location (e.g., 'casa', 'trabajo').} \item{actividad_destino}{\code{character}. The type of activity at the destination location (e.g., 'otros', 'trabajo').} -\item{residencia}{\code{character}. The code representing the residence of the individual making the trip (e.g., '01').} -\item{edad}{\code{character}. The age of the individual making the trip, if available. This field may contain 'NA' if the age is not recorded.} +\item{residencia}{\code{character}. The code representing the residence of the individual making the trip (e.g., '01') according to the official INE classification.} +\item{edad}{\code{character}. The age of the individual making the trip. This data is actaully filled with 'NA' values, which is why this column is removed in the cleaned-up and translated view described above.} \item{periodo}{\code{integer}. The time period during which the trip started, represented as an integer (e.g., 0, 1, 2).} \item{distancia}{\code{character}. The distance category of the trip, represented as a character string (e.g., '002-005' for 2-5 km).} \item{viajes}{\code{double}. The number of trips taken within the specified time period and distance.} From 1a53ed9f834f720f47cb016769464acfdad599a8 Mon Sep 17 00:00:00 2001 From: Egor Kotov Date: Fri, 9 Aug 2024 19:10:00 +0200 Subject: [PATCH 10/21] enable quarto vignettes --- .Rbuildignore | 1 + DESCRIPTION | 6 +++--- vignettes/.gitignore | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.Rbuildignore b/.Rbuildignore index 027748e..6b54f13 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -14,3 +14,4 @@ README.qmd ^private$ ^doc$ ^Meta$ +^vignettes/*_files$ diff --git a/DESCRIPTION b/DESCRIPTION index 94d86d7..e0ac0a7 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -39,8 +39,8 @@ Encoding: UTF-8 Roxygen: list(markdown = TRUE) RoxygenNote: 7.3.2 Suggests: - knitr, - rmarkdown, + quarto, testthat (>= 3.0.0) Config/testthat/edition: 3 -VignetteBuilder: quarto +VignetteBuilder: + quarto diff --git a/vignettes/.gitignore b/vignettes/.gitignore index 097b241..ba7abf3 100644 --- a/vignettes/.gitignore +++ b/vignettes/.gitignore @@ -1,2 +1,3 @@ *.html *.R +*_files From 791da4a43a9dc747083f47591e2cef4bfba362a2 Mon Sep 17 00:00:00 2001 From: Egor Kotov Date: Fri, 9 Aug 2024 19:13:22 +0200 Subject: [PATCH 11/21] draft vignette for v1 data --- vignettes/work-with-v1-data.qmd | 175 ++++++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 vignettes/work-with-v1-data.qmd diff --git a/vignettes/work-with-v1-data.qmd b/vignettes/work-with-v1-data.qmd new file mode 100644 index 0000000..044485f --- /dev/null +++ b/vignettes/work-with-v1-data.qmd @@ -0,0 +1,175 @@ +--- +title: "Working with v1 MITMA data" +vignette: > + %\VignetteIndexEntry{Working with v1 MITMA data} + %\VignetteEngine{quarto::html} + %\VignetteEncoding{UTF-8} +--- + + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) +``` + +```{r} +#| eval: false +if (!requireNamespace(c("pak"), quietly = TRUE)) { + install.packages("pak") +} +packages <- c("sf", "dplyr", "DBI") +pak::pkg_install(packages, ask = FALSE, upgrade = FALSE) + +pak::pkg_install("Robinlovelace/spanishoddata@1a53ed9f834f720f47cb016769464acfdad599a8", ask = FALSE, upgrade = TRUE) + +suppressPackageStartupMessages(invisible(lapply(packages, library, character.only = TRUE))) +library(spanishoddata) +``` + +```{r setup} +#| include: false +library(sf) +library(dplyr) +library(DBI) +library(spanishoddata) +``` + +# Introduction + +v1 MITMA data covers the period from 2020-02-14 to 2021-05-09. Add references... + +# Set a directory to store the data + +```{r eval=FALSE} +#| eval: false +Sys.setenv(SPANISH_OD_DATA_DIR = "path/to/store/data") +spod_get_data_dir() # you may want to check that it is set correctly +``` + + +# Get the zones + +Load the spatial data for districts. + +```{r} +districts <- spod_get_zones_v1(zones = "dist", quiet = TRUE) +``` + +```{r} +glimpse(districts) +plot(st_geometry(districts)) +``` + +Load the spatial data for municipalities. + +```{r} +municipalities <- spod_get_zones_v1(zones = "muni", quiet = TRUE) +``` + +```{r} +glimpse(municipalities) +plot(st_geometry(municipalities)) +``` + +# Get the origin-destination data for an inteval of dates + +Load the data for the period from 2020-02-14 to 2020-02-17. + +The data will be cached in the directory set in the SPANISH_OD_DATA_DIR environment variable. If it is already downloaded, it will not be downloaded again. + +```{r} +od_dist_1 <- spod_get_od_v1(zones = "dist", + dates = c(start = "2020-02-14", end = "2020-02-17"), + quiet = TRUE) +``` + + +Look at the data structure. This is a lazy table with DuckDB backend. That is, the files on disk are still raw gzipped CSV files, but they are cleverly connected to a dynamic view in in-memory DuckDB database. + +```{r} +od_dist_1 |> glimpse() +``` + +You can work with it using dplyr verbs as if it were a regular data frame, but if you want to load the results into memory, you can use the `collect()` function. + +For example this code below will not execute the query, but will only create another "lazy" object. + +```{r} +od_dist_1_lazy <- od_dist_1 |> + group_by(id_origin, id_destination, full_date) |> + summarise(total_day_trips = sum(n_trips, na.rm = TRUE), + .groups = "drop") |> + group_by(id_origin, id_destination) |> + summarise(mean_dayly_trips = mean(total_day_trips, na.rm = TRUE), + .groups = "drop") +``` + +In fact this is a "lazy" object with an SQL query attached to it. You can see the query with the `show_query()` function. + +```{r} +od_dist_1_lazy |> show_query() +``` + +```{r} +format(object.size(od_dist_1_lazy), units = "Mb") +class(od_dist_1_lazy) +``` + +If you want to load the results into memory, you can use the `collect()` function. It can be added either at the end of the original pipeline, like so: + +```{r} +#| eval=FALSE +od_dist_1_data <- od_dist_1 |> + group_by(id_origin, id_destination, full_date) |> + summarise(total_day_trips = sum(n_trips, na.rm = TRUE), + .groups = "drop") |> + group_by(id_origin, id_destination) |> + summarise(mean_dayly_trips = mean(total_day_trips, na.rm = TRUE), + .groups = "drop") |> + collect() +``` + +Or you can just add collect() to the "lazy" object that you created before, like so: + +```{r} +od_dist_1_data <- od_dist_1_lazy |> collect() +``` + +```{r} +format(object.size(od_dist_1_data), units = "Mb") +class(od_dist_1_data) +``` + +To safely disconnect the in-memory database, you can use the `DBI::dbDisconnect()` function. + +```{r} +DBI::dbDisconnect(od_dist_1$src$con) +``` + +# Get the origin-destination data for several non-consecutive dates + +This time let's get the data for 2020-02-14, 2020-02-17, 2021-05-07 and 2021-05-09. We will use municipalities as zones. + +```{r} +od_muni_1 <- spod_get_od_v1(zones = "muni", + dates = c("2020-02-14", "2020-02-17", "2021-05-07", "2021-05-09"), + quiet = TRUE) +``` + + +Look at the data structure. + +```{r} +od_muni_1 |> glimpse() +``` + +```{r} +format(object.size(od_muni_1), units = "Mb") +class(od_muni_1) +``` + +```{r} +DBI::dbDisconnect(od_muni_1$src$con) +``` From 1a6e698987cd1e6adcb8ae3f4cbf01306b7fa4e5 Mon Sep 17 00:00:00 2001 From: Egor Kotov Date: Sun, 11 Aug 2024 20:41:21 +0200 Subject: [PATCH 12/21] 1. delegate duckdb view foltering to a standalone internal function spod_duckdb_filter_by_dates; 2. move the spod_sql_where_dates to the duckdb_helpers.R --- R/duckdb_helpers.R | 59 ++++++++++++++++++++++++++++++++++++---------- R/get_v1_data.R | 7 ++++-- R/internal_utils.R | 29 ----------------------- 3 files changed, 51 insertions(+), 44 deletions(-) diff --git a/R/duckdb_helpers.R b/R/duckdb_helpers.R index ed00739..fe43c4d 100644 --- a/R/duckdb_helpers.R +++ b/R/duckdb_helpers.R @@ -1,17 +1,15 @@ -#' Function to create a duckdb connection to v1 OD data +#' Creates a duckdb connection to v1 OD data #' #' This function creates a duckdb connection to the v1 OD data. #' @inheritParams spod_download_data -#' @return A duckdb connection object with 3 views: +#' @return A duckdb connection object with 2 views: #' #' * `all_od_v1_csv_files` - a raw table view of all cached CSV files with the origin-destination data that has been previously cached in $SPANISH_OD_DATA_DIR #' #' * `od` - a cleaned-up table view of `all_od_v1_csv_files` with column names and values translated and mapped to English. This still includes all cached data. #' -#' * `od_filtered` - a filtered view of `od` with the desired dates. -#' -#' The structure of the cleaned-up views `od` and `od_filtered` is as follows: +#' The structure of the cleaned-up views `od` is as follows: #' #' \describe{ #' \item{full_date}{\code{Date}. The full date of the trip, including year, month, and day.} @@ -52,7 +50,6 @@ spod_duckdb_od_v1 <- function( zones = c("districts", "dist", "distr", "distritos", "municipalities", "muni", "municip", "municipios", "lau", "large_urban_areas", "gau", "grandes_areas_urbanas"), - dates = NULL, data_dir = spod_get_data_dir() ) { ver <- 1 @@ -220,10 +217,21 @@ spod_duckdb_od_v1 <- function( # preview result for debugging # DBI::dbGetQuery(con, "SELECT * FROM trips_view LIMIT 10") |> dplyr::glimpse() + # preview the new view for debugging + # DBI::dbGetQuery(con, "SELECT * FROM trips LIMIT 10") |> dplyr::glimpse() + + # return the connection as duckdb object + return(con) +} + +#' Filter a duckdb conenction by dates +#' @param con A duckdb connection +#' @param source_view_name The name of the source duckdb "view" (the virtual table, in the context of current package likely connected to a folder of CSV files) +spod_duckdb_filter_by_dates <- function(con, source_view_name, new_view_name, dates){ # prepare query to filter by dates query <- dplyr::sql( - paste0( - "CREATE VIEW od_filtered AS SELECT * FROM od ", + glue::glue( + "CREATE VIEW {new_view_name} AS SELECT * FROM {source_view_name} ", spod_sql_where_dates(dates) ) ) @@ -231,14 +239,9 @@ spod_duckdb_od_v1 <- function( # create a view with a filter to the desired dates DBI::dbSendStatement(con, query) - # preview the new view for debugging - # DBI::dbGetQuery(con, "SELECT * FROM trips LIMIT 10") |> dplyr::glimpse() - - # return the connection as duckdb object return(con) } - spod_duckdb_create_province_enum <- function(con){ # load provinces with non-ASCII names @@ -265,3 +268,33 @@ spod_duckdb_create_province_enum <- function(con){ return(con) } + +#' Generate a WHERE part of an SQL query from a sequence of dates +#' @param dates A Dates vector of dates to process. +#' @return A character vector of the SQL query. +#' @keywords internal +spod_sql_where_dates <- function(dates) { + # Extract unique year, month, and day combinations from the dates + date_parts <- data.frame( + year = format(dates, "%Y"), + month = format(dates, "%m"), + day = format(dates, "%d") + ) + + # Get distinct rows and sort them by year, month, and day + date_parts <- date_parts[!duplicated(date_parts), ] + date_parts <- date_parts[order(date_parts$year, date_parts$month, date_parts$day), ] + + # Create the WHERE conditions for each unique date + where_conditions <- stats::aggregate(day ~ year + month, data = date_parts, FUN = function(x) paste(x, collapse = ", ")) + where_conditions$condition <- paste0("(year = ", where_conditions$year, + " AND month = ", where_conditions$month, + " AND day IN (", where_conditions$day, "))") + + # Combine all conditions into a single WHERE clause + sql_query <- paste0("WHERE ", + paste(where_conditions$condition, collapse = " OR ") + ) + + return(sql_query) +} diff --git a/R/get_v1_data.R b/R/get_v1_data.R index 0099be4..dd51416 100644 --- a/R/get_v1_data.R +++ b/R/get_v1_data.R @@ -257,12 +257,15 @@ spod_get_od_v1 <- function( return_output = FALSE ) - # attach the od folder with predefined and cleaned up data types + # attach the od folder of csv.gz files with predefined and cleaned up data types con <- spod_duckdb_od_v1( zones = zones, - dates = dates, data_dir = data_dir ) + + # filter by date + # actually, it seems like this works even if we do not return the 'con' from the function below, but I guess it is safer to return the 'con' and resave it to the 'con' of the environment/scope of this function + con <- spod_duckdb_filter_by_dates(con, "od", "od_filtered", dates) # DBI::dbListTables(con) # for debugging only # dplyr::tbl(con, "trips_view") |> dplyr::glimpse() # for debugging only diff --git a/R/internal_utils.R b/R/internal_utils.R index 8711e10..7fd6d5c 100644 --- a/R/internal_utils.R +++ b/R/internal_utils.R @@ -233,32 +233,3 @@ spod_match_data_type <- function( } -#' Function to generate the SQL query from a sequence of dates -#' @param dates A Dates vector of dates to process. -#' @return A character vector of the SQL query. -#' @keywords internal -spod_sql_where_dates <- function(dates) { - # Extract unique year, month, and day combinations from the dates - date_parts <- data.frame( - year = format(dates, "%Y"), - month = format(dates, "%m"), - day = format(dates, "%d") - ) - - # Get distinct rows and sort them by year, month, and day - date_parts <- date_parts[!duplicated(date_parts), ] - date_parts <- date_parts[order(date_parts$year, date_parts$month, date_parts$day), ] - - # Create the WHERE conditions for each unique date - where_conditions <- stats::aggregate(day ~ year + month, data = date_parts, FUN = function(x) paste(x, collapse = ", ")) - where_conditions$condition <- paste0("(year = ", where_conditions$year, - " AND month = ", where_conditions$month, - " AND day IN (", where_conditions$day, "))") - - # Combine all conditions into a single WHERE clause - sql_query <- paste0("WHERE ", - paste(where_conditions$condition, collapse = " OR ") - ) - - return(sql_query) -} From ef0b2acd347fd50ac6522e36702f191c5e00879d Mon Sep 17 00:00:00 2001 From: Egor Kotov Date: Sun, 11 Aug 2024 21:02:23 +0200 Subject: [PATCH 13/21] temporary disable all eval in v1 data vignette to prevent fails of R CMD check --- vignettes/work-with-v1-data.qmd | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vignettes/work-with-v1-data.qmd b/vignettes/work-with-v1-data.qmd index 044485f..94b3e89 100644 --- a/vignettes/work-with-v1-data.qmd +++ b/vignettes/work-with-v1-data.qmd @@ -4,6 +4,8 @@ vignette: > %\VignetteIndexEntry{Working with v1 MITMA data} %\VignetteEngine{quarto::html} %\VignetteEncoding{UTF-8} +execute: + eval: false --- From 43dbf05aaef4f1640c07232b478e8715b9ea4395 Mon Sep 17 00:00:00 2001 From: Egor Kotov Date: Mon, 12 Aug 2024 10:30:44 +0200 Subject: [PATCH 14/21] add spod_convert_od_v1_to_duckdb --- DESCRIPTION | 1 + NAMESPACE | 1 + R/convert_data.R | 91 ++++++++++++++++++++ R/duckdb_helpers.R | 62 ++++++++++---- R/folders.R | 19 ++++- R/get_v1_data.R | 105 ++++++++++++++++++++---- R/internal_utils.R | 7 +- man/spod_convert_od_v1_to_duckdb.Rd | 35 ++++++++ man/spod_dates_argument_to_dates_seq.Rd | 2 + man/spod_download_data.Rd | 2 + man/spod_duckdb_filter_by_dates.Rd | 32 ++++++++ man/spod_duckdb_limit_resources.Rd | 22 +++++ man/spod_duckdb_od_v1.Rd | 29 ++----- man/spod_get_od_v1.Rd | 51 +++++++++++- man/spod_sql_where_dates.Rd | 6 +- man/spod_subfolder_clean_data_cache.Rd | 18 ++++ man/spod_subfolder_raw_data_cache.Rd | 4 +- 17 files changed, 421 insertions(+), 66 deletions(-) create mode 100644 R/convert_data.R create mode 100644 man/spod_convert_od_v1_to_duckdb.Rd create mode 100644 man/spod_duckdb_filter_by_dates.Rd create mode 100644 man/spod_duckdb_limit_resources.Rd create mode 100644 man/spod_subfolder_clean_data_cache.Rd diff --git a/DESCRIPTION b/DESCRIPTION index e0ac0a7..f083911 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -28,6 +28,7 @@ Imports: fs, glue, lubridate, + parallelly, purrr, readr, sf, diff --git a/NAMESPACE b/NAMESPACE index c907dee..909bb95 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,6 +1,7 @@ # Generated by roxygen2: do not edit by hand export(spod_available_data_v1) +export(spod_convert_od_v1_to_duckdb) export(spod_download_data) export(spod_get) export(spod_get_data_dir) diff --git a/R/convert_data.R b/R/convert_data.R new file mode 100644 index 0000000..ca430e4 --- /dev/null +++ b/R/convert_data.R @@ -0,0 +1,91 @@ + +#' Convert all downloaded v1 origin-destination data to duckdb +#' +#' @param save_dir The path to the directory where the duckdb files will be saved. If `NULL`, uses the default location in `data_dir` (set by the `SPANISH_OD_DATA_DIR` environment variable). Therefore, the default relative path is `/clean_data/v1/tabular/duckdb/od_.duckdb`. +#' @inheritParams spod_get_zones_v1 +#' @inheritParams spod_duckdb_limit_resources +#' @param overwrite Logical. If `TRUE`, overwrites existing duckdb files. Defaults to `FALSE`. +#' @export +spod_convert_od_v1_to_duckdb <- function( + zones = c("districts", "dist", "distr", "distritos", + "municipalities", "muni", "municip", "municipios"), + data_dir = spod_get_data_dir(), + save_dir = NULL, + quiet = FALSE, + duck_max_mem = 3, + duck_max_threads = parallelly::availableCores(), + overwrite = FALSE +) { + + zones <- match.arg(zones) + zones <- spod_zone_names_en2es(zones) + + # if save_dir is NULL, use default location in data_dir + if (is.null(save_dir)) { + save_dir <- fs::path( + data_dir, + spod_subfolder_clean_data_cache(ver = 1), + "tabular/duckdb/") + } + + # ensure save_dir exists + if (!fs::dir_exists(save_dir)) fs::dir_create(save_dir, recurse = TRUE) + + # create duckdb save path + duckdb_save_path <- glue::glue("{save_dir}/od_{zones}.duckdb") + + # check if duckdb file already exists + if (fs::file_exists(duckdb_save_path) & !overwrite) { + message("Duckdb file already exists: ", duckdb_save_path) + # in future, perhaps add code that provides a summary of what's inside that file + # ask user if they want to overwrite + response <- readline(prompt = "Overwrite existing duckdb file? (yes/no) ") + overwrite_duckdb <- any(tolower(response) %in% c("y", "yes", "yes.")) + if (!overwrite_duckdb) { + message(glue::glue("Exiting without overwriting existing duckdb file. You may delete it from {duckdb_save_path} manually and rerun the function. Or rerun it with `overwrite = TRUE`.")) + return() + } else { + if (isFALSE(quiet)) message(glue::glue("Overwriting existing duckdb file: ", duckdb_save_path)) + fs::file_delete(duckdb_save_path) + } + } + + if (isFALSE(quiet)) message(glue::glue("Using {duck_max_mem} GB of memory and {duck_max_threads} threads. You may adjust this using the function arguments `duck_max_mem` and `duck_max_threads`.")) + if (isFALSE(quiet)) message(glue::glue("Converting cached v1 od data for {zones} to DuckDB: ", duckdb_save_path, "... This may take a while.")) + # add some indication on how long it may take from empirical experimentation + # hopefully, the progress_bar feature will be implemented in duckdb R package soon, bug filed here https://github.com/duckdb/duckdb-r/issues/199 + + # get dates of cached data + # v1_meta <- spod_available_data_v1(check_local_files = TRUE) + + # v1_meta <- v1_meta[v1_meta$downloaded == TRUE,] + # v1_meta <- v1_meta[grepl("maestra1", v1_meta$local_path),] + # v1_meta <- v1_meta[grepl(zones, v1_meta$local_path),] + + # dates <- v1_meta$data_ymd + + # create duckdb connection + drv <- duckdb::duckdb() + con <- DBI::dbConnect(drv, dbdir = duckdb_save_path, read_only = FALSE) + + # define memory and threads limits + con <- spod_duckdb_limit_resources( + con = con, + duck_max_mem = duck_max_mem, + duck_max_threads = duck_max_threads + ) + + # connect to folder of CSVs with v1 od data + con <- spod_duckdb_od_v1(con = con, zones = zones) + # DBI::dbListTables(con) + + # import view of CSV files into duckdb + DBI::dbExecute(con, "CREATE TABLE od AS SELECT * FROM od_csv_clean ;") + + DBI::dbDisconnect(con, shutdown = TRUE) + duckdb::duckdb_shutdown(drv) + + message("Cached v1 origin-destination data imported to DuckDB at: ", duckdb_save_path) + + return(invisible(NULL)) +} \ No newline at end of file diff --git a/R/duckdb_helpers.R b/R/duckdb_helpers.R index fe43c4d..8d39a4f 100644 --- a/R/duckdb_helpers.R +++ b/R/duckdb_helpers.R @@ -2,14 +2,16 @@ #' Creates a duckdb connection to v1 OD data #' #' This function creates a duckdb connection to the v1 OD data. +#' +#' @param con A duckdb connection object. If not specified, a new in-memory connection will be created. #' @inheritParams spod_download_data #' @return A duckdb connection object with 2 views: #' -#' * `all_od_v1_csv_files` - a raw table view of all cached CSV files with the origin-destination data that has been previously cached in $SPANISH_OD_DATA_DIR +#' * `od_csv_raw` - a raw table view of all cached CSV files with the origin-destination data that has been previously cached in $SPANISH_OD_DATA_DIR #' -#' * `od` - a cleaned-up table view of `all_od_v1_csv_files` with column names and values translated and mapped to English. This still includes all cached data. +#' * `od_csv_clean` - a cleaned-up table view of `od_csv_raw` with column names and values translated and mapped to English. This still includes all cached data. #' -#' The structure of the cleaned-up views `od` is as follows: +#' The structure of the cleaned-up views `od_csv_clean` is as follows: #' #' \describe{ #' \item{full_date}{\code{Date}. The full date of the trip, including year, month, and day.} @@ -27,7 +29,7 @@ #' \item{day}{\code{double}. The day of the trip.} #' } #' -#' The structure of the original data in `all_od_v1_csv_files` is as follows: +#' The structure of the original data in `od_csv_raw` is as follows: #' #' \describe{ #' \item{fecha}{\code{Date}. The date of the trip, including year, month, and day.} @@ -47,6 +49,7 @@ #' } #' @keywords internal spod_duckdb_od_v1 <- function( + con = DBI::dbConnect(duckdb::duckdb(), dbdir = ":memory:", read_only = FALSE), zones = c("districts", "dist", "distr", "distritos", "municipalities", "muni", "municip", "municipios", "lau", "large_urban_areas", "gau", "grandes_areas_urbanas"), @@ -64,16 +67,13 @@ spod_duckdb_od_v1 <- function( "/ficheros-diarios/" ) - # create in memory duckdb connection - drv <- duckdb::duckdb() - con <- DBI::dbConnect(drv, dbdir = ":memory:", read_only = TRUE) # create view of csv files and preset variable types if (zones == "distritos") { DBI::dbSendStatement(con, dplyr::sql( glue::glue( - "CREATE VIEW all_od_v1_csv_files AS SELECT * + "CREATE VIEW od_csv_raw AS SELECT * FROM read_csv_auto('{csv_folder}**/*.txt.gz', delim='|', header=TRUE, hive_partitioning=TRUE, columns={{ 'fecha': 'DATE', @@ -96,7 +96,7 @@ spod_duckdb_od_v1 <- function( DBI::dbSendStatement(con, dplyr::sql( glue::glue( - "CREATE VIEW all_od_v1_csv_files AS SELECT * + "CREATE VIEW od_csv_raw AS SELECT * FROM read_csv_auto('{csv_folder}**/*.txt.gz', delim='|', header=TRUE, hive_partitioning=TRUE, columns={{ 'fecha': 'DATE', @@ -114,7 +114,7 @@ spod_duckdb_od_v1 <- function( } # preview table - # DBI::dbGetQuery(con, "SELECT * FROM all_od_v1_csv_files LIMIT 10") |> dplyr::glimpse() # for debugging + # DBI::dbGetQuery(con, "SELECT * FROM od_csv_raw LIMIT 10") |> dplyr::glimpse() # for debugging # create ENUMs @@ -167,7 +167,7 @@ spod_duckdb_od_v1 <- function( DBI::dbSendStatement(con, dplyr::sql( glue::glue( - "CREATE VIEW od AS SELECT + "CREATE VIEW od_csv_clean AS SELECT fecha AS full_date, CAST(origen AS ZONES_ENUM) AS id_origin, CAST(destino AS ZONES_ENUM) AS id_destination, @@ -191,14 +191,14 @@ spod_duckdb_od_v1 <- function( year AS year, month AS month, day AS day - FROM all_od_v1_csv_files;" + FROM od_csv_raw;" ) ) ) } else if (zones == "municipios") { DBI::dbSendStatement(con, dplyr::sql( - "CREATE VIEW od AS SELECT + "CREATE VIEW od_csv_clean AS SELECT fecha AS full_date, CAST(origen AS ZONES_ENUM) AS id_origin, CAST(destino AS ZONES_ENUM) AS id_destination, @@ -209,16 +209,13 @@ spod_duckdb_od_v1 <- function( year AS year, month AS month, day AS day - FROM all_od_v1_csv_files;" + FROM od_csv_raw;" ) ) } # preview result for debugging - # DBI::dbGetQuery(con, "SELECT * FROM trips_view LIMIT 10") |> dplyr::glimpse() - - # preview the new view for debugging - # DBI::dbGetQuery(con, "SELECT * FROM trips LIMIT 10") |> dplyr::glimpse() + # DBI::dbGetQuery(con, "SELECT * FROM od_csv_clean LIMIT 10") |> dplyr::glimpse() # return the connection as duckdb object return(con) @@ -226,6 +223,9 @@ spod_duckdb_od_v1 <- function( #' Filter a duckdb conenction by dates #' @param con A duckdb connection +#' @param source_view_name The name of the source duckdb "view" (the virtual table, in the context of current package likely connected to a folder of CSV files). +#' @param new_view_name The name of the new duckdb "view" (the virtual table, in the context of current package likely connected to a folder of CSV files). +#' @inheritParams spod_dates_argument_to_dates_seq #' @param source_view_name The name of the source duckdb "view" (the virtual table, in the context of current package likely connected to a folder of CSV files) spod_duckdb_filter_by_dates <- function(con, source_view_name, new_view_name, dates){ # prepare query to filter by dates @@ -298,3 +298,29 @@ spod_sql_where_dates <- function(dates) { return(sql_query) } + +#' Set maximum memory and number of threads for a DuckDB connection +#' @param con A duckdb connection +#' @param duck_max_mem The maximum memory to use in GB. A conservative default is 3 GB, which should be enough for resaving the data to DuckDB form a folder of CSV.gz files while being small enough to fit in memory of most even old computers. For data analysis using the already converted data (in DuckDB or Parquet format) or with the raw CSV.gz data, it is recommended to increase it according to available resources. +#' @param duck_max_threads The maximum number of threads to use. Defaults to the number of available cores minus 1. +spod_duckdb_limit_resources <- function( + con, + duck_max_mem = 3, # in GB, default to 3 GB, should be enough to resave the data and small enough to fit in memory of most even old computers + duck_max_threads = parallelly::availableCores() - 1 # leave one core for other tasks by default +) { + + DBI::dbExecute(con, + dplyr::sql( + glue::glue("SET max_memory='{duck_max_mem}GB';") + ) + ) + + DBI::dbExecute(con, + dplyr::sql( + glue::glue("SET threads='{duck_max_threads}';") + ) + ) + + return(con) +} + diff --git a/R/folders.R b/R/folders.R index b29e627..3ad9989 100644 --- a/R/folders.R +++ b/R/folders.R @@ -1,4 +1,6 @@ -#' Change subfolder name for raw data cache here to apply globally +#' Get raw data cache subfolder name +#' +#' Change subfolder name in the code of this function for raw data cache here to apply globally, as all functions in the package should use this function to get the raw data cache path. #' @param ver Integer. The version of the data. Must be 1 or 2. #' @return Character string with the subfolder name for the raw data cache. #' @keywords internal @@ -10,3 +12,18 @@ spod_subfolder_raw_data_cache <- function(ver = 1) { base_subdir_name <- "raw_data_cache" return(paste0(base_subdir_name, "/v", ver, "/")) } + +#' Get clean data subfolder name +#' +#' Change subfolder name in the code of this function for clean data cache here to apply globally, as all functions in the package should use this function to get the clean data cache path. +#' @param ver Integer. The version of the data. Must be 1 or 2. +#' @return Character string with the subfolder name for the clean data cache. +#' @keywords internal +spod_subfolder_clean_data_cache <- function(ver = 1) { + ver <- as.integer(ver) + if (!ver %in% c(1, 2)) { + stop("Invalid version number. Must be 1 or 2.") + } + base_subdir_name <- "clean_data" + return(paste0(base_subdir_name, "/v", ver, "/")) +} \ No newline at end of file diff --git a/R/get_v1_data.R b/R/get_v1_data.R index dd51416..a31dc9a 100644 --- a/R/get_v1_data.R +++ b/R/get_v1_data.R @@ -146,7 +146,8 @@ spod_get_zones_v1 <- function( zones <- spod_zone_names_en2es(zones) # check if shp files are already extracted - expected_gpkg_path <- fs::path(data_dir, glue::glue("clean_data/v1//zones/{zones}_mitma.gpkg")) + expected_gpkg_path <- fs::path(data_dir, + glue::glue(spod_subfolder_clean_data_cache(), "/zones/{zones}_mitma.gpkg")) if (fs::file_exists(expected_gpkg_path)) { if (isFALSE(quiet)) message("Loading .gpkg file that already exists in data dir: ", expected_gpkg_path) return(sf::read_sf(expected_gpkg_path)) @@ -214,8 +215,10 @@ spod_clean_zones_v1 <- function(zones_path) { #' Load the origin-destination v1 data (2020-2021) for specified dates #' #' This function retrieves the v1 (2020-2021) origin_destination_data for the specified dates. It checks if the requested data is already cached locally and downloads it if it is not. When all the requested data is cached, it creates a `DuckDB` connection to the cache data folder and provides an table +#' #' @inheritParams spod_download_data -#' @return A duckdb table connection object. It can be manupulated using `dplyr` verbs, or can be loaded into memory using `dplyr::collect()`. The structure of the object is as follows: +#' @inheritParams spod_duckdb_limit_resources +#' @return A DuckDB table connection object. It can be manupulated using `dplyr` verbs, or can be loaded into memory using `dplyr::collect()`. The structure of the object is as follows: #' #' \describe{ #' \item{full_date}{\code{Date}. The full date of the trip, including year, month, and day.} @@ -232,13 +235,55 @@ spod_clean_zones_v1 <- function(zones_path) { #' \item{month}{\code{double}. The month of the trip.} #' \item{day}{\code{double}. The day of the trip.} #' } +#' +#' This object also contains the reference to the source DuckDB conneciton with the full view of the cached data. It can be accessed using `od_table$src$con`. See examples below. The connection includes two views: +#' +#' +#' * `od_csv_raw` - a raw table view of all cached CSV files with the origin-destination data that has been previously cached in $SPANISH_OD_DATA_DIR +#' +#' * `od_csv_clean` - a cleaned-up table view of `od_csv_raw` with column names and values translated and mapped to English. This still includes all cached data. +#' +#' View `od_csv_clean` has the same structure as the filtered view 'od_filtered', which is returned by `spod_get_od_v1()` as a DuckDB table connection object. The view `od_csv_raw` has original Spanish column names and values and has the following structure: +#' \describe{ +#' \item{fecha}{\code{Date}. The date of the trip, including year, month, and day.} +#' \item{origen}{\code{character}. The identifier for the origin location of the trip, formatted as a character string (e.g., '01001_AM').} +#' \item{destino}{\code{character}. The identifier for the destination location of the trip, formatted as a character string (e.g., '01001_AM').} +#' \item{actividad_origen}{\code{character}. The type of activity at the origin location (e.g., 'casa', 'trabajo').} +#' \item{actividad_destino}{\code{character}. The type of activity at the destination location (e.g., 'otros', 'trabajo').} +#' \item{residencia}{\code{character}. The code representing the residence of the individual making the trip (e.g., '01') according to the official INE classification.} +#' \item{edad}{\code{character}. The age of the individual making the trip. This data is actaully filled with 'NA' values, which is why this column is removed in the cleaned-up and translated view described above.} +#' \item{periodo}{\code{integer}. The time period during which the trip started, represented as an integer (e.g., 0, 1, 2).} +#' \item{distancia}{\code{character}. The distance category of the trip, represented as a character string (e.g., '002-005' for 2-5 km).} +#' \item{viajes}{\code{double}. The number of trips taken within the specified time period and distance.} +#' \item{viajes_km}{\code{double}. The total length of all trips in kilometers for the specified time period and distance.} +#' \item{day}{\code{double}. The day of the trip.} +#' \item{month}{\code{double}. The month of the trip.} +#' \item{year}{\code{double}. The year of the trip.} +#' } +#' #' @export +#' @examples +#' \dontrun{ +#' +#' # create a connection to the v1 data +#' Sys.setenv(SPANISH_OD_DATA_DIR = "~/home/nosync/cache/mitma") +#' dates <- c("2020-02-14", "2020-03-14", "2021-02-14", "2021-02-14", "2021-02-15") +#' od_dist <- spod_get_od_v1(zones = "distr", dates = dates) +#' +#' # od dist is a table view filtered to the specified dates +#' +#' # access the source connection with all dates +#' # list tables +#' DBI::dbListTables(od_dist$src$con) +#' } spod_get_od_v1 <- function( zones = c("districts", "dist", "distr", "distritos", "municipalities", "muni", "municip", "municipios"), dates = NULL, data_dir = spod_get_data_dir(), - quiet = FALSE + quiet = FALSE, + duck_max_mem = 2, + duck_max_threads = parallelly::availableCores() ) { # hardcode od as this is a wrapper to get origin-destiation data type <- "od" @@ -246,37 +291,59 @@ spod_get_od_v1 <- function( zones <- match.arg(zones) zones <- spod_zone_names_en2es(zones) - dates <- spod_dates_argument_to_dates_seq(dates = dates) - # use the spot_download_data() function to download any missing data - spod_download_data( - type = type, - zones = zones, - dates = dates, - data_dir = data_dir, - return_output = FALSE + if (is.character(dates)) { + if ( dates != "cached" ) { + dates <- spod_dates_argument_to_dates_seq(dates = dates) + # use the spot_download_data() function to download any missing data + spod_download_data( + type = type, + zones = zones, + dates = dates, + data_dir = data_dir, + return_output = FALSE + ) + } + } + + # create in memory duckdb connection + drv <- duckdb::duckdb() + con <- DBI::dbConnect(drv, dbdir = ":memory:", read_only = FALSE) + + # define memory and threads limits + con <- spod_duckdb_limit_resources( + con = con, + duck_max_mem = duck_max_mem, + duck_max_threads = duck_max_threads ) + # attach the od folder of csv.gz files with predefined and cleaned up data types con <- spod_duckdb_od_v1( + con = con, zones = zones, data_dir = data_dir ) # filter by date # actually, it seems like this works even if we do not return the 'con' from the function below, but I guess it is safer to return the 'con' and resave it to the 'con' of the environment/scope of this function - con <- spod_duckdb_filter_by_dates(con, "od", "od_filtered", dates) + if (is.character(dates)) { + if ( dates != "cached" ) { + con <- spod_duckdb_filter_by_dates(con, "od_csv_clean", "od_csv_clean_filtered", dates) + } + } + # DBI::dbListTables(con) # for debugging only - # dplyr::tbl(con, "trips_view") |> dplyr::glimpse() # for debugging only + # dplyr::tbl(con, "od_csv_clean") |> dplyr::glimpse() # for debugging only # DBI::dbDisconnect(con) # for debugging only # speed comparison REMOVE a bit later AFTER TESTING # b1 <- bench::mark(iterations = 5, check = FALSE, - # hive_date = {dplyr::tbl(con, "trips") |> + # hive_date = {dplyr::tbl(con, "od_csv_clean") |> # dplyr::distinct(full_date) |> # dplyr::collect()}, # this is prefiltered using custom SQL query using only the columns (year, month, day) that we know are constructed from the hive style partitioning - # full_date = {dplyr::tbl(con, "trips_view") |> + # full_date = {dplyr::tbl(con, "od_csv_clean") |> # dplyr::filter(full_date %in% dates) |> # dplyr::distinct(full_date) |> # dplyr::collect()} # this is causing DuckDB to scan ALL csv.gz files in the folder because it has to match the desired dates with full_date column @@ -291,5 +358,11 @@ spod_get_od_v1 <- function( # not a problem! can be done with: # DBI::dbDisconnect(od$src$con) - return(dplyr::tbl(con, "od_filtered")) + if (is.character(dates)) { + if ( dates != "cached" ) { + return(dplyr::tbl(con, "od_csv_clean_filtered")) + } + } else { + return(dplyr::tbl(con, "od_csv_clean")) + } } diff --git a/R/internal_utils.R b/R/internal_utils.R index 7fd6d5c..27f9049 100644 --- a/R/internal_utils.R +++ b/R/internal_utils.R @@ -12,9 +12,9 @@ #' #' * A date range #' -#' * eigher a `character` or `Date` object of length 2 with clearly named elements `start` and `end` in ISO (YYYY-MM-DD) or YYYYMMDD format. E.g. `c(start = "2020-02-15", end = "2020-02-17")`; +#' * eigher a `character` or `Date` object of length 2 with clearly named elements `start` and `end` in ISO (YYYY-MM-DD) or YYYYMMDD format. E.g. `c(start = "2020-02-15", end = "2020-02-17")`; #' -#' * or a `character` object of the form `YYYY-MM-DD_YYYY-MM-DD` or `YYYYMMDD_YYYYMMDD`. For example, `2020-02-15_2020-02-17` or `20200215_20200217`. +#' * or a `character` object of the form `YYYY-MM-DD_YYYY-MM-DD` or `YYYYMMDD_YYYYMMDD`. For example, `2020-02-15_2020-02-17` or `20200215_20200217`. #' #' * A regular expression to match dates in the format `YYYYMMDD`. `character` object. For example, `^202002` will match all dates in February 2020. #' @@ -22,6 +22,7 @@ #' @return A character vector of dates in ISO format (YYYY-MM-DD). #' @keywords internal spod_dates_argument_to_dates_seq <- function(dates) { + if (is.null(dates) || (!is.character(dates) && !inherits(dates, "Date"))) { stop("Invalid date input format. Please provide a character vector or Date object.") } @@ -231,5 +232,3 @@ spod_match_data_type <- function( # need to add a warning here that the type is not recognized return(NULL) } - - diff --git a/man/spod_convert_od_v1_to_duckdb.Rd b/man/spod_convert_od_v1_to_duckdb.Rd new file mode 100644 index 0000000..76e280f --- /dev/null +++ b/man/spod_convert_od_v1_to_duckdb.Rd @@ -0,0 +1,35 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/convert_data.R +\name{spod_convert_od_v1_to_duckdb} +\alias{spod_convert_od_v1_to_duckdb} +\title{Convert all downloaded v1 origin-destination data to duckdb} +\usage{ +spod_convert_od_v1_to_duckdb( + zones = c("districts", "dist", "distr", "distritos", "municipalities", "muni", + "municip", "municipios"), + data_dir = spod_get_data_dir(), + save_dir = NULL, + quiet = FALSE, + duck_max_mem = 3, + duck_max_threads = parallelly::availableCores(), + overwrite = FALSE +) +} +\arguments{ +\item{zones}{The zones for which to download the data. Can be \code{"districts"} (or \code{"dist"}, \code{"distr"}, or the original Spanish \code{"distritos"}) or \code{"municipalities"} (or \code{"muni"}, \code{"municip"}, or the original Spanish \code{"municipios"}).} + +\item{data_dir}{The directory where the data is stored.} + +\item{save_dir}{The path to the directory where the duckdb files will be saved. If \code{NULL}, uses the default location in \code{data_dir} (set by the \code{SPANISH_OD_DATA_DIR} environment variable). Therefore, the default relative path is \verb{/clean_data/v1/tabular/duckdb/od_.duckdb}.} + +\item{quiet}{Whether to suppress messages. Defaults to \code{FALSE}.} + +\item{duck_max_mem}{The maximum memory to use in GB. A conservative default is 3 GB, which should be enough for resaving the data to DuckDB form a folder of CSV.gz files while being small enough to fit in memory of most even old computers. For data analysis using the already converted data (in DuckDB or Parquet format) or with the raw CSV.gz data, it is recommended to increase it according to available resources.} + +\item{duck_max_threads}{The maximum number of threads to use. Defaults to the number of available cores minus 1.} + +\item{overwrite}{Logical. If \code{TRUE}, overwrites existing duckdb files. Defaults to \code{FALSE}.} +} +\description{ +Convert all downloaded v1 origin-destination data to duckdb +} diff --git a/man/spod_dates_argument_to_dates_seq.Rd b/man/spod_dates_argument_to_dates_seq.Rd index d9f5b21..54ecc41 100644 --- a/man/spod_dates_argument_to_dates_seq.Rd +++ b/man/spod_dates_argument_to_dates_seq.Rd @@ -14,8 +14,10 @@ The possible values can be any of the following: \item A single date in ISO (YYYY-MM-DD) or YYYYMMDD format. \code{character} or \code{Date} object. \item A vector of dates in ISO (YYYY-MM-DD) or YYYYMMDD format. \code{character} or \code{Date} object. Can be any non-consecutive sequence of dates. \item A date range +\itemize{ \item eigher a \code{character} or \code{Date} object of length 2 with clearly named elements \code{start} and \code{end} in ISO (YYYY-MM-DD) or YYYYMMDD format. E.g. \code{c(start = "2020-02-15", end = "2020-02-17")}; \item or a \code{character} object of the form \code{YYYY-MM-DD_YYYY-MM-DD} or \code{YYYYMMDD_YYYYMMDD}. For example, \verb{2020-02-15_2020-02-17} or \verb{20200215_20200217}. +} \item A regular expression to match dates in the format \code{YYYYMMDD}. \code{character} object. For example, \verb{^202002} will match all dates in February 2020. }} } diff --git a/man/spod_download_data.Rd b/man/spod_download_data.Rd index 4b54e42..68ef4d4 100644 --- a/man/spod_download_data.Rd +++ b/man/spod_download_data.Rd @@ -27,8 +27,10 @@ The possible values can be any of the following: \item A single date in ISO (YYYY-MM-DD) or YYYYMMDD format. \code{character} or \code{Date} object. \item A vector of dates in ISO (YYYY-MM-DD) or YYYYMMDD format. \code{character} or \code{Date} object. Can be any non-consecutive sequence of dates. \item A date range +\itemize{ \item eigher a \code{character} or \code{Date} object of length 2 with clearly named elements \code{start} and \code{end} in ISO (YYYY-MM-DD) or YYYYMMDD format. E.g. \code{c(start = "2020-02-15", end = "2020-02-17")}; \item or a \code{character} object of the form \code{YYYY-MM-DD_YYYY-MM-DD} or \code{YYYYMMDD_YYYYMMDD}. For example, \verb{2020-02-15_2020-02-17} or \verb{20200215_20200217}. +} \item A regular expression to match dates in the format \code{YYYYMMDD}. \code{character} object. For example, \verb{^202002} will match all dates in February 2020. }} diff --git a/man/spod_duckdb_filter_by_dates.Rd b/man/spod_duckdb_filter_by_dates.Rd new file mode 100644 index 0000000..0d924f5 --- /dev/null +++ b/man/spod_duckdb_filter_by_dates.Rd @@ -0,0 +1,32 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/duckdb_helpers.R +\name{spod_duckdb_filter_by_dates} +\alias{spod_duckdb_filter_by_dates} +\title{Filter a duckdb conenction by dates} +\usage{ +spod_duckdb_filter_by_dates(con, source_view_name, new_view_name, dates) +} +\arguments{ +\item{con}{A duckdb connection} + +\item{source_view_name}{The name of the source duckdb "view" (the virtual table, in the context of current package likely connected to a folder of CSV files)} + +\item{new_view_name}{The name of the new duckdb "view" (the virtual table, in the context of current package likely connected to a folder of CSV files).} + +\item{dates}{A \code{character} or \code{Date} vector of dates to process. Kindly keep in mind that v1 and v2 data follow different data collection methodologies and may not be directly comparable. Therefore, do not try to request data from both versions for the same date range. If you need to compare data from both versions, please refer to the respective codebooks and methodology documents. The v1 data covers the period from 2020-02-14 to 2021-05-09, and the v2 data covers the period from 2022-01-01 to the present until further notice. The true dates range is checked against the available data for each version on every function run. + +The possible values can be any of the following: +\itemize{ +\item A single date in ISO (YYYY-MM-DD) or YYYYMMDD format. \code{character} or \code{Date} object. +\item A vector of dates in ISO (YYYY-MM-DD) or YYYYMMDD format. \code{character} or \code{Date} object. Can be any non-consecutive sequence of dates. +\item A date range +\itemize{ +\item eigher a \code{character} or \code{Date} object of length 2 with clearly named elements \code{start} and \code{end} in ISO (YYYY-MM-DD) or YYYYMMDD format. E.g. \code{c(start = "2020-02-15", end = "2020-02-17")}; +\item or a \code{character} object of the form \code{YYYY-MM-DD_YYYY-MM-DD} or \code{YYYYMMDD_YYYYMMDD}. For example, \verb{2020-02-15_2020-02-17} or \verb{20200215_20200217}. +} +\item A regular expression to match dates in the format \code{YYYYMMDD}. \code{character} object. For example, \verb{^202002} will match all dates in February 2020. +}} +} +\description{ +Filter a duckdb conenction by dates +} diff --git a/man/spod_duckdb_limit_resources.Rd b/man/spod_duckdb_limit_resources.Rd new file mode 100644 index 0000000..d0122b9 --- /dev/null +++ b/man/spod_duckdb_limit_resources.Rd @@ -0,0 +1,22 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/duckdb_helpers.R +\name{spod_duckdb_limit_resources} +\alias{spod_duckdb_limit_resources} +\title{Set maximum memory and number of threads for a DuckDB connection} +\usage{ +spod_duckdb_limit_resources( + con, + duck_max_mem = 3, + duck_max_threads = parallelly::availableCores() - 1 +) +} +\arguments{ +\item{con}{A duckdb connection} + +\item{duck_max_mem}{The maximum memory to use in GB. A conservative default is 3 GB, which should be enough for resaving the data to DuckDB form a folder of CSV.gz files while being small enough to fit in memory of most even old computers. For data analysis using the already converted data (in DuckDB or Parquet format) or with the raw CSV.gz data, it is recommended to increase it according to available resources.} + +\item{duck_max_threads}{The maximum number of threads to use. Defaults to the number of available cores minus 1.} +} +\description{ +Set maximum memory and number of threads for a DuckDB connection +} diff --git a/man/spod_duckdb_od_v1.Rd b/man/spod_duckdb_od_v1.Rd index b75ca75..f2e59bb 100644 --- a/man/spod_duckdb_od_v1.Rd +++ b/man/spod_duckdb_od_v1.Rd @@ -2,41 +2,30 @@ % Please edit documentation in R/duckdb_helpers.R \name{spod_duckdb_od_v1} \alias{spod_duckdb_od_v1} -\title{Function to create a duckdb connection to v1 OD data} +\title{Creates a duckdb connection to v1 OD data} \usage{ spod_duckdb_od_v1( + con = DBI::dbConnect(duckdb::duckdb(), dbdir = ":memory:", read_only = FALSE), zones = c("districts", "dist", "distr", "distritos", "municipalities", "muni", "municip", "municipios", "lau", "large_urban_areas", "gau", "grandes_areas_urbanas"), - dates = NULL, data_dir = spod_get_data_dir() ) } \arguments{ -\item{zones}{The zones for which to download the data. Can be \code{"districts"} (or \code{"dist"}, \code{"distr"}, or the original Spanish \code{"distritos"}) or \code{"municipalities"} (or \code{"muni"}, \code{"municip"}, or the original Spanish \code{"municipios"}). Additionaly, these can be \code{"large_urban_areas"} (or \code{"lau"}, or the original Spanish \code{"grandes_areas_urbanas"}, or \code{"gau"}) for v2 data.} - -\item{dates}{A \code{character} or \code{Date} vector of dates to process. Kindly keep in mind that v1 and v2 data follow different data collection methodologies and may not be directly comparable. Therefore, do not try to request data from both versions for the same date range. If you need to compare data from both versions, please refer to the respective codebooks and methodology documents. The v1 data covers the period from 2020-02-14 to 2021-05-09, and the v2 data covers the period from 2022-01-01 to the present until further notice. The true dates range is checked against the available data for each version on every function run. +\item{con}{A duckdb connection object. If not specified, a new in-memory connection will be created.} -The possible values can be any of the following: -\itemize{ -\item A single date in ISO (YYYY-MM-DD) or YYYYMMDD format. \code{character} or \code{Date} object. -\item A vector of dates in ISO (YYYY-MM-DD) or YYYYMMDD format. \code{character} or \code{Date} object. Can be any non-consecutive sequence of dates. -\item A date range -\item eigher a \code{character} or \code{Date} object of length 2 with clearly named elements \code{start} and \code{end} in ISO (YYYY-MM-DD) or YYYYMMDD format. E.g. \code{c(start = "2020-02-15", end = "2020-02-17")}; -\item or a \code{character} object of the form \code{YYYY-MM-DD_YYYY-MM-DD} or \code{YYYYMMDD_YYYYMMDD}. For example, \verb{2020-02-15_2020-02-17} or \verb{20200215_20200217}. -\item A regular expression to match dates in the format \code{YYYYMMDD}. \code{character} object. For example, \verb{^202002} will match all dates in February 2020. -}} +\item{zones}{The zones for which to download the data. Can be \code{"districts"} (or \code{"dist"}, \code{"distr"}, or the original Spanish \code{"distritos"}) or \code{"municipalities"} (or \code{"muni"}, \code{"municip"}, or the original Spanish \code{"municipios"}). Additionaly, these can be \code{"large_urban_areas"} (or \code{"lau"}, or the original Spanish \code{"grandes_areas_urbanas"}, or \code{"gau"}) for v2 data.} \item{data_dir}{The directory where the data is stored. Defaults to the value returned by \code{spod_get_data_dir()} which returns the value of the environment variable \code{SPANISH_OD_DATA_DIR} or a temporary directory if the variable is not set.} } \value{ -A duckdb connection object with 3 views: +A duckdb connection object with 2 views: \itemize{ -\item \code{all_od_v1_csv_files} - a raw table view of all cached CSV files with the origin-destination data that has been previously cached in $SPANISH_OD_DATA_DIR -\item \code{od} - a cleaned-up table view of \code{all_od_v1_csv_files} with column names and values translated and mapped to English. This still includes all cached data. -\item \code{od_filtered} - a filtered view of \code{od} with the desired dates. +\item \code{od_csv_raw} - a raw table view of all cached CSV files with the origin-destination data that has been previously cached in $SPANISH_OD_DATA_DIR +\item \code{od_csv_clean} - a cleaned-up table view of \code{od_csv_raw} with column names and values translated and mapped to English. This still includes all cached data. } -The structure of the cleaned-up views \code{od} and \code{od_filtered} is as follows: +The structure of the cleaned-up views \code{od_csv_clean} is as follows: \describe{ \item{full_date}{\code{Date}. The full date of the trip, including year, month, and day.} @@ -54,7 +43,7 @@ The structure of the cleaned-up views \code{od} and \code{od_filtered} is as fol \item{day}{\code{double}. The day of the trip.} } -The structure of the original data in \code{all_od_v1_csv_files} is as follows: +The structure of the original data in \code{od_csv_raw} is as follows: \describe{ \item{fecha}{\code{Date}. The date of the trip, including year, month, and day.} diff --git a/man/spod_get_od_v1.Rd b/man/spod_get_od_v1.Rd index 532f96a..0c2d3e4 100644 --- a/man/spod_get_od_v1.Rd +++ b/man/spod_get_od_v1.Rd @@ -9,7 +9,9 @@ spod_get_od_v1( "municip", "municipios"), dates = NULL, data_dir = spod_get_data_dir(), - quiet = FALSE + quiet = FALSE, + duck_max_mem = 2, + duck_max_threads = parallelly::availableCores() ) } \arguments{ @@ -22,17 +24,23 @@ The possible values can be any of the following: \item A single date in ISO (YYYY-MM-DD) or YYYYMMDD format. \code{character} or \code{Date} object. \item A vector of dates in ISO (YYYY-MM-DD) or YYYYMMDD format. \code{character} or \code{Date} object. Can be any non-consecutive sequence of dates. \item A date range +\itemize{ \item eigher a \code{character} or \code{Date} object of length 2 with clearly named elements \code{start} and \code{end} in ISO (YYYY-MM-DD) or YYYYMMDD format. E.g. \code{c(start = "2020-02-15", end = "2020-02-17")}; \item or a \code{character} object of the form \code{YYYY-MM-DD_YYYY-MM-DD} or \code{YYYYMMDD_YYYYMMDD}. For example, \verb{2020-02-15_2020-02-17} or \verb{20200215_20200217}. +} \item A regular expression to match dates in the format \code{YYYYMMDD}. \code{character} object. For example, \verb{^202002} will match all dates in February 2020. }} \item{data_dir}{The directory where the data is stored. Defaults to the value returned by \code{spod_get_data_dir()} which returns the value of the environment variable \code{SPANISH_OD_DATA_DIR} or a temporary directory if the variable is not set.} \item{quiet}{Logical. If \code{TRUE}, the function does not print messages to the console. Defaults to \code{FALSE}.} + +\item{duck_max_mem}{The maximum memory to use in GB. A conservative default is 3 GB, which should be enough for resaving the data to DuckDB form a folder of CSV.gz files while being small enough to fit in memory of most even old computers. For data analysis using the already converted data (in DuckDB or Parquet format) or with the raw CSV.gz data, it is recommended to increase it according to available resources.} + +\item{duck_max_threads}{The maximum number of threads to use. Defaults to the number of available cores minus 1.} } \value{ -A duckdb table connection object. It can be manupulated using \code{dplyr} verbs, or can be loaded into memory using \code{dplyr::collect()}. The structure of the object is as follows: +A DuckDB table connection object. It can be manupulated using \code{dplyr} verbs, or can be loaded into memory using \code{dplyr::collect()}. The structure of the object is as follows: \describe{ \item{full_date}{\code{Date}. The full date of the trip, including year, month, and day.} @@ -49,7 +57,46 @@ A duckdb table connection object. It can be manupulated using \code{dplyr} verbs \item{month}{\code{double}. The month of the trip.} \item{day}{\code{double}. The day of the trip.} } + +This object also contains the reference to the source DuckDB conneciton with the full view of the cached data. It can be accessed using \code{od_table$src$con}. See examples below. The connection includes two views: +\itemize{ +\item \code{od_csv_raw} - a raw table view of all cached CSV files with the origin-destination data that has been previously cached in $SPANISH_OD_DATA_DIR +\item \code{od_csv_clean} - a cleaned-up table view of \code{od_csv_raw} with column names and values translated and mapped to English. This still includes all cached data. +} + +View \code{od_csv_clean} has the same structure as the filtered view 'od_filtered', which is returned by \code{spod_get_od_v1()} as a DuckDB table connection object. The view \code{od_csv_raw} has original Spanish column names and values and has the following structure: +\describe{ +\item{fecha}{\code{Date}. The date of the trip, including year, month, and day.} +\item{origen}{\code{character}. The identifier for the origin location of the trip, formatted as a character string (e.g., '01001_AM').} +\item{destino}{\code{character}. The identifier for the destination location of the trip, formatted as a character string (e.g., '01001_AM').} +\item{actividad_origen}{\code{character}. The type of activity at the origin location (e.g., 'casa', 'trabajo').} +\item{actividad_destino}{\code{character}. The type of activity at the destination location (e.g., 'otros', 'trabajo').} +\item{residencia}{\code{character}. The code representing the residence of the individual making the trip (e.g., '01') according to the official INE classification.} +\item{edad}{\code{character}. The age of the individual making the trip. This data is actaully filled with 'NA' values, which is why this column is removed in the cleaned-up and translated view described above.} +\item{periodo}{\code{integer}. The time period during which the trip started, represented as an integer (e.g., 0, 1, 2).} +\item{distancia}{\code{character}. The distance category of the trip, represented as a character string (e.g., '002-005' for 2-5 km).} +\item{viajes}{\code{double}. The number of trips taken within the specified time period and distance.} +\item{viajes_km}{\code{double}. The total length of all trips in kilometers for the specified time period and distance.} +\item{day}{\code{double}. The day of the trip.} +\item{month}{\code{double}. The month of the trip.} +\item{year}{\code{double}. The year of the trip.} +} } \description{ This function retrieves the v1 (2020-2021) origin_destination_data for the specified dates. It checks if the requested data is already cached locally and downloads it if it is not. When all the requested data is cached, it creates a \code{DuckDB} connection to the cache data folder and provides an table } +\examples{ +\dontrun{ + +# create a connection to the v1 data +Sys.setenv(SPANISH_OD_DATA_DIR = "~/home/nosync/cache/mitma") +dates <- c("2020-02-14", "2020-03-14", "2021-02-14", "2021-02-14", "2021-02-15") +od_dist <- spod_get_od_v1(zones = "distr", dates = dates) + +# od dist is a table view filtered to the specified dates + +# access the source connection with all dates +# list tables +DBI::dbListTables(od_dist$src$con) +} +} diff --git a/man/spod_sql_where_dates.Rd b/man/spod_sql_where_dates.Rd index 19986cf..b0fc43e 100644 --- a/man/spod_sql_where_dates.Rd +++ b/man/spod_sql_where_dates.Rd @@ -1,8 +1,8 @@ % Generated by roxygen2: do not edit by hand -% Please edit documentation in R/internal_utils.R +% Please edit documentation in R/duckdb_helpers.R \name{spod_sql_where_dates} \alias{spod_sql_where_dates} -\title{Function to generate the SQL query from a sequence of dates} +\title{Generate a WHERE part of an SQL query from a sequence of dates} \usage{ spod_sql_where_dates(dates) } @@ -13,6 +13,6 @@ spod_sql_where_dates(dates) A character vector of the SQL query. } \description{ -Function to generate the SQL query from a sequence of dates +Generate a WHERE part of an SQL query from a sequence of dates } \keyword{internal} diff --git a/man/spod_subfolder_clean_data_cache.Rd b/man/spod_subfolder_clean_data_cache.Rd new file mode 100644 index 0000000..1faecde --- /dev/null +++ b/man/spod_subfolder_clean_data_cache.Rd @@ -0,0 +1,18 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/folders.R +\name{spod_subfolder_clean_data_cache} +\alias{spod_subfolder_clean_data_cache} +\title{Get clean data subfolder name} +\usage{ +spod_subfolder_clean_data_cache(ver = 1) +} +\arguments{ +\item{ver}{Integer. The version of the data. Must be 1 or 2.} +} +\value{ +Character string with the subfolder name for the clean data cache. +} +\description{ +Change subfolder name in the code of this function for clean data cache here to apply globally, as all functions in the package should use this function to get the clean data cache path. +} +\keyword{internal} diff --git a/man/spod_subfolder_raw_data_cache.Rd b/man/spod_subfolder_raw_data_cache.Rd index 373669f..e962f59 100644 --- a/man/spod_subfolder_raw_data_cache.Rd +++ b/man/spod_subfolder_raw_data_cache.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/folders.R \name{spod_subfolder_raw_data_cache} \alias{spod_subfolder_raw_data_cache} -\title{Change subfolder name for raw data cache here to apply globally} +\title{Get raw data cache subfolder name} \usage{ spod_subfolder_raw_data_cache(ver = 1) } @@ -13,6 +13,6 @@ spod_subfolder_raw_data_cache(ver = 1) Character string with the subfolder name for the raw data cache. } \description{ -Change subfolder name for raw data cache here to apply globally +Change subfolder name in the code of this function for raw data cache here to apply globally, as all functions in the package should use this function to get the raw data cache path. } \keyword{internal} From bb61049adbe4c65763d18d93c39d5ae16c513d8b Mon Sep 17 00:00:00 2001 From: Egor Kotov Date: Mon, 12 Aug 2024 10:37:48 +0200 Subject: [PATCH 15/21] convert to duckdb returns db file path --- R/convert_data.R | 3 ++- man/spod_convert_od_v1_to_duckdb.Rd | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/R/convert_data.R b/R/convert_data.R index ca430e4..61ee141 100644 --- a/R/convert_data.R +++ b/R/convert_data.R @@ -5,6 +5,7 @@ #' @inheritParams spod_get_zones_v1 #' @inheritParams spod_duckdb_limit_resources #' @param overwrite Logical. If `TRUE`, overwrites existing duckdb files. Defaults to `FALSE`. +#' @return Path to saved DuckDB file. #' @export spod_convert_od_v1_to_duckdb <- function( zones = c("districts", "dist", "distr", "distritos", @@ -87,5 +88,5 @@ spod_convert_od_v1_to_duckdb <- function( message("Cached v1 origin-destination data imported to DuckDB at: ", duckdb_save_path) - return(invisible(NULL)) + return(duckdb_save_path) } \ No newline at end of file diff --git a/man/spod_convert_od_v1_to_duckdb.Rd b/man/spod_convert_od_v1_to_duckdb.Rd index 76e280f..25c52da 100644 --- a/man/spod_convert_od_v1_to_duckdb.Rd +++ b/man/spod_convert_od_v1_to_duckdb.Rd @@ -30,6 +30,9 @@ spod_convert_od_v1_to_duckdb( \item{overwrite}{Logical. If \code{TRUE}, overwrites existing duckdb files. Defaults to \code{FALSE}.} } +\value{ +Path to saved DuckDB file. +} \description{ Convert all downloaded v1 origin-destination data to duckdb } From f06fd2ac866f0a74ced6ee6cbe5368acd31103a7 Mon Sep 17 00:00:00 2001 From: robinlovelace Date: Mon, 12 Aug 2024 10:49:44 +0100 Subject: [PATCH 16/21] Auto-style, close #2 --- R/convert_data.R | 44 ++++----- R/download_data.R | 91 ++++++++++--------- R/duckdb_helpers.R | 117 +++++++++++++----------- R/folders.R | 6 +- R/get.R | 127 +++++++++++++------------- R/get_v1_data.R | 130 ++++++++++++++------------- R/internal_utils.R | 100 ++++++++++----------- README.qmd | 2 + tests/testthat/test-internal_utils.R | 12 ++- vignettes/work-with-v1-data.qmd | 38 +++++--- 10 files changed, 353 insertions(+), 314 deletions(-) diff --git a/R/convert_data.R b/R/convert_data.R index 61ee141..cf4a963 100644 --- a/R/convert_data.R +++ b/R/convert_data.R @@ -1,6 +1,5 @@ - #' Convert all downloaded v1 origin-destination data to duckdb -#' +#' #' @param save_dir The path to the directory where the duckdb files will be saved. If `NULL`, uses the default location in `data_dir` (set by the `SPANISH_OD_DATA_DIR` environment variable). Therefore, the default relative path is `/clean_data/v1/tabular/duckdb/od_.duckdb`. #' @inheritParams spod_get_zones_v1 #' @inheritParams spod_duckdb_limit_resources @@ -8,16 +7,16 @@ #' @return Path to saved DuckDB file. #' @export spod_convert_od_v1_to_duckdb <- function( - zones = c("districts", "dist", "distr", "distritos", - "municipalities", "muni", "municip", "municipios"), - data_dir = spod_get_data_dir(), - save_dir = NULL, - quiet = FALSE, - duck_max_mem = 3, - duck_max_threads = parallelly::availableCores(), - overwrite = FALSE -) { - + zones = c( + "districts", "dist", "distr", "distritos", + "municipalities", "muni", "municip", "municipios" + ), + data_dir = spod_get_data_dir(), + save_dir = NULL, + quiet = FALSE, + duck_max_mem = 3, + duck_max_threads = parallelly::availableCores(), + overwrite = FALSE) { zones <- match.arg(zones) zones <- spod_zone_names_en2es(zones) @@ -26,7 +25,8 @@ spod_convert_od_v1_to_duckdb <- function( save_dir <- fs::path( data_dir, spod_subfolder_clean_data_cache(ver = 1), - "tabular/duckdb/") + "tabular/duckdb/" + ) } # ensure save_dir exists @@ -50,21 +50,21 @@ spod_convert_od_v1_to_duckdb <- function( fs::file_delete(duckdb_save_path) } } - + if (isFALSE(quiet)) message(glue::glue("Using {duck_max_mem} GB of memory and {duck_max_threads} threads. You may adjust this using the function arguments `duck_max_mem` and `duck_max_threads`.")) if (isFALSE(quiet)) message(glue::glue("Converting cached v1 od data for {zones} to DuckDB: ", duckdb_save_path, "... This may take a while.")) # add some indication on how long it may take from empirical experimentation # hopefully, the progress_bar feature will be implemented in duckdb R package soon, bug filed here https://github.com/duckdb/duckdb-r/issues/199 - - # get dates of cached data + + # get dates of cached data # v1_meta <- spod_available_data_v1(check_local_files = TRUE) - + # v1_meta <- v1_meta[v1_meta$downloaded == TRUE,] # v1_meta <- v1_meta[grepl("maestra1", v1_meta$local_path),] # v1_meta <- v1_meta[grepl(zones, v1_meta$local_path),] - + # dates <- v1_meta$data_ymd - + # create duckdb connection drv <- duckdb::duckdb() con <- DBI::dbConnect(drv, dbdir = duckdb_save_path, read_only = FALSE) @@ -82,11 +82,11 @@ spod_convert_od_v1_to_duckdb <- function( # import view of CSV files into duckdb DBI::dbExecute(con, "CREATE TABLE od AS SELECT * FROM od_csv_clean ;") - + DBI::dbDisconnect(con, shutdown = TRUE) duckdb::duckdb_shutdown(drv) - + message("Cached v1 origin-destination data imported to DuckDB at: ", duckdb_save_path) return(duckdb_save_path) -} \ No newline at end of file +} diff --git a/R/download_data.R b/R/download_data.R index ed16179..272ed96 100644 --- a/R/download_data.R +++ b/R/download_data.R @@ -1,5 +1,5 @@ #' Download the data files of specified type, zones, and dates -#' +#' #' This function downloads the data files of the specified type, zones, dates and data version. #' @param type The type of data to download. Can be `"origin-destination"` (or ust `"od"`), or `"trips_per_person"` (or just `"tpp"`) for v1 data. For v2 data `"overnight_stays"` (or just `"os"`) is also available. More data types to be supported in the future. See respective codebooks for more information. **ADD CODEBOOKS! to the package** #' @param zones The zones for which to download the data. Can be `"districts"` (or `"dist"`, `"distr"`, or the original Spanish `"distritos"`) or `"municipalities"` (or `"muni"`, `"municip"`, or the original Spanish `"municipios"`). Additionaly, these can be `"large_urban_areas"` (or `"lau"`, or the original Spanish `"grandes_areas_urbanas"`, or `"gau"`) for v2 data. @@ -7,42 +7,50 @@ #' @param data_dir The directory where the data is stored. Defaults to the value returned by `spod_get_data_dir()` which returns the value of the environment variable `SPANISH_OD_DATA_DIR` or a temporary directory if the variable is not set. #' @param quiet Logical. If `TRUE`, the function does not print messages to the console. Defaults to `FALSE`. #' @param return_output Logical. If `TRUE`, the function returns a character vector of the paths to the downloaded files. If `FALSE`, the function returns `NULL`. -#' +#' #' @return A character vector of the paths to the downloaded files. Unless `return_output = FALSE`, in which case the function returns `NULL`. -#' -#' @export +#' +#' @export #' @examples #' \dontrun{ #' # Download the origin-destination on district level for the a date range in March 2020 -#' spod_download_data(type = "od", zones = "districts", -#' date_range = c("2020-03-20", "2020-03-24")) -#' +#' spod_download_data( +#' type = "od", zones = "districts", +#' date_range = c("2020-03-20", "2020-03-24") +#' ) +#' #' # Download the origin-destination on district level for select dates in 2020 and 2021 -#' spod_download_data(type = "od", zones = "dist", -#' dates_list = c("2020-03-20", "2020-03-24", "2021-03-20", "2021-03-24")) -#' -#' # Download the origin-destination on municipality level using regex for a date range in March 2020 +#' spod_download_data( +#' type = "od", zones = "dist", +#' dates_list = c("2020-03-20", "2020-03-24", "2021-03-20", "2021-03-24") +#' ) +#' +#' # Download the origin-destination on municipality level using regex for a date range in March 2020 #' # (the regex will capture the dates 2020-03-20 to 2020-03-24) -#' spod_download_data(type = "od", zones = "municip", -#' date_regex = "2020032[0-4]") +#' spod_download_data( +#' type = "od", zones = "municip", +#' date_regex = "2020032[0-4]" +#' ) #' } spod_download_data <- function( - type = c( - "od", "origin-destination", - "os", "overnight_stays", - "tpp", "trips_per_person"), - zones = c("districts", "dist", "distr", "distritos", - "municipalities", "muni", "municip", "municipios", - "lau", "large_urban_areas", "gau", "grandes_areas_urbanas"), # implement "urban_areas" for v2 data - dates = NULL, - data_dir = spod_get_data_dir(), - quiet = FALSE, - return_output = TRUE -) { + type = c( + "od", "origin-destination", + "os", "overnight_stays", + "tpp", "trips_per_person" + ), + zones = c( + "districts", "dist", "distr", "distritos", + "municipalities", "muni", "municip", "municipios", + "lau", "large_urban_areas", "gau", "grandes_areas_urbanas" + ), # implement "urban_areas" for v2 data + dates = NULL, + data_dir = spod_get_data_dir(), + quiet = FALSE, + return_output = TRUE) { # convert english zone names to spanish words used in the default data paths zones <- match.arg(zones) zones <- spod_zone_names_en2es(zones) - + dates_to_use <- spod_dates_argument_to_dates_seq(dates = dates) @@ -50,41 +58,44 @@ spod_download_data <- function( # replace this argument with automatic version detection based on the dates requested? ver <- spod_infer_data_v_from_dates(dates_to_use) # this leads to a second call to an internal spod_get_valid_dates() which in turn causes a second call to spod_available_data_v1() or spod_get_metadata(). This results in reading thedates_to_use <- spod_dates_argument_to_dates_seq(dates = dates) xml files with metadata for the second time. This is not optimal and should be fixed. if (isFALSE(quiet)) message("Data version detected from dates: ", ver) - + # convert english data type names to spanish words used in the default data paths type <- match.arg(type) type <- spod_match_data_type(type = type, ver = ver) - - - + + + # get the available data list while checking for files already cached on disk - if( ver == 1) { - metadata <- spod_available_data_v1(data_dir = data_dir, - check_local_files = TRUE) + if (ver == 1) { + metadata <- spod_available_data_v1( + data_dir = data_dir, + check_local_files = TRUE + ) } else if (ver == 2) { metadata <- spod_get_metadata(data_dir = data_dir) # replace with spod_available_data_v2() when available, spod_get_metadata can become a wrapper with v1/v2 argument. Potentially we can even automaticaly detect the data version based on the time intervals that user requests, but this is a bit controversial, as the methodology behind v1 and v2 data generation is not the same and Nommon+MITMA do not recommend mixing those together and comparing absoloute numbers of trips. } - + # match the metadata to type, zones, version and dates - if(ver == 1){ + if (ver == 1) { requested_files <- metadata[ grepl(glue::glue("v{ver}.*{type}.*{zones}"), metadata$local_path) & - metadata$data_ymd %in% dates_to_use, + metadata$data_ymd %in% dates_to_use, ] - } else if(ver == 2){ + } else if (ver == 2) { requested_files <- metadata[ grepl(glue::glue("v{ver}.*{zones}.*{type}"), metadata$local_path) & - metadata$data_ymd %in% dates_to_use, + metadata$data_ymd %in% dates_to_use, ] } files_to_download <- requested_files[!requested_files$downloaded, ] - + # pre-generate target paths for the files to download fs::dir_create( unique(fs::path_dir(files_to_download$local_path)), - recurse = TRUE) + recurse = TRUE + ) # download the missing files downloaded_files <- curl::multi_download( diff --git a/R/duckdb_helpers.R b/R/duckdb_helpers.R index 8d39a4f..8d02874 100644 --- a/R/duckdb_helpers.R +++ b/R/duckdb_helpers.R @@ -1,18 +1,17 @@ - #' Creates a duckdb connection to v1 OD data -#' +#' #' This function creates a duckdb connection to the v1 OD data. -#' +#' #' @param con A duckdb connection object. If not specified, a new in-memory connection will be created. #' @inheritParams spod_download_data #' @return A duckdb connection object with 2 views: -#' +#' #' * `od_csv_raw` - a raw table view of all cached CSV files with the origin-destination data that has been previously cached in $SPANISH_OD_DATA_DIR -#' +#' #' * `od_csv_clean` - a cleaned-up table view of `od_csv_raw` with column names and values translated and mapped to English. This still includes all cached data. -#' +#' #' The structure of the cleaned-up views `od_csv_clean` is as follows: -#' +#' #' \describe{ #' \item{full_date}{\code{Date}. The full date of the trip, including year, month, and day.} #' \item{id_origin}{\code{factor}. The identifier for the origin location of the trip, formatted as a code (e.g., '01001_AM').} @@ -28,9 +27,9 @@ #' \item{month}{\code{double}. The month of the trip.} #' \item{day}{\code{double}. The day of the trip.} #' } -#' +#' #' The structure of the original data in `od_csv_raw` is as follows: -#' +#' #' \describe{ #' \item{fecha}{\code{Date}. The date of the trip, including year, month, and day.} #' \item{origen}{\code{character}. The identifier for the origin location of the trip, formatted as a character string (e.g., '01001_AM').} @@ -49,17 +48,18 @@ #' } #' @keywords internal spod_duckdb_od_v1 <- function( - con = DBI::dbConnect(duckdb::duckdb(), dbdir = ":memory:", read_only = FALSE), - zones = c("districts", "dist", "distr", "distritos", - "municipalities", "muni", "municip", "municipios", - "lau", "large_urban_areas", "gau", "grandes_areas_urbanas"), - data_dir = spod_get_data_dir() -) { + con = DBI::dbConnect(duckdb::duckdb(), dbdir = ":memory:", read_only = FALSE), + zones = c( + "districts", "dist", "distr", "distritos", + "municipalities", "muni", "municip", "municipios", + "lau", "large_urban_areas", "gau", "grandes_areas_urbanas" + ), + data_dir = spod_get_data_dir()) { ver <- 1 - + zones <- match.arg(zones) zones <- spod_zone_names_en2es(zones) - + csv_folder <- paste0( data_dir, "/", spod_subfolder_raw_data_cache(ver = ver), @@ -70,7 +70,8 @@ spod_duckdb_od_v1 <- function( # create view of csv files and preset variable types if (zones == "distritos") { - DBI::dbSendStatement(con, + DBI::dbSendStatement( + con, dplyr::sql( glue::glue( "CREATE VIEW od_csv_raw AS SELECT * @@ -92,8 +93,9 @@ spod_duckdb_od_v1 <- function( ) ) ) - } else if (zones == "municipios") { - DBI::dbSendStatement(con, + } else if (zones == "municipios") { + DBI::dbSendStatement( + con, dplyr::sql( glue::glue( "CREATE VIEW od_csv_raw AS SELECT * @@ -117,7 +119,7 @@ spod_duckdb_od_v1 <- function( # DBI::dbGetQuery(con, "SELECT * FROM od_csv_raw LIMIT 10") |> dplyr::glimpse() # for debugging # create ENUMs - + # zones ENUMs zones <- spod_zone_names_en2es(zones) spatial_data <- spod_get_zones_v1(zones, quiet = TRUE) @@ -125,7 +127,8 @@ spod_duckdb_od_v1 <- function( DBI::dbSendStatement( con, dplyr::sql( - paste0("CREATE TYPE ZONES_ENUM AS ENUM ('", + paste0( + "CREATE TYPE ZONES_ENUM AS ENUM ('", paste0(unique_ids, collapse = "','"), "');" ) @@ -135,12 +138,12 @@ spod_duckdb_od_v1 <- function( # create ACTIV_ENUM if (zones == "distritos") { DBI::dbSendStatement( - con, - dplyr::sql("CREATE TYPE ACTIV_ENUM AS ENUM ('home', 'work', 'other')") + con, + dplyr::sql("CREATE TYPE ACTIV_ENUM AS ENUM ('home', 'work', 'other')") ) } - # create DISTANCE_ENUM + # create DISTANCE_ENUM DBI::dbSendStatement( con, dplyr::sql("CREATE TYPE DISTANCE_ENUM AS ENUM ('002-005', '005-010', '010-050', '0005-002', '050-100', '100+');") @@ -152,7 +155,7 @@ spod_duckdb_od_v1 <- function( # DBI::dbGetQuery(con, "SELECT enum_range(NULL::INE_PROV_ENUM)") # check that it was created, remove this line when package is stable # for debugging # DBI::dbSendStatement(con, "DROP TYPE INE_PROV_ENUM") # remove this line when package is stable - + # create second view with desired data types including ENUMs # create view to fix variable types and recode values to English # NOTE: thsi raises non-ASCII character WARNING on R CMD check, so will need to store this query in a text file @@ -160,11 +163,14 @@ spod_duckdb_od_v1 <- function( when_then_provinces <- readLines( system.file( "extdata/sql-queries/when-recode-provinces.txt", - package = "spanishoddata")) |> + package = "spanishoddata" + ) + ) |> paste(collapse = "\n") # now execute the query pasting in the contents of when_then_provinces - DBI::dbSendStatement(con, + DBI::dbSendStatement( + con, dplyr::sql( glue::glue( "CREATE VIEW od_csv_clean AS SELECT @@ -196,7 +202,8 @@ spod_duckdb_od_v1 <- function( ) ) } else if (zones == "municipios") { - DBI::dbSendStatement(con, + DBI::dbSendStatement( + con, dplyr::sql( "CREATE VIEW od_csv_clean AS SELECT fecha AS full_date, @@ -227,7 +234,7 @@ spod_duckdb_od_v1 <- function( #' @param new_view_name The name of the new duckdb "view" (the virtual table, in the context of current package likely connected to a folder of CSV files). #' @inheritParams spod_dates_argument_to_dates_seq #' @param source_view_name The name of the source duckdb "view" (the virtual table, in the context of current package likely connected to a folder of CSV files) -spod_duckdb_filter_by_dates <- function(con, source_view_name, new_view_name, dates){ +spod_duckdb_filter_by_dates <- function(con, source_view_name, new_view_name, dates) { # prepare query to filter by dates query <- dplyr::sql( glue::glue( @@ -235,21 +242,22 @@ spod_duckdb_filter_by_dates <- function(con, source_view_name, new_view_name, da spod_sql_where_dates(dates) ) ) - + # create a view with a filter to the desired dates DBI::dbSendStatement(con, query) return(con) } -spod_duckdb_create_province_enum <- function(con){ - +spod_duckdb_create_province_enum <- function(con) { # load provinces with non-ASCII names provinces_enum <- readLines( system.file("extdata/sql-queries/provinces-enum.txt", - package = "spanishoddata")) |> + package = "spanishoddata" + ) + ) |> paste(collapse = "\n") - + # create INE_PROV_ENUM DBI::dbSendStatement( con, @@ -280,22 +288,25 @@ spod_sql_where_dates <- function(dates) { month = format(dates, "%m"), day = format(dates, "%d") ) - + # Get distinct rows and sort them by year, month, and day date_parts <- date_parts[!duplicated(date_parts), ] date_parts <- date_parts[order(date_parts$year, date_parts$month, date_parts$day), ] - + # Create the WHERE conditions for each unique date where_conditions <- stats::aggregate(day ~ year + month, data = date_parts, FUN = function(x) paste(x, collapse = ", ")) - where_conditions$condition <- paste0("(year = ", where_conditions$year, - " AND month = ", where_conditions$month, - " AND day IN (", where_conditions$day, "))") - + where_conditions$condition <- paste0( + "(year = ", where_conditions$year, + " AND month = ", where_conditions$month, + " AND day IN (", where_conditions$day, "))" + ) + # Combine all conditions into a single WHERE clause - sql_query <- paste0("WHERE ", + sql_query <- paste0( + "WHERE ", paste(where_conditions$condition, collapse = " OR ") ) - + return(sql_query) } @@ -304,23 +315,23 @@ spod_sql_where_dates <- function(dates) { #' @param duck_max_mem The maximum memory to use in GB. A conservative default is 3 GB, which should be enough for resaving the data to DuckDB form a folder of CSV.gz files while being small enough to fit in memory of most even old computers. For data analysis using the already converted data (in DuckDB or Parquet format) or with the raw CSV.gz data, it is recommended to increase it according to available resources. #' @param duck_max_threads The maximum number of threads to use. Defaults to the number of available cores minus 1. spod_duckdb_limit_resources <- function( - con, - duck_max_mem = 3, # in GB, default to 3 GB, should be enough to resave the data and small enough to fit in memory of most even old computers - duck_max_threads = parallelly::availableCores() - 1 # leave one core for other tasks by default -) { - - DBI::dbExecute(con, + con, + duck_max_mem = 3, # in GB, default to 3 GB, should be enough to resave the data and small enough to fit in memory of most even old computers + duck_max_threads = parallelly::availableCores() - 1 # leave one core for other tasks by default + ) { + DBI::dbExecute( + con, dplyr::sql( glue::glue("SET max_memory='{duck_max_mem}GB';") ) ) - - DBI::dbExecute(con, + + DBI::dbExecute( + con, dplyr::sql( glue::glue("SET threads='{duck_max_threads}';") ) ) - + return(con) } - diff --git a/R/folders.R b/R/folders.R index 3ad9989..468c236 100644 --- a/R/folders.R +++ b/R/folders.R @@ -1,5 +1,5 @@ #' Get raw data cache subfolder name -#' +#' #' Change subfolder name in the code of this function for raw data cache here to apply globally, as all functions in the package should use this function to get the raw data cache path. #' @param ver Integer. The version of the data. Must be 1 or 2. #' @return Character string with the subfolder name for the raw data cache. @@ -14,7 +14,7 @@ spod_subfolder_raw_data_cache <- function(ver = 1) { } #' Get clean data subfolder name -#' +#' #' Change subfolder name in the code of this function for clean data cache here to apply globally, as all functions in the package should use this function to get the clean data cache path. #' @param ver Integer. The version of the data. Must be 1 or 2. #' @return Character string with the subfolder name for the clean data cache. @@ -26,4 +26,4 @@ spod_subfolder_clean_data_cache <- function(ver = 1) { } base_subdir_name <- "clean_data" return(paste0(base_subdir_name, "/v", ver, "/")) -} \ No newline at end of file +} diff --git a/R/get.R b/R/get.R index 9484729..f162ddf 100644 --- a/R/get.R +++ b/R/get.R @@ -7,21 +7,20 @@ #' @export #' @examples #' if (FALSE) { -#' spod_get_latest_v2_xml() +#' spod_get_latest_v2_xml() #' } -spod_get_latest_v2_xml = function( +spod_get_latest_v2_xml <- function( data_dir = spod_get_data_dir(), - xml_url = "https://movilidad-opendata.mitma.es/RSS.xml" -) { + xml_url = "https://movilidad-opendata.mitma.es/RSS.xml") { if (!fs::dir_exists(data_dir)) { fs::dir_create(data_dir) } - current_timestamp = format(Sys.time(), format = "%Y-%m-%d", usetz = FALSE, tz = "UTC") - current_filename = glue::glue("{data_dir}/data_links_v2_{current_timestamp}.xml") + current_timestamp <- format(Sys.time(), format = "%Y-%m-%d", usetz = FALSE, tz = "UTC") + current_filename <- glue::glue("{data_dir}/data_links_v2_{current_timestamp}.xml") message("Saving the file to: ", current_filename) - xml_requested = curl::curl_download(url = xml_url, destfile = current_filename, quiet = FALSE) + xml_requested <- curl::curl_download(url = xml_url, destfile = current_filename, quiet = FALSE) return(current_filename) } @@ -36,58 +35,58 @@ spod_get_latest_v2_xml = function( #' @examples #' # Get the data dictionary for the default data directory #' if (FALSE) { -#' metadata = spod_get_metadata() -#' names(metadata) -#' head(metadata) +#' metadata <- spod_get_metadata() +#' names(metadata) +#' head(metadata) #' } -spod_get_metadata = function(data_dir = spod_get_data_dir(), quiet = FALSE) { - xml_files_list = fs::dir_ls(data_dir, type = "file", regexp = "data_links_v2") |> sort() - latest_data_links_xml_path = utils::tail(xml_files_list, 1) +spod_get_metadata <- function(data_dir = spod_get_data_dir(), quiet = FALSE) { + xml_files_list <- fs::dir_ls(data_dir, type = "file", regexp = "data_links_v2") |> sort() + latest_data_links_xml_path <- utils::tail(xml_files_list, 1) if (length(latest_data_links_xml_path) == 0) { - if(isFALSE(quiet)) message("Getting latest data links xml") - latest_data_links_xml_path = spod_get_latest_v2_xml(data_dir = data_dir) + if (isFALSE(quiet)) message("Getting latest data links xml") + latest_data_links_xml_path <- spod_get_latest_v2_xml(data_dir = data_dir) } else { - if(isFALSE(quiet)) message("Using existing data links xml: ", latest_data_links_xml_path) + if (isFALSE(quiet)) message("Using existing data links xml: ", latest_data_links_xml_path) } - x_xml = xml2::read_xml(latest_data_links_xml_path) + x_xml <- xml2::read_xml(latest_data_links_xml_path) - download_dt = tibble::tibble( + download_dt <- tibble::tibble( target_url = xml2::xml_find_all(x = x_xml, xpath = "//link") |> xml2::xml_text(), pub_date = xml2::xml_find_all(x = x_xml, xpath = "//pubDate") |> xml2::xml_text() ) - download_dt$pub_ts = lubridate::dmy_hms(download_dt$pub_date) - download_dt$file_extension = tools::file_ext(download_dt$target_url) - download_dt = download_dt[download_dt$file_extension != "", ] - download_dt$pub_date = NULL + download_dt$pub_ts <- lubridate::dmy_hms(download_dt$pub_date) + download_dt$file_extension <- tools::file_ext(download_dt$target_url) + download_dt <- download_dt[download_dt$file_extension != "", ] + download_dt$pub_date <- NULL - download_dt$data_ym = lubridate::ym(stringr::str_extract(download_dt$target_url, "[0-9]{4}-[0-9]{2}")) - download_dt$data_ymd = lubridate::ymd(stringr::str_extract(download_dt$target_url, "[0-9]{8}")) + download_dt$data_ym <- lubridate::ym(stringr::str_extract(download_dt$target_url, "[0-9]{4}-[0-9]{2}")) + download_dt$data_ymd <- lubridate::ymd(stringr::str_extract(download_dt$target_url, "[0-9]{8}")) # order by pub_ts - download_dt = download_dt[order(download_dt$pub_ts, decreasing = TRUE), ] - download_dt$local_path = file.path( + download_dt <- download_dt[order(download_dt$pub_ts, decreasing = TRUE), ] + download_dt$local_path <- file.path( data_dir, stringr::str_replace(download_dt$target_url, "https://movilidad-opendata.mitma.es/", "") ) - download_dt$local_path = stringr::str_replace_all(download_dt$local_path, "\\/\\/\\/|\\/\\/", "/") + download_dt$local_path <- stringr::str_replace_all(download_dt$local_path, "\\/\\/\\/|\\/\\/", "/") return(download_dt) } #' Get the data directory -#' +#' #' This function retrieves the data directory from the environment variable SPANISH_OD_DATA_DIR. #' If the environment variable is not set, it returns the temporary directory. #' @param quiet Logical. If `TRUE`, the function does not print messages to the console. Defaults to `FALSE`. #' @return The data directory. -#' @export +#' @export #' @keywords internal -spod_get_data_dir = function(quiet = FALSE) { - data_dir_env = Sys.getenv("SPANISH_OD_DATA_DIR") - if( data_dir_env == "" ) { +spod_get_data_dir <- function(quiet = FALSE) { + data_dir_env <- Sys.getenv("SPANISH_OD_DATA_DIR") + if (data_dir_env == "") { if (isFALSE(quiet)) warning("Warning: SPANISH_OD_DATA_DIR is not set. Using the temporary directory, which is not recommended, as the data will be deleted when the session ends.\n\n To set the data directory, use `Sys.setenv(SPANISH_OD_DATA_DIR = '/path/to/data')` or set SPANISH_OD_DATA_DIR permanently in the environment by editing the `.Renviron` file locally for current project with `usethis::edit_r_environ('project')` or `file.edit('.Renviron')` or globally for all projects with `usethis::edit_r_environ('user')` or `file.edit('~/.Renviron')`.") - data_dir_env = tempdir() # if not set, use the temp directory + data_dir_env <- tempdir() # if not set, use the temp directory } # check if dir exists and create it if it doesn't if (!fs::dir_exists(data_dir_env)) { @@ -107,16 +106,16 @@ spod_get_data_dir = function(quiet = FALSE) { #' @export #' @examples #' if (FALSE) { -#' zones = spod_get_zones() +#' zones <- spod_get_zones() #' } -spod_get_zones = function( - data_dir = spod_get_data_dir(), - type = "distritos") { - metadata = spod_get_metadata(data_dir) - regex = glue::glue("zonificacion_{type}\\.") - sel_distritos = stringr::str_detect(metadata$target_url, regex) - metadata_distritos = metadata[sel_distritos, ] - dir_name = dirname(metadata_distritos$local_path[1]) +spod_get_zones <- function( + data_dir = spod_get_data_dir(), + type = "distritos") { + metadata <- spod_get_metadata(data_dir) + regex <- glue::glue("zonificacion_{type}\\.") + sel_distritos <- stringr::str_detect(metadata$target_url, regex) + metadata_distritos <- metadata[sel_distritos, ] + dir_name <- dirname(metadata_distritos$local_path[1]) if (!fs::dir_exists(dir_name)) { fs::dir_create(dir_name, recurse = TRUE) } @@ -126,8 +125,8 @@ spod_get_zones = function( curl::curl_download(url = metadata_distritos$target_url[i], destfile = metadata_distritos$local_path[i], quiet = FALSE) } } - sel_shp = stringr::str_detect(metadata_distritos$local_path, "\\.shp$") - shp_file = metadata_distritos$local_path[sel_shp] + sel_shp <- stringr::str_detect(metadata_distritos$local_path, "\\.shp$") + shp_file <- metadata_distritos$local_path[sel_shp] suppressWarnings({ return(sf::read_sf(shp_file)) }) @@ -148,35 +147,33 @@ spod_get_zones = function( #' @examples #' # Download the origin-destination data for the first two days of March 2024 #' if (FALSE) { -#' od_20240301_20240302 = spod_get(date_regex = "2024-03-0[1-2]") +#' od_20240301_20240302 <- spod_get(date_regex = "2024-03-0[1-2]") #' } -spod_get = function( - data_dir = spod_get_data_dir(), - subdir = "estudios_basicos/por-distritos/viajes/ficheros-diarios", - date_regex = "2024030[1-2]", - read_fun = duckdb::tbl_file -) { - file_paths = download_od(data_dir = data_dir, subdir = subdir, date_regex = date_regex) +spod_get <- function( + data_dir = spod_get_data_dir(), + subdir = "estudios_basicos/por-distritos/viajes/ficheros-diarios", + date_regex = "2024030[1-2]", + read_fun = duckdb::tbl_file) { + file_paths <- download_od(data_dir = data_dir, subdir = subdir, date_regex = date_regex) if (identical(read_fun, readr::read_csv)) { return(purrr::map_dfr(file_paths, read_fun)) } - drv = duckdb::duckdb() - con = DBI::dbConnect(drv) + drv <- duckdb::duckdb() + con <- DBI::dbConnect(drv) # file.exists(file_paths[1]) # od1 = duckdb::tbl_file(con, file_paths[2]) - od_list = purrr::map(file_paths, ~duckdb::tbl_file(con, .)) + od_list <- purrr::map(file_paths, ~ duckdb::tbl_file(con, .)) } -download_od = function( - data_dir = spod_get_data_dir(), - subdir = "estudios_basicos/por-distritos/viajes/ficheros-diarios", - date_regex = "2024030[1-2]" -) { - regex = glue::glue("{subdir}*.+{date_regex}_Viajes_distritos.csv.gz") - metadata = spod_get_metadata(data_dir) - sel_od = stringr::str_detect(metadata$target_url, regex) - metadata_od = metadata[sel_od, ] +download_od <- function( + data_dir = spod_get_data_dir(), + subdir = "estudios_basicos/por-distritos/viajes/ficheros-diarios", + date_regex = "2024030[1-2]") { + regex <- glue::glue("{subdir}*.+{date_regex}_Viajes_distritos.csv.gz") + metadata <- spod_get_metadata(data_dir) + sel_od <- stringr::str_detect(metadata$target_url, regex) + metadata_od <- metadata[sel_od, ] metadata_od[[1]] - dir_name = dirname(metadata_od$local_path[1]) + dir_name <- dirname(metadata_od$local_path[1]) if (!fs::dir_exists(dir_name)) { fs::dir_create(dir_name) } diff --git a/R/get_v1_data.R b/R/get_v1_data.R index a31dc9a..da2afe7 100644 --- a/R/get_v1_data.R +++ b/R/get_v1_data.R @@ -53,14 +53,14 @@ spod_get_latest_v1_file_list <- function( #' names(metadata) #' head(metadata) #' } -spod_available_data_v1 <- function(data_dir = spod_get_data_dir(), - # check_local_files (below) is FALSE by default to avoid excessive filesystem access, perhaps should be TRUE. Download functions use it to load the xml file, but we probably do not want the script to check all local cache directories every time we run a get data function. Perhaps it is better to offload this check to a separate function and have a csv file or some other way to keep track of the files that were downloaded and cached. An output of curl::multi_download() could be used for this purpose. - check_local_files = FALSE, - quiet = FALSE -) { +spod_available_data_v1 <- function( + data_dir = spod_get_data_dir(), + # check_local_files (below) is FALSE by default to avoid excessive filesystem access, perhaps should be TRUE. Download functions use it to load the xml file, but we probably do not want the script to check all local cache directories every time we run a get data function. Perhaps it is better to offload this check to a separate function and have a csv file or some other way to keep track of the files that were downloaded and cached. An output of curl::multi_download() could be used for this purpose. + check_local_files = FALSE, + quiet = FALSE) { xml_files_list <- fs::dir_ls(data_dir, type = "file", regexp = "data_links_v1") |> sort() - if(length(xml_files_list) == 0) { - if(isFALSE(quiet)) message("No data links xml files found, getting latest data links xml") + if (length(xml_files_list) == 0) { + if (isFALSE(quiet)) message("No data links xml files found, getting latest data links xml") latest_data_links_xml_path <- spod_get_latest_v1_file_list(data_dir = data_dir) } else { latest_data_links_xml_path <- utils::tail(xml_files_list, 1) @@ -70,14 +70,14 @@ spod_available_data_v1 <- function(data_dir = spod_get_data_dir(), file_date <- stringr::str_extract(latest_data_links_xml_path, "[0-9]{4}-[0-9]{2}-[0-9]{2}") if (file_date < format(Sys.Date(), format = "%Y-%m-%d")) { - if(isFALSE(quiet)) message("File list xml is 1 day old or older, getting latest data links xml") + if (isFALSE(quiet)) message("File list xml is 1 day old or older, getting latest data links xml") latest_data_links_xml_path <- spod_get_latest_v1_file_list(data_dir = data_dir) } else { - if(isFALSE(quiet)) message("Using existing data links xml: ", latest_data_links_xml_path) + if (isFALSE(quiet)) message("Using existing data links xml: ", latest_data_links_xml_path) } if (length(latest_data_links_xml_path) == 0) { - if(isFALSE(quiet)) message("Getting latest data links xml") + if (isFALSE(quiet)) message("Getting latest data links xml") latest_data_links_xml_path <- spod_get_latest_v1_file_list(data_dir = data_dir) } @@ -109,10 +109,10 @@ spod_available_data_v1 <- function(data_dir = spod_get_data_dir(), # fix paths for files that are in '0000-referencia' folder files_table$local_path <- gsub("0000-referencia\\/([0-9]{4})([0-9]{2})([0-9]{2})_", "year=\\1\\/month=\\2\\/day=\\3\\/", files_table$local_path) - + # replace 2 digit month with 1 digit month files_table$local_path <- gsub("month=0([1-9])", "month=\\1", files_table$local_path) - + # replace 2 digit day with 1 digit day files_table$local_path <- gsub("day=0([1-9])", "day=\\1", files_table$local_path) @@ -137,17 +137,20 @@ spod_available_data_v1 <- function(data_dir = spod_get_data_dir(), #' zones <- spod_get_zones() #' } spod_get_zones_v1 <- function( - zones = c("districts", "dist", "distr", "distritos", - "municipalities", "muni", "municip", "municipios"), - data_dir = spod_get_data_dir(), - quiet = FALSE -) { + zones = c( + "districts", "dist", "distr", "distritos", + "municipalities", "muni", "municip", "municipios" + ), + data_dir = spod_get_data_dir(), + quiet = FALSE) { zones <- match.arg(zones) zones <- spod_zone_names_en2es(zones) # check if shp files are already extracted - expected_gpkg_path <- fs::path(data_dir, - glue::glue(spod_subfolder_clean_data_cache(), "/zones/{zones}_mitma.gpkg")) + expected_gpkg_path <- fs::path( + data_dir, + glue::glue(spod_subfolder_clean_data_cache(), "/zones/{zones}_mitma.gpkg") + ) if (fs::file_exists(expected_gpkg_path)) { if (isFALSE(quiet)) message("Loading .gpkg file that already exists in data dir: ", expected_gpkg_path) return(sf::read_sf(expected_gpkg_path)) @@ -191,13 +194,13 @@ spod_get_zones_v1 <- function( } #' Fixes common issues in the zones data and cleans up variable names -#' +#' #' This function fixes any invalid geometries in the zones data and renames the "ID" column to "id". -#' +#' #' @param zones_path The path to the zones spatial data file. #' @return A spatial object of class `sf`. #' @keywords internal -#' +#' spod_clean_zones_v1 <- function(zones_path) { suppressWarnings({ zones <- sf::read_sf(zones_path) @@ -213,13 +216,13 @@ spod_clean_zones_v1 <- function(zones_path) { #' Load the origin-destination v1 data (2020-2021) for specified dates -#' +#' #' This function retrieves the v1 (2020-2021) origin_destination_data for the specified dates. It checks if the requested data is already cached locally and downloads it if it is not. When all the requested data is cached, it creates a `DuckDB` connection to the cache data folder and provides an table -#' +#' #' @inheritParams spod_download_data #' @inheritParams spod_duckdb_limit_resources #' @return A DuckDB table connection object. It can be manupulated using `dplyr` verbs, or can be loaded into memory using `dplyr::collect()`. The structure of the object is as follows: -#' +#' #' \describe{ #' \item{full_date}{\code{Date}. The full date of the trip, including year, month, and day.} #' \item{id_origin}{\code{factor}. The identifier for the origin location of the trip, formatted as a code (e.g., '01001_AM').} @@ -235,14 +238,14 @@ spod_clean_zones_v1 <- function(zones_path) { #' \item{month}{\code{double}. The month of the trip.} #' \item{day}{\code{double}. The day of the trip.} #' } -#' +#' #' This object also contains the reference to the source DuckDB conneciton with the full view of the cached data. It can be accessed using `od_table$src$con`. See examples below. The connection includes two views: -#' -#' +#' +#' #' * `od_csv_raw` - a raw table view of all cached CSV files with the origin-destination data that has been previously cached in $SPANISH_OD_DATA_DIR -#' +#' #' * `od_csv_clean` - a cleaned-up table view of `od_csv_raw` with column names and values translated and mapped to English. This still includes all cached data. -#' +#' #' View `od_csv_clean` has the same structure as the filtered view 'od_filtered', which is returned by `spod_get_od_v1()` as a DuckDB table connection object. The view `od_csv_raw` has original Spanish column names and values and has the following structure: #' \describe{ #' \item{fecha}{\code{Date}. The date of the trip, including year, month, and day.} @@ -260,49 +263,50 @@ spod_clean_zones_v1 <- function(zones_path) { #' \item{month}{\code{double}. The month of the trip.} #' \item{year}{\code{double}. The year of the trip.} #' } -#' -#' @export +#' +#' @export #' @examples #' \dontrun{ -#' +#' #' # create a connection to the v1 data #' Sys.setenv(SPANISH_OD_DATA_DIR = "~/home/nosync/cache/mitma") #' dates <- c("2020-02-14", "2020-03-14", "2021-02-14", "2021-02-14", "2021-02-15") #' od_dist <- spod_get_od_v1(zones = "distr", dates = dates) -#' +#' #' # od dist is a table view filtered to the specified dates -#' +#' #' # access the source connection with all dates #' # list tables #' DBI::dbListTables(od_dist$src$con) #' } spod_get_od_v1 <- function( - zones = c("districts", "dist", "distr", "distritos", - "municipalities", "muni", "municip", "municipios"), - dates = NULL, - data_dir = spod_get_data_dir(), - quiet = FALSE, - duck_max_mem = 2, - duck_max_threads = parallelly::availableCores() -) { + zones = c( + "districts", "dist", "distr", "distritos", + "municipalities", "muni", "municip", "municipios" + ), + dates = NULL, + data_dir = spod_get_data_dir(), + quiet = FALSE, + duck_max_mem = 2, + duck_max_threads = parallelly::availableCores()) { # hardcode od as this is a wrapper to get origin-destiation data type <- "od" - + zones <- match.arg(zones) zones <- spod_zone_names_en2es(zones) - - + + if (is.character(dates)) { - if ( dates != "cached" ) { + if (dates != "cached") { dates <- spod_dates_argument_to_dates_seq(dates = dates) # use the spot_download_data() function to download any missing data - spod_download_data( - type = type, - zones = zones, - dates = dates, - data_dir = data_dir, - return_output = FALSE - ) + spod_download_data( + type = type, + zones = zones, + dates = dates, + data_dir = data_dir, + return_output = FALSE + ) } } @@ -316,7 +320,7 @@ spod_get_od_v1 <- function( duck_max_mem = duck_max_mem, duck_max_threads = duck_max_threads ) - + # attach the od folder of csv.gz files with predefined and cleaned up data types con <- spod_duckdb_od_v1( @@ -324,24 +328,24 @@ spod_get_od_v1 <- function( zones = zones, data_dir = data_dir ) - + # filter by date # actually, it seems like this works even if we do not return the 'con' from the function below, but I guess it is safer to return the 'con' and resave it to the 'con' of the environment/scope of this function if (is.character(dates)) { - if ( dates != "cached" ) { + if (dates != "cached") { con <- spod_duckdb_filter_by_dates(con, "od_csv_clean", "od_csv_clean_filtered", dates) } } - + # DBI::dbListTables(con) # for debugging only # dplyr::tbl(con, "od_csv_clean") |> dplyr::glimpse() # for debugging only # DBI::dbDisconnect(con) # for debugging only - + # speed comparison REMOVE a bit later AFTER TESTING # b1 <- bench::mark(iterations = 5, check = FALSE, # hive_date = {dplyr::tbl(con, "od_csv_clean") |> - # dplyr::distinct(full_date) |> + # dplyr::distinct(full_date) |> # dplyr::collect()}, # this is prefiltered using custom SQL query using only the columns (year, month, day) that we know are constructed from the hive style partitioning # full_date = {dplyr::tbl(con, "od_csv_clean") |> # dplyr::filter(full_date %in% dates) |> @@ -349,7 +353,7 @@ spod_get_od_v1 <- function( # dplyr::collect()} # this is causing DuckDB to scan ALL csv.gz files in the folder because it has to match the desired dates with full_date column # ) # bench:::plot.bench_mark(b1, type = "violin") + ggpubr::theme_pubclean(base_size = 24) - + # perhaps let's not confuse the user with the duckdb connection, see help for the @return of the spod_duckdb_od_v1() function # return(con) @@ -357,9 +361,9 @@ spod_get_od_v1 <- function( # this may have an implication that there is no way for the user to properly disconnect the db connection, should think how this can be addressed # not a problem! can be done with: # DBI::dbDisconnect(od$src$con) - + if (is.character(dates)) { - if ( dates != "cached" ) { + if (dates != "cached") { return(dplyr::tbl(con, "od_csv_clean_filtered")) } } else { diff --git a/R/internal_utils.R b/R/internal_utils.R index 27f9049..043a02c 100644 --- a/R/internal_utils.R +++ b/R/internal_utils.R @@ -1,66 +1,63 @@ #' Convert multiple formates of date arguments to a sequence of dates -#' +#' #' This function processes the date arguments provided to various functions in the package. It can handle single dates and arbitratry sequences (vectors) of dates in ISO (YYYY-MM-DD) and YYYYMMDD format. It can also handle date ranges in the format 'YYYY-MM-DD_YYYY-MM-DD' (or 'YYYYMMDD_YYYYMMDD'), date ranges in named vec and regular expressions to match dates in the format `YYYYMMDD`. -#' +#' #' @param dates A `character` or `Date` vector of dates to process. Kindly keep in mind that v1 and v2 data follow different data collection methodologies and may not be directly comparable. Therefore, do not try to request data from both versions for the same date range. If you need to compare data from both versions, please refer to the respective codebooks and methodology documents. The v1 data covers the period from 2020-02-14 to 2021-05-09, and the v2 data covers the period from 2022-01-01 to the present until further notice. The true dates range is checked against the available data for each version on every function run. -#' +#' #' The possible values can be any of the following: -#' +#' #' * A single date in ISO (YYYY-MM-DD) or YYYYMMDD format. `character` or `Date` object. -#' +#' #' * A vector of dates in ISO (YYYY-MM-DD) or YYYYMMDD format. `character` or `Date` object. Can be any non-consecutive sequence of dates. -#' +#' #' * A date range -#' +#' #' * eigher a `character` or `Date` object of length 2 with clearly named elements `start` and `end` in ISO (YYYY-MM-DD) or YYYYMMDD format. E.g. `c(start = "2020-02-15", end = "2020-02-17")`; -#' +#' #' * or a `character` object of the form `YYYY-MM-DD_YYYY-MM-DD` or `YYYYMMDD_YYYYMMDD`. For example, `2020-02-15_2020-02-17` or `20200215_20200217`. -#' +#' #' * A regular expression to match dates in the format `YYYYMMDD`. `character` object. For example, `^202002` will match all dates in February 2020. -#' -#' +#' +#' #' @return A character vector of dates in ISO format (YYYY-MM-DD). #' @keywords internal spod_dates_argument_to_dates_seq <- function(dates) { - if (is.null(dates) || (!is.character(dates) && !inherits(dates, "Date"))) { stop("Invalid date input format. Please provide a character vector or Date object.") } - + range_regex <- "^\\d{4}(-\\d{2}){2}_\\d{4}(-\\d{2}){2}$|^\\d{8}_\\d{8}$" single_date_regex <- "^(\\d{4}-\\d{2}-\\d{2}|\\d{8})$" # If dates is a vector of length one # Check if is single date, date range, or regex pattern - if (length(dates) == 1){ - + if (length(dates) == 1) { # Check if date range # match both YYYY-MM-DD_YYYY-MM-DD and YYYYMMDD_YYYYMMDD - if (grepl(range_regex, dates)){ + if (grepl(range_regex, dates)) { date_parts <- strsplit(dates, "_")[[1]] date_parts <- lubridate::ymd(date_parts) dates <- seq.Date(date_parts[1], date_parts[2], by = "day") # if dates does not match the date range pattern # check if it is just a single day in YYYY-MM-DD or YYYYMMDD format - } else if(grepl(single_date_regex, dates)) { + } else if (grepl(single_date_regex, dates)) { dates <- lubridate::ymd(dates) - + # assume it is a regex pattern } else { dates <- spod_expand_dates_from_regex(dates) # since spod_expand_dates_from_regex already uses the metadata to generate valid dates we can skip any checks that are required for other date formats and only check for datte overlap - if( isFALSE(spod_is_data_version_overlaps(dates)) ){ + if (isFALSE(spod_is_data_version_overlaps(dates))) { return(dates) } } # If dates if a vector of multiple values - } else if (length(dates) > 1){ - + } else if (length(dates) > 1) { # Check if it is of length 2, then it may be a date range if (length(dates) == 2 & !is.null(names(dates))) { # if the vector is named with 'start' and 'end', we can assume it is a date range - if(all(names(dates) %in% c("start", "end"))){ + if (all(names(dates) %in% c("start", "end"))) { date_parts <- lubridate::ymd(dates) dates <- seq.Date(date_parts[1], date_parts[2], by = "day") } @@ -72,7 +69,7 @@ spod_dates_argument_to_dates_seq <- function(dates) { # now that we have a clean sequence of dates, we can check for overlaps between data versions if (isFALSE(spod_is_data_version_overlaps(dates)) & - spod_infer_data_v_from_dates(dates) %in% c(1, 2) + spod_infer_data_v_from_dates(dates) %in% c(1, 2) ) { return(dates) } @@ -81,14 +78,13 @@ spod_dates_argument_to_dates_seq <- function(dates) { #' Check if specified dates span both data versions -#' +#' #' This function checks if the specified dates or date ranges span both v1 and v2 data versions. -#' +#' #' @param dates A Dates vector of dates to check. #' @return TRUE if the dates span both data versions, FALSE otherwise. #' @keywords internal -spod_is_data_version_overlaps <- function(dates){ - +spod_is_data_version_overlaps <- function(dates) { all_dates_v1 <- spod_get_valid_dates(ver = 1) all_dates_v2 <- spod_get_valid_dates(ver = 2) @@ -104,7 +100,7 @@ spod_infer_data_v_from_dates <- function(dates) { if (spod_is_data_version_overlaps(dates)) { invisible(return(NULL)) } - + # of no overlap, compare with date ranges v1_dates <- spod_get_valid_dates(ver = 1) v2_dates <- spod_get_valid_dates(ver = 2) @@ -121,15 +117,14 @@ spod_infer_data_v_from_dates <- function(dates) { } #' Function to expand dates from a regex -#' +#' #' This function generates a sequence of dates from a regular expression pattern. #' based on the provided regular expression. -#' +#' #' @param date_regex A regular expression to match dates in the format yyyymmdd. #' @return A character vector of dates matching the regex. #' @keywords internal spod_expand_dates_from_regex <- function(date_regex) { - all_dates_v1 <- spod_get_valid_dates(ver = 1) all_dates_v2 <- spod_get_valid_dates(ver = 2) @@ -139,8 +134,10 @@ spod_expand_dates_from_regex <- function(date_regex) { # if both vectors are empty, throw an error if (length(matching_dates_v1) == 0 && length(matching_dates_v2) == 0) { - stop(paste0("No matching dates found in the available data.", - "The valid dates range for v1 is: ", paste0(min(all_dates_v1), " to ", max(all_dates_v1)), " and for v2 is: ", paste0(min(all_dates_v2), " to ", max(all_dates_v2)))) + stop(paste0( + "No matching dates found in the available data.", + "The valid dates range for v1 is: ", paste0(min(all_dates_v1), " to ", max(all_dates_v1)), " and for v2 is: ", paste0(min(all_dates_v2), " to ", max(all_dates_v2)) + )) } # If checks above have passed, we can combine the matching dates as only one contains dates and the other is empty matching_dates <- sort(c(matching_dates_v1, matching_dates_v2)) @@ -156,17 +153,17 @@ spod_get_valid_dates <- function(ver = 1) { ver <- as.integer(ver) if (!ver %in% c(1, 2)) { stop("Invalid version number. Must be 1 or 2.") - } + } - if(ver == 1) { + if (ver == 1) { # available_data <- spod_available_data_v1(check_local_files = FALSE, quiet = TRUE) # all_dates <- unique(available_data[grepl("maestra1.*diarios", available_data$target_url),]$data_ymd, na.rm = TRUE) # perahps it is worth hardcoding at lest the v1 data range as it is unlikely to change at this point all_dates <- seq.Date(from = as.Date("2020-02-14"), to = as.Date("2021-05-09"), by = "day") } else if (ver == 2) { available_data <- spod_get_metadata(quiet = TRUE) # replace with spod_available_data_v2() when available - all_dates <- unique(available_data[grepl("viajes.*diarios", available_data$target_url),]$data_ymd, na.rm = TRUE) + all_dates <- unique(available_data[grepl("viajes.*diarios", available_data$target_url), ]$data_ymd, na.rm = TRUE) } return(all_dates) @@ -178,10 +175,11 @@ spod_get_valid_dates <- function(ver = 1) { spod_zone_names_en2es <- function( - zones = c("districts", "dist", "distr", "distritos", - "municipalities", "muni", "municip", "municipios", - "lau", "large_urban_areas", "gau", "grandes_areas_urbanas") -) { + zones = c( + "districts", "dist", "distr", "distritos", + "municipalities", "muni", "municip", "municipios", + "lau", "large_urban_areas", "gau", "grandes_areas_urbanas" + )) { zones <- tolower(zones) zones <- match.arg(zones) if (zones %in% c("districts", "dist", "distr", "distritos")) { @@ -198,12 +196,12 @@ spod_zone_names_en2es <- function( #' @param ver The version of the data to use. Defaults to 1. Can be 1 or 2. #' @keywords internal spod_match_data_type <- function( - type = c( - "od", "origin-destination", - "os", "overnight_stays", - "tpp", "trips_per_person"), - ver = c(1, 2) -){ + type = c( + "od", "origin-destination", + "os", "overnight_stays", + "tpp", "trips_per_person" + ), + ver = c(1, 2)) { if (!ver %in% c(1, 2)) { stop("Invalid version number. Must be 1 or 2.") } @@ -211,20 +209,20 @@ spod_match_data_type <- function( type <- tolower(type) type <- match.arg(type) - if(ver == 1) { + if (ver == 1) { if (type %in% c("od", "origin-destination")) { return("maestra1") - } else if(type %in% c("tpp", "trips_per_person")) { + } else if (type %in% c("tpp", "trips_per_person")) { return("maestra2") } } - if(ver == 2) { + if (ver == 2) { if (type %in% c("od", "origin-destination")) { return("viajes") - } else if(type %in% c("os", "overnight_stays")) { + } else if (type %in% c("os", "overnight_stays")) { return("pernoctaciones") - } else if(type %in% c("tpp", "trips_per_person")) { + } else if (type %in% c("tpp", "trips_per_person")) { return("personas") } } diff --git a/README.qmd b/README.qmd index f90f42d..3f1effd 100644 --- a/README.qmd +++ b/README.qmd @@ -349,6 +349,8 @@ usethis::use_pkgdown() usethis::use_github_action("pkgdown") # Setup gh pages: usethis::use_github_pages() +# Auto-style with styler +styler::style_pkg() ``` ```{r} diff --git a/tests/testthat/test-internal_utils.R b/tests/testthat/test-internal_utils.R index dd6ef6a..e453ea4 100644 --- a/tests/testthat/test-internal_utils.R +++ b/tests/testthat/test-internal_utils.R @@ -86,14 +86,18 @@ test_that("invalid input type", { test_that("dates span both v1 and v2 data", { dates <- c("2021-05-09", "2022-01-01") - expect_error(spod_dates_argument_to_dates_seq(dates), - "Dates found in both v1 and v2 data.") + expect_error( + spod_dates_argument_to_dates_seq(dates), + "Dates found in both v1 and v2 data." + ) }) test_that("dates that are out of availabe range of v1 data", { dates <- c("2020-01-01", "2021-01-01") - expect_error(spod_dates_argument_to_dates_seq(dates), - "Some dates do not match the available data.") + expect_error( + spod_dates_argument_to_dates_seq(dates), + "Some dates do not match the available data." + ) }) # clean up diff --git a/vignettes/work-with-v1-data.qmd b/vignettes/work-with-v1-data.qmd index 94b3e89..230a8b3 100644 --- a/vignettes/work-with-v1-data.qmd +++ b/vignettes/work-with-v1-data.qmd @@ -82,9 +82,11 @@ Load the data for the period from 2020-02-14 to 2020-02-17. The data will be cached in the directory set in the SPANISH_OD_DATA_DIR environment variable. If it is already downloaded, it will not be downloaded again. ```{r} -od_dist_1 <- spod_get_od_v1(zones = "dist", +od_dist_1 <- spod_get_od_v1( + zones = "dist", dates = c(start = "2020-02-14", end = "2020-02-17"), - quiet = TRUE) + quiet = TRUE +) ``` @@ -101,11 +103,15 @@ For example this code below will not execute the query, but will only create ano ```{r} od_dist_1_lazy <- od_dist_1 |> group_by(id_origin, id_destination, full_date) |> - summarise(total_day_trips = sum(n_trips, na.rm = TRUE), - .groups = "drop") |> + summarise( + total_day_trips = sum(n_trips, na.rm = TRUE), + .groups = "drop" + ) |> group_by(id_origin, id_destination) |> - summarise(mean_dayly_trips = mean(total_day_trips, na.rm = TRUE), - .groups = "drop") + summarise( + mean_dayly_trips = mean(total_day_trips, na.rm = TRUE), + .groups = "drop" + ) ``` In fact this is a "lazy" object with an SQL query attached to it. You can see the query with the `show_query()` function. @@ -125,12 +131,16 @@ If you want to load the results into memory, you can use the `collect()` functio #| eval=FALSE od_dist_1_data <- od_dist_1 |> group_by(id_origin, id_destination, full_date) |> - summarise(total_day_trips = sum(n_trips, na.rm = TRUE), - .groups = "drop") |> + summarise( + total_day_trips = sum(n_trips, na.rm = TRUE), + .groups = "drop" + ) |> group_by(id_origin, id_destination) |> - summarise(mean_dayly_trips = mean(total_day_trips, na.rm = TRUE), - .groups = "drop") |> - collect() + summarise( + mean_dayly_trips = mean(total_day_trips, na.rm = TRUE), + .groups = "drop" + ) |> + collect() ``` Or you can just add collect() to the "lazy" object that you created before, like so: @@ -155,9 +165,11 @@ DBI::dbDisconnect(od_dist_1$src$con) This time let's get the data for 2020-02-14, 2020-02-17, 2021-05-07 and 2021-05-09. We will use municipalities as zones. ```{r} -od_muni_1 <- spod_get_od_v1(zones = "muni", +od_muni_1 <- spod_get_od_v1( + zones = "muni", dates = c("2020-02-14", "2020-02-17", "2021-05-07", "2021-05-09"), - quiet = TRUE) + quiet = TRUE +) ``` From 6e6f21a5c0557f2fbd067bf5495b5dc831f765cd Mon Sep 17 00:00:00 2001 From: robinlovelace Date: Mon, 12 Aug 2024 11:16:13 +0100 Subject: [PATCH 17/21] Deduplicate library calls --- vignettes/work-with-v1-data.qmd | 3 --- 1 file changed, 3 deletions(-) diff --git a/vignettes/work-with-v1-data.qmd b/vignettes/work-with-v1-data.qmd index 230a8b3..b82c2a8 100644 --- a/vignettes/work-with-v1-data.qmd +++ b/vignettes/work-with-v1-data.qmd @@ -25,9 +25,6 @@ packages <- c("sf", "dplyr", "DBI") pak::pkg_install(packages, ask = FALSE, upgrade = FALSE) pak::pkg_install("Robinlovelace/spanishoddata@1a53ed9f834f720f47cb016769464acfdad599a8", ask = FALSE, upgrade = TRUE) - -suppressPackageStartupMessages(invisible(lapply(packages, library, character.only = TRUE))) -library(spanishoddata) ``` ```{r setup} From 6be0f161fdd5d708acf2f640afdc9512e6a8cb7c Mon Sep 17 00:00:00 2001 From: robinlovelace Date: Mon, 12 Aug 2024 11:28:59 +0100 Subject: [PATCH 18/21] Debugging spod_get_zones_v1 --- R/get_v1_data.R | 11 +++++++---- vignettes/work-with-v1-data.qmd | 1 + 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/R/get_v1_data.R b/R/get_v1_data.R index da2afe7..f1062a1 100644 --- a/R/get_v1_data.R +++ b/R/get_v1_data.R @@ -142,7 +142,9 @@ spod_get_zones_v1 <- function( "municipalities", "muni", "municip", "municipios" ), data_dir = spod_get_data_dir(), - quiet = FALSE) { + quiet = FALSE + ) { + browser() zones <- match.arg(zones) zones <- spod_zone_names_en2es(zones) @@ -152,7 +154,9 @@ spod_get_zones_v1 <- function( glue::glue(spod_subfolder_clean_data_cache(), "/zones/{zones}_mitma.gpkg") ) if (fs::file_exists(expected_gpkg_path)) { - if (isFALSE(quiet)) message("Loading .gpkg file that already exists in data dir: ", expected_gpkg_path) + if (isFALSE(quiet)) { + message("Loading .gpkg file that already exists in data dir: ", expected_gpkg_path) + } return(sf::read_sf(expected_gpkg_path)) } @@ -184,8 +188,7 @@ spod_get_zones_v1 <- function( junk_path <- paste0(fs::path_dir(downloaded_file), "/__MACOSX") if (fs::dir_exists(junk_path)) fs::dir_delete(junk_path) - zones_path <- fs::dir_ls(data_dir, glob = glue::glue("**{zones}/*.shp"), recurse = TRUE) - + zones_path <- fs::dir_ls(data_dir, glob = glue::glue("*v1**{zones}/*.shp"), recurse = TRUE) zones <- spod_clean_zones_v1(zones_path) fs::dir_create(fs::path_dir(expected_gpkg_path), recurse = TRUE) sf::st_write(zones, expected_gpkg_path, delete_dsn = TRUE, delete_layer = TRUE) diff --git a/vignettes/work-with-v1-data.qmd b/vignettes/work-with-v1-data.qmd index b82c2a8..c5785d3 100644 --- a/vignettes/work-with-v1-data.qmd +++ b/vignettes/work-with-v1-data.qmd @@ -25,6 +25,7 @@ packages <- c("sf", "dplyr", "DBI") pak::pkg_install(packages, ask = FALSE, upgrade = FALSE) pak::pkg_install("Robinlovelace/spanishoddata@1a53ed9f834f720f47cb016769464acfdad599a8", ask = FALSE, upgrade = TRUE) +devtools::load_all() ``` ```{r setup} From 2358a88f4d2fde6c49f0f61e39be1eaca3f80e1a Mon Sep 17 00:00:00 2001 From: robinlovelace Date: Mon, 12 Aug 2024 11:29:18 +0100 Subject: [PATCH 19/21] Remove browser() call --- R/get_v1_data.R | 1 - 1 file changed, 1 deletion(-) diff --git a/R/get_v1_data.R b/R/get_v1_data.R index f1062a1..d67a30f 100644 --- a/R/get_v1_data.R +++ b/R/get_v1_data.R @@ -144,7 +144,6 @@ spod_get_zones_v1 <- function( data_dir = spod_get_data_dir(), quiet = FALSE ) { - browser() zones <- match.arg(zones) zones <- spod_zone_names_en2es(zones) From 8a91baedea83a6cdba86e323d41984975336968a Mon Sep 17 00:00:00 2001 From: robinlovelace Date: Mon, 12 Aug 2024 11:34:22 +0100 Subject: [PATCH 20/21] Debugging cached dates --- R/get_v1_data.R | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/R/get_v1_data.R b/R/get_v1_data.R index d67a30f..8be5a48 100644 --- a/R/get_v1_data.R +++ b/R/get_v1_data.R @@ -290,7 +290,8 @@ spod_get_od_v1 <- function( data_dir = spod_get_data_dir(), quiet = FALSE, duck_max_mem = 2, - duck_max_threads = parallelly::availableCores()) { + duck_max_threads = parallelly::availableCores()) + { # hardcode od as this is a wrapper to get origin-destiation data type <- "od" @@ -299,7 +300,7 @@ spod_get_od_v1 <- function( if (is.character(dates)) { - if (dates != "cached") { + if (all(dates != "cached")) { dates <- spod_dates_argument_to_dates_seq(dates = dates) # use the spot_download_data() function to download any missing data spod_download_data( @@ -334,7 +335,7 @@ spod_get_od_v1 <- function( # filter by date # actually, it seems like this works even if we do not return the 'con' from the function below, but I guess it is safer to return the 'con' and resave it to the 'con' of the environment/scope of this function if (is.character(dates)) { - if (dates != "cached") { + if (all(dates != "cached")) { con <- spod_duckdb_filter_by_dates(con, "od_csv_clean", "od_csv_clean_filtered", dates) } } @@ -365,7 +366,7 @@ spod_get_od_v1 <- function( # DBI::dbDisconnect(od$src$con) if (is.character(dates)) { - if (dates != "cached") { + if (all(dates != "cached")) { return(dplyr::tbl(con, "od_csv_clean_filtered")) } } else { From 82d60019ef9e697ef1e9d8ba0d554b3ca6620fb1 Mon Sep 17 00:00:00 2001 From: robinlovelace Date: Mon, 12 Aug 2024 11:48:40 +0100 Subject: [PATCH 21/21] Tweaks to vignette --- vignettes/work-with-v1-data.qmd | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/vignettes/work-with-v1-data.qmd b/vignettes/work-with-v1-data.qmd index c5785d3..50c1a23 100644 --- a/vignettes/work-with-v1-data.qmd +++ b/vignettes/work-with-v1-data.qmd @@ -38,7 +38,7 @@ library(spanishoddata) # Introduction -v1 MITMA data covers the period from 2020-02-14 to 2021-05-09. Add references... +v1 data, from the Ministerio de Transportes, Movilidad y Agenda Urbana ([MITMA](https://sede.mitma.gob.es/sede_electronica/lang_castellano/)) covers the period from 2020-02-14 to 2021-05-09. # Set a directory to store the data @@ -91,12 +91,13 @@ od_dist_1 <- spod_get_od_v1( Look at the data structure. This is a lazy table with DuckDB backend. That is, the files on disk are still raw gzipped CSV files, but they are cleverly connected to a dynamic view in in-memory DuckDB database. ```{r} -od_dist_1 |> glimpse() +od_dist_1 |> + glimpse() ``` You can work with it using dplyr verbs as if it were a regular data frame, but if you want to load the results into memory, you can use the `collect()` function. -For example this code below will not execute the query, but will only create another "lazy" object. +For example, this code below will not execute the query, but will only create another "lazy" object, and executes instantly. ```{r} od_dist_1_lazy <- od_dist_1 |> @@ -115,15 +116,19 @@ od_dist_1_lazy <- od_dist_1 |> In fact this is a "lazy" object with an SQL query attached to it. You can see the query with the `show_query()` function. ```{r} -od_dist_1_lazy |> show_query() +od_dist_1_lazy |> + show_query() ``` +No data has been loaded to memory yet: + ```{r} format(object.size(od_dist_1_lazy), units = "Mb") class(od_dist_1_lazy) ``` -If you want to load the results into memory, you can use the `collect()` function. It can be added either at the end of the original pipeline, like so: +Use the `collect()` function to import the object into memory (your global environment). +It can be added either at the end of the original pipeline, like so: ```{r} #| eval=FALSE @@ -141,18 +146,21 @@ od_dist_1_data <- od_dist_1 |> collect() ``` -Or you can just add collect() to the "lazy" object that you created before, like so: +Or you can just add `collect()` to the "lazy" object that you created before, like so: ```{r} -od_dist_1_data <- od_dist_1_lazy |> collect() +od_dist_1_data <- od_dist_1_lazy |> + collect() ``` +Now the data is in memory and is consuming computational resources (around 10 MB in this case because we've aggregated the data, removing the hour-by-hour detail): + ```{r} format(object.size(od_dist_1_data), units = "Mb") class(od_dist_1_data) ``` -To safely disconnect the in-memory database, you can use the `DBI::dbDisconnect()` function. +To disconnect the in-memory database, you can use the `DBI::dbDisconnect()` function. ```{r} DBI::dbDisconnect(od_dist_1$src$con) @@ -174,7 +182,8 @@ od_muni_1 <- spod_get_od_v1( Look at the data structure. ```{r} -od_muni_1 |> glimpse() +od_muni_1 |> + glimpse() ``` ```{r}