From 40405a7335a5887b967b00a24abf6a033ef15bb9 Mon Sep 17 00:00:00 2001
From: Eric Langowski <33432469+erhla@users.noreply.github.com>
Date: Thu, 18 Jan 2024 14:39:11 -0600
Subject: [PATCH 01/21] 2022 Data Update (#23)
* 2022 has different column name for levy_plus_loss "levy+loss"
* update agency
make sheet explicit, update across syntax, add 2022 column names
* Update cpihistory.pdf
* Switching to pdftools
Pretty sure this is the same but didn't want to use noncran tabulizer
* from press release
* remove tabulizer
* add 2022
* add excel conversions
* update 2006 to 2012 to excel versions
* add 2022 tax code
* sample 2022 bills
* update with pdftools
* lint /style
---
data-raw/agency/Agency Rate Report 2022.xlsx | 3 +
data-raw/agency/agency.R | 20 +-
data-raw/agency/tif_agency_names.csv | 4 +-
data-raw/cpi/cpi.R | 26 ++-
data-raw/cpi/cpihistory.pdf | Bin 130 -> 130 bytes
data-raw/eq_factor/eq_factor.csv | 4 +-
.../2022_200_04261010740000.pdf | Bin 0 -> 130 bytes
.../2022_202_28244220220000.pdf | Bin 0 -> 130 bytes
.../2022_203_19063120380000.pdf | Bin 0 -> 130 bytes
.../2022_204_02171060120000.pdf | Bin 0 -> 130 bytes
.../2022_205_10252080490000.pdf | Bin 0 -> 130 bytes
.../2022_211_14333001380000.pdf | Bin 0 -> 130 bytes
.../2022_299_14052110241207.pdf | Bin 0 -> 130 bytes
.../2022_299_23222000451009.pdf | Bin 0 -> 130 bytes
.../2022_593_08261020260000.pdf | Bin 0 -> 130 bytes
.../sample_tax_bills_detail.R | 50 +++--
.../sample_tax_bills_detail.csv | 4 +-
.../tax_code/2022 Tax Code Agency Rate.xlsx | 3 +
data-raw/tax_code/tax_code.R | 9 +
.../2022 TIF Agency Distribution Report.xlsx | 3 +
data-raw/tif/main/2006 Cook TIF Summary.xlsx | 3 +
data-raw/tif/main/2007 Cook TIF Summary.xlsx | 3 +
data-raw/tif/main/2008 Cook TIF Summary.xlsx | 3 +
data-raw/tif/main/2009 Cook TIF Summary.xlsx | 3 +
data-raw/tif/main/2010 Cook TIF Summary.xlsx | 3 +
data-raw/tif/main/2011 Cook TIF Summary.xlsx | 3 +
data-raw/tif/main/2012 Cook TIF Summary.xlsx | 3 +
.../main/2022 Cook County TIF Summary.xlsx | 3 +
data-raw/tif/tif.R | 197 ++++++++----------
29 files changed, 202 insertions(+), 145 deletions(-)
create mode 100644 data-raw/agency/Agency Rate Report 2022.xlsx
create mode 100644 data-raw/sample_tax_bills/2022_200_04261010740000.pdf
create mode 100644 data-raw/sample_tax_bills/2022_202_28244220220000.pdf
create mode 100644 data-raw/sample_tax_bills/2022_203_19063120380000.pdf
create mode 100644 data-raw/sample_tax_bills/2022_204_02171060120000.pdf
create mode 100644 data-raw/sample_tax_bills/2022_205_10252080490000.pdf
create mode 100644 data-raw/sample_tax_bills/2022_211_14333001380000.pdf
create mode 100644 data-raw/sample_tax_bills/2022_299_14052110241207.pdf
create mode 100644 data-raw/sample_tax_bills/2022_299_23222000451009.pdf
create mode 100644 data-raw/sample_tax_bills/2022_593_08261020260000.pdf
create mode 100644 data-raw/tax_code/2022 Tax Code Agency Rate.xlsx
create mode 100644 data-raw/tif/distribution/2022 TIF Agency Distribution Report.xlsx
create mode 100644 data-raw/tif/main/2006 Cook TIF Summary.xlsx
create mode 100644 data-raw/tif/main/2007 Cook TIF Summary.xlsx
create mode 100644 data-raw/tif/main/2008 Cook TIF Summary.xlsx
create mode 100644 data-raw/tif/main/2009 Cook TIF Summary.xlsx
create mode 100644 data-raw/tif/main/2010 Cook TIF Summary.xlsx
create mode 100644 data-raw/tif/main/2011 Cook TIF Summary.xlsx
create mode 100644 data-raw/tif/main/2012 Cook TIF Summary.xlsx
create mode 100644 data-raw/tif/main/2022 Cook County TIF Summary.xlsx
diff --git a/data-raw/agency/Agency Rate Report 2022.xlsx b/data-raw/agency/Agency Rate Report 2022.xlsx
new file mode 100644
index 0000000..1b7a766
--- /dev/null
+++ b/data-raw/agency/Agency Rate Report 2022.xlsx
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b5eacae6ce69cf64f7903ffbe248a198422c1905614d0e14fa20467a867fe6a3
+size 882953
diff --git a/data-raw/agency/agency.R b/data-raw/agency/agency.R
index 0a00dc6..1033450 100644
--- a/data-raw/agency/agency.R
+++ b/data-raw/agency/agency.R
@@ -43,9 +43,6 @@ file_names <- list.files(
)
-
-
-
# agency_fund ------------------------------------------------------------------
# Load the detail sheet from each agency file. This includes the levy and rate
@@ -64,7 +61,7 @@ agency_fund <- map_dfr(file_names, function(file) {
"loss", "loss_percent", "fund_loss"
))) %>%
rename_with(~"levy_plus_loss", any_of(c(
- "levy_and_loss", "fund_levy_plus_loss"
+ "levy_and_loss", "fund_levy_plus_loss", "levy_loss"
))) %>%
rename_with(~"rate_ceiling", any_of(c(
"ceiling", "rate_ceiling", "fund_rate_ceiling"
@@ -189,7 +186,7 @@ arrow::write_parquet(
# EAV, final extension, and much more
agency <- map_dfr(file_names, function(file) {
message("Reading: ", file)
- readxl::read_xlsx(file) %>%
+ readxl::read_xlsx(file, sheet = 1) %>%
set_names(snakecase::to_snake_case(names(.))) %>%
mutate(
across(
@@ -235,9 +232,12 @@ agency <- map_dfr(file_names, function(file) {
"reduction_percent", "reduction_factor", "clerk_reduction_factor"
))) %>%
rename_with(~"total_non_cap_ext", any_of(c(
- "total_non_cap_ext", "final_non_cap_ext"
+ "total_non_cap_ext", "final_non_cap_ext", "total_non_cap_extension"
+ ))) %>%
+ rename_with(~"total_ext", any_of(c(
+ "total_ext", "final_ext",
+ "grand_total_ext"
))) %>%
- rename_with(~"total_ext", any_of(c("total_ext", "final_ext"))) %>%
# Select, order, and rename columns
select(
year,
@@ -296,20 +296,20 @@ agency <- map_dfr(file_names, function(file) {
arrange(year, agency_num) %>%
# Coerce columns to expected types
mutate(
- across(c(year), as.character),
+ across(c(year), ~ as.character(.x)),
across(
c(
lim_numerator, lim_denominator, prior_eav:cty_total_eav,
total_levy, total_max_levy, total_reduced_levy, total_final_levy
),
- as.integer64
+ ~ as.integer64(.x)
),
across(
c(
lim_rate, pct_burden, total_prelim_rate, total_final_rate,
reduction_pct, total_non_cap_ext, total_ext
),
- as.double
+ ~ as.double(.x)
)
)
diff --git a/data-raw/agency/tif_agency_names.csv b/data-raw/agency/tif_agency_names.csv
index 8a8edae..74f6c15 100644
--- a/data-raw/agency/tif_agency_names.csv
+++ b/data-raw/agency/tif_agency_names.csv
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:fcbcf43f2a66232e2f309f75339ed5057da12c33d27692d270b37df776d9f46d
-size 26934
+oid sha256:6ca59da53a3bdc008f0b514829aa6717f9fa1d99d421509a6754078d8b329f61
+size 27439
diff --git a/data-raw/cpi/cpi.R b/data-raw/cpi/cpi.R
index 29246c0..7976ea8 100644
--- a/data-raw/cpi/cpi.R
+++ b/data-raw/cpi/cpi.R
@@ -1,7 +1,7 @@
library(arrow)
library(dplyr)
library(miniUI)
-library(tabulizer)
+library(pdftools)
library(tidyr)
library(stringr)
@@ -14,27 +14,33 @@ row_to_names <- function(df) {
# The goal of this script is to create a data frame of Consumer Price Indices
# CPI-U used by PTELL to calculate/cap property tax extensions
# We can load the historical CPIs from a PDF provided by the State of Illinois
+# https://tax.illinois.gov/content/dam/soi/en/web/tax/localgovernments/property/documents/cpihistory.pdf
# Paths for local raw data storage and remote storage on S3
remote_bucket <- Sys.getenv("S3_REMOTE_BUCKET")
remote_path <- file.path(remote_bucket, "cpi", "part-0.parquet")
-# Extract the table only (no headers), then manually assign header
-cpi_ext <- extract_areas(file = "data-raw/cpi/cpihistory.pdf")[[1]]
-cpi <- as_tibble(cpi_ext[, c(1, 2, 4, 5, 6)])
-cpi <- setNames(cpi, c("year", "cpi", "ptell_cook", "comments", "levy_year"))
+cpi <- pdftools::pdf_text(pdf = "data-raw/cpi/cpihistory.pdf") %>%
+ str_extract(., regex("1991.*", dotall = TRUE)) %>%
+ str_remove_all(., "\\(5 % for Cook\\)") %>%
+ str_split(., "\n") %>%
+ unlist() %>%
+ tibble(vals = `.`) %>%
+ mutate(vals = str_squish(vals)) %>%
+ separate_wider_delim(
+ col = vals,
+ names = c("year", "cpi", "pct", "ptell_cook", "levy_year", "year_paid"),
+ delim = " ", too_few = "align_start", too_many = "drop"
+ )
-# Merge Cook rate into main column
cpi <- cpi %>%
mutate(
across(c(year, levy_year), as.character),
across(c(cpi), as.numeric),
- across(c(ptell_cook, comments), readr::parse_number),
- ptell_cook = ifelse(!is.na(comments), comments, ptell_cook),
+ across(c(ptell_cook), readr::parse_number),
ptell_cook = ptell_cook / 100
) %>%
- select(-comments) %>%
- filter(year != "1991") %>%
+ filter(year != "1991", year != "", year != "CPI") %>%
arrange(year)
# Write to S3
diff --git a/data-raw/cpi/cpihistory.pdf b/data-raw/cpi/cpihistory.pdf
index 3eed185beedda5b84f53656a22235c39920e9adf..e6fedfd1fb28335a0ff457152f957ac5905a5367 100644
GIT binary patch
delta 83
zcmV~$u@QhU2nEoy%@mFxkS}Bhmq-ZQS=(7=0!Q|}wXN+tFNf5o=p57LkdZi?FsxZ1
d(o|DeSvZn{01}&2nF00g=~ABijlDq?
^}zO8^OX)^?Um;K=&=x6@89pBOz@zz2n_j^u0hLW7OD
fBDx9a3?m|MWpD{Y(0^FdT4fpK`+DL~sHXV?)z}tK
diff --git a/data-raw/eq_factor/eq_factor.csv b/data-raw/eq_factor/eq_factor.csv
index d810123..21e3600 100644
--- a/data-raw/eq_factor/eq_factor.csv
+++ b/data-raw/eq_factor/eq_factor.csv
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:b3013b8ac0e6ddae2eeb73a446c5d323904507e4f2b0562aa6acf4e034aeb82b
-size 832
+oid sha256:2a27cbc30f2e5281f69006fda8c56bac0d6d7cebd577100e9452c77e379816b1
+size 850
diff --git a/data-raw/sample_tax_bills/2022_200_04261010740000.pdf b/data-raw/sample_tax_bills/2022_200_04261010740000.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..336ca65ba6330f3f5b3e5ebac1119ba6bbcbbff2
GIT binary patch
literal 130
zcmWN?OA^8$3;@tQr{Dq>NJ)g=hEEV?R63^Z!qe;9yo*0F=3DpU*kv>3F^=1_$@0IS
zc`5T{WanZor{<_ydIF>^RqtI07=T@_IU>=TeN5nLBHMuP6gjpMaw}M{<=A`xVsy-j
N0hNp|Ygnx%^#k;jCLin|}0g?(cDjie1@bvmN@8Y+N`O^J757~^lkMs7}W%=Jf
zb!qcy2#~l5d(U046o6G-p
z@>0gj%w3APoEp9A*|JAk#bS(}At#CnD+^9yX%D1%d=ys|~`g0tiuwV3`nHh>VCK
MtJ%Mzy-#;kKh#tv+5i9m
literal 0
HcmV?d00001
diff --git a/data-raw/sample_tax_bills/2022_204_02171060120000.pdf b/data-raw/sample_tax_bills/2022_204_02171060120000.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..8eccf17e6a62520c2bc379f3533fce2be886b37f
GIT binary patch
literal 130
zcmWN?OA^8$3;@u5Pr(H&B*?F~36KgiDjh?+@bvmN@8Xa2@m6ilLpH4+ecqnCtpD4Y
z*D_vO4leqFW%R0~5jwx!ImhB51Z#6d2Smk2cE;Ci0#ZsGGB7fc^8|Z^5MALUjjPyhe`
literal 0
HcmV?d00001
diff --git a/data-raw/sample_tax_bills/2022_205_10252080490000.pdf b/data-raw/sample_tax_bills/2022_205_10252080490000.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..f16c5ffdc01412c8b79d0759ba8e73b3346c9a20
GIT binary patch
literal 130
zcmWN?OA^8$3;@u5Pr(H&A%QUTHhhH{m5#wKJiWfnyXsrUe5tQ4W&i*H
literal 0
HcmV?d00001
diff --git a/data-raw/sample_tax_bills/2022_211_14333001380000.pdf b/data-raw/sample_tax_bills/2022_211_14333001380000.pdf
new file mode 100644
index 0000000000000000000000000000000000000000..6aedebc30ecbd6ce7496def3fc9d3a74795407db
GIT binary patch
literal 130
zcmWm3K@P$o5J1sAr{Dq>n8EjsBHwh@buQzPu@TIJ^KEVZO&tCO5OXsJ?dDl
zwohJYf2wgXsndwP7dcu2hZ_M|49M26CMF0LI8}E^SuGpyG5i;5aLhn8$5A8*x;W1pMWkAB>qb*}&0
z$*YW)o_i5}!7_SQvn3?A5gA~}g@e0;1tyUUCOYGhF{g^5Ml$SE^1)TM;L)-nAu(P`
Nlx6mBQHa6D0R{YK0dO|dGM;#v(Lw?@^ahG
zyzJwx_@G@~MvPu0w+)!5CFhCuiyiQ%rI>E&9DhoDk;Gne7*LiukxOKykuMJoQG2PzHW~?xBu-E
zw=|w=o+YUZ#OPVh#%SzeVn)BSp<-gd%vEO!nkzsh0t}vPa$YCm5)*sO770U!Jp==;
NIx+jVNYvo1_yOcUCk+4q
literal 0
HcmV?d00001
diff --git a/data-raw/sample_tax_bills/sample_tax_bills_detail.R b/data-raw/sample_tax_bills/sample_tax_bills_detail.R
index e4d9d53..f026d9d 100644
--- a/data-raw/sample_tax_bills/sample_tax_bills_detail.R
+++ b/data-raw/sample_tax_bills/sample_tax_bills_detail.R
@@ -1,6 +1,6 @@
library(dplyr)
library(tidyr)
-library(tabulizer)
+library(pdftools)
library(miniUI)
library(stringr)
library(purrr)
@@ -25,19 +25,43 @@ row_to_names <- function(df) {
# Different tax bills can have different table sizes depending on the number of
-# taxing district. As such, the table bottom boundary will be different for each
-# bill. Here we manually specify the area of table using an interactive widget
+# taxing district.
extract_tax_bill <- function(file) {
base_file <- basename(file)
-
- # Scan table into memory
- tbl <- tabulizer::extract_areas(file = file, pages = 1)[[1]] %>%
- as_tibble() %>%
- row_to_names() %>%
- set_names(
- c("agency_name", "final_tax", "rate", "percent", "pension", "prev_tax")
+ tbl <- pdf_text(file)[[1]] %>%
+ str_extract(., regex("MISCELLANEOUS TAXES.*", dotall = TRUE)) %>%
+ str_split(., "\n") %>%
+ unlist() %>%
+ tibble(vals = `.`) %>%
+ mutate(vals = str_replace_all(vals, "[:space:]{2,}", "\t")) %>%
+ separate_wider_delim(
+ col = vals,
+ names = c(
+ "agency_name", "final_tax", "rate", "percent",
+ "pension", "prev_tax"
+ ),
+ delim = "\t", too_few = "align_start", too_many = "drop"
+ ) %>%
+ mutate(
+ agency_name = str_squish(agency_name),
+ flag = is.na(prev_tax),
+ prev_tax = if_else(flag,
+ pension,
+ prev_tax
+ ),
+ pension = if_else(flag,
+ NA,
+ pension
+ )
+ ) %>%
+ select(-flag) %>%
+ filter(
+ agency_name != "",
+ !str_detect(
+ agency_name,
+ "TAXES|Assess|Property|EAV|Local Tax|Total Tax|Do not|Equalizer|cookcountyclerk.com"
+ )
)
-
# Create a list with metadata for output
out <- list(
year = str_sub(base_file, 1, 4),
@@ -91,8 +115,8 @@ bills_df <- bills_df %>%
# Round numeric values to nearest hundredth
bills_df <- bills_df %>%
mutate(
- across(c(final_tax, percent, pension, prev_tax), round, 2),
- across(c(rate), round, 3),
+ across(c(final_tax, percent, pension, prev_tax), ~ round(.x, 2)),
+ across(c(rate), ~ round(.x, 3)),
)
# Write detail results to file for safekeeping
diff --git a/data-raw/sample_tax_bills/sample_tax_bills_detail.csv b/data-raw/sample_tax_bills/sample_tax_bills_detail.csv
index e89b6dc..5165fc7 100644
--- a/data-raw/sample_tax_bills/sample_tax_bills_detail.csv
+++ b/data-raw/sample_tax_bills/sample_tax_bills_detail.csv
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:5f5a9f5fea3b6a41cfac65661a95d4bb0699c17e0da67d25792739db5d93022c
-size 47317
+oid sha256:9214efd6a6b050bb1778f7a2be742091c79e58acd33b58456c2b21b13aaeae03
+size 54474
diff --git a/data-raw/tax_code/2022 Tax Code Agency Rate.xlsx b/data-raw/tax_code/2022 Tax Code Agency Rate.xlsx
new file mode 100644
index 0000000..9b55b61
--- /dev/null
+++ b/data-raw/tax_code/2022 Tax Code Agency Rate.xlsx
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:eee13315554b2c096e6513c2ff13e0cb178b9c46473f2ddd414bd705f52102bb
+size 1892319
diff --git a/data-raw/tax_code/tax_code.R b/data-raw/tax_code/tax_code.R
index e9dd268..562ea02 100644
--- a/data-raw/tax_code/tax_code.R
+++ b/data-raw/tax_code/tax_code.R
@@ -23,6 +23,7 @@ file_names <- list.files(
# Load each file and cleanup columns, then combine into single df
tax_code <- map_dfr(file_names, function(file) {
# Extract year from file name
+ print(file)
year_ext <- str_extract(file, "\\d{4}")
# Load file based on extension
@@ -39,6 +40,14 @@ tax_code <- map_dfr(file_names, function(file) {
~ str_replace(.x, "taxcode", "tax_code"),
starts_with("taxcode")
) %>%
+ rename_with(
+ ~ str_replace(.x, "ag_rate", "agency_rate"),
+ starts_with("ag_rate")
+ ) %>%
+ rename_with(
+ ~ str_replace(.x, "code_rate", "tax_code_rate"),
+ starts_with("code_rate")
+ ) %>%
mutate(
year = as.character(year_ext),
agency_rate = as.numeric(agency_rate),
diff --git a/data-raw/tif/distribution/2022 TIF Agency Distribution Report.xlsx b/data-raw/tif/distribution/2022 TIF Agency Distribution Report.xlsx
new file mode 100644
index 0000000..a6e75f2
--- /dev/null
+++ b/data-raw/tif/distribution/2022 TIF Agency Distribution Report.xlsx
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5a60312f8c7a924bc88cb6728930027e6e512c89b1f811fe8964d5ea2f3d6cc3
+size 170449
diff --git a/data-raw/tif/main/2006 Cook TIF Summary.xlsx b/data-raw/tif/main/2006 Cook TIF Summary.xlsx
new file mode 100644
index 0000000..37855c0
--- /dev/null
+++ b/data-raw/tif/main/2006 Cook TIF Summary.xlsx
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f5007d3ce62da6d13adcb3cead8f89067589f10cdce5706730dd636a4e9ccf65
+size 49296
diff --git a/data-raw/tif/main/2007 Cook TIF Summary.xlsx b/data-raw/tif/main/2007 Cook TIF Summary.xlsx
new file mode 100644
index 0000000..77ac46e
--- /dev/null
+++ b/data-raw/tif/main/2007 Cook TIF Summary.xlsx
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d1e5ec9fd252ef30b61dd3188cd4ab8746c088414a2b1f55c4f37cef89aaa225
+size 49870
diff --git a/data-raw/tif/main/2008 Cook TIF Summary.xlsx b/data-raw/tif/main/2008 Cook TIF Summary.xlsx
new file mode 100644
index 0000000..b8e7f2c
--- /dev/null
+++ b/data-raw/tif/main/2008 Cook TIF Summary.xlsx
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:524888448457d4fba43d003017c4113edc2716a869a305e1c69ec0a2995a95cf
+size 51560
diff --git a/data-raw/tif/main/2009 Cook TIF Summary.xlsx b/data-raw/tif/main/2009 Cook TIF Summary.xlsx
new file mode 100644
index 0000000..d95b6cf
--- /dev/null
+++ b/data-raw/tif/main/2009 Cook TIF Summary.xlsx
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:31369a4ada238a90beb50495772e1a81ed490932ea0c8b2bfc963a041b9d6cbf
+size 51684
diff --git a/data-raw/tif/main/2010 Cook TIF Summary.xlsx b/data-raw/tif/main/2010 Cook TIF Summary.xlsx
new file mode 100644
index 0000000..83d8792
--- /dev/null
+++ b/data-raw/tif/main/2010 Cook TIF Summary.xlsx
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d28ee538a87cdefeed16e7ca173e5639c3cfa68f775e8fb825f4bb9265eb4bbb
+size 51203
diff --git a/data-raw/tif/main/2011 Cook TIF Summary.xlsx b/data-raw/tif/main/2011 Cook TIF Summary.xlsx
new file mode 100644
index 0000000..5982abd
--- /dev/null
+++ b/data-raw/tif/main/2011 Cook TIF Summary.xlsx
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2456c372a5e6d6cc678c981bf35f9eba00d0c53fafc5984778603b0af57a19a0
+size 50826
diff --git a/data-raw/tif/main/2012 Cook TIF Summary.xlsx b/data-raw/tif/main/2012 Cook TIF Summary.xlsx
new file mode 100644
index 0000000..2ddf610
--- /dev/null
+++ b/data-raw/tif/main/2012 Cook TIF Summary.xlsx
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9861e8c3b13d71cfe60395e1f295063f699f0c4cd914e2bc82cd404d281d6db8
+size 52824
diff --git a/data-raw/tif/main/2022 Cook County TIF Summary.xlsx b/data-raw/tif/main/2022 Cook County TIF Summary.xlsx
new file mode 100644
index 0000000..186f0a2
--- /dev/null
+++ b/data-raw/tif/main/2022 Cook County TIF Summary.xlsx
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5bfe861c1e1dd5a15c0398c40aed22023379fa114876186d530d46426e157641
+size 45095
diff --git a/data-raw/tif/tif.R b/data-raw/tif/tif.R
index a4b3cac..a1a242e 100644
--- a/data-raw/tif/tif.R
+++ b/data-raw/tif/tif.R
@@ -7,7 +7,6 @@ library(purrr)
library(readxl)
library(snakecase)
library(stringr)
-library(tabulizer)
library(tidyr)
calc_mode <- function(x) {
@@ -76,113 +75,93 @@ tif_main_xls <- map_dfr(summ_file_names_xls, function(file) {
df <- readxl::read_xlsx(file)
}
- df %>%
- mutate(year = year_ext) %>%
- set_names(snakecase::to_snake_case(names(.))) %>%
- rename_with(~ str_replace(.x, str_c(year_ext, "_"), "curr_year_")) %>%
- rename_with(~ str_replace(.x, str_c(year_ext - 1, "_"), "prev_year_")) %>%
- mutate(
- cancelled_this_year =
- year == str_extract(new_cancelled, "\\d{4}") &
- str_detect(tolower(new_cancelled), "cancel"),
- across(c(cancelled_this_year), ~ replace_na(.x, FALSE)),
- across(c(curr_year_revenue, prev_year_revenue), ~ replace_na(.x, 0)),
- agency = str_pad(agency, 9, "left", "0")
- ) %>%
- select(
- year,
- agency_num = agency, tif_name, prev_year_revenue,
- curr_year_revenue, first_year, cancelled_this_year,
- )
-})
-
-
-## PDF files -----
-
-# Get summary report PDFs
-summ_file_names_pdf <- list.files(
- path = "data-raw/tif/main",
- pattern = "*Summary\\.pdf",
- full.names = TRUE
-)
-
-tif_main_pdf <- map_dfr(summ_file_names_pdf, function(file) {
- message("Reading: ", file)
- year_ext <- as.integer(str_extract(file, "\\d{4}"))
-
- # Extract tables from PDFs. Some tables get an extra 3rd column which we can
- # drop
- tables <- extract_tables(file) %>%
- map(function(x) if (ncol(x) > 6) x[, c(1:2, 4:7)] else x) %>%
- .[lapply(., nrow) > 1]
-
- do.call(rbind, tables) %>%
- as_tibble() %>%
- set_names(c(
- "agency_num", "tif_name", "first_year",
- "curr_year_revenue", "prev_year_revenue", "pct_diff"
- )) %>%
- filter(agency_num != "AGENCY") %>%
- na_if("-") %>%
- na_if("") %>%
- mutate(
- year = year_ext,
- agency_num = str_pad(
- str_squish(str_trim(str_remove_all(agency_num, "-"))),
- 9,
- "left",
- "0"
- ),
- cancelled_this_year =
- year == str_extract(tif_name, "\\d{4}"),
- tif_name =
- str_trim(str_squish(str_remove(tif_name, "City of|Village of"))),
- # Kludge for bad OCR/table extraction for certain cells
- agency_num = case_when(
- str_detect(tif_name, "Country Club Hills - 175th") & year == 2008 ~
- "030240501",
- str_detect(tif_name, "Thornton - Downtown") & year == 2009 ~
- "031260501",
- str_detect(tif_name, "Evanston - Dempster / Dodge") & year == 2012 ~
- "030380506",
- str_detect(tif_name, "Homewood - East CBD") & year == 2012 ~
- "030600505",
- str_detect(tif_name, "East Dundee") & year %in% 2012 ~
- "030320500",
- str_detect(agency_num, "Homewood East CBD") & year == 2012 ~
- "030600505",
- TRUE ~ agency_num
- ),
- first_year = ifelse(
- tif_name == "2011" & agency_num == "030600505",
- 2011,
- first_year
+ # modify legacy pdf conversions to excel
+ if (between(year_ext, 2006, 2012)) {
+ df %>%
+ set_names(c(
+ "agency_num", "tif_name", "first_year",
+ "curr_year_revenue", "prev_year_revenue", "pct_diff"
+ )) %>%
+ filter(agency_num != "AGENCY") %>%
+ mutate(across(where(is.character), ~ na_if(., "-"))) %>%
+ mutate(across(where(is.character), ~ na_if(., " "))) %>%
+ mutate(
+ year = year_ext,
+ agency_num = str_pad(
+ str_squish(str_trim(str_remove_all(agency_num, "-"))),
+ 9,
+ "left",
+ "0"
+ ),
+ cancelled_this_year =
+ year == str_extract(tif_name, "\\d{4}"),
+ tif_name =
+ str_trim(str_squish(str_remove(tif_name, "City of|Village of"))),
+ # Kludge for bad OCR/table extraction for certain cells
+ agency_num = case_when(
+ str_detect(tif_name, "Country Club Hills - 175th") & year == 2008 ~
+ "030240501",
+ str_detect(tif_name, "Thornton - Downtown") & year == 2009 ~
+ "031260501",
+ str_detect(tif_name, "Evanston - Dempster / Dodge") & year == 2012 ~
+ "030380506",
+ str_detect(tif_name, "Homewood - East CBD") & year == 2012 ~
+ "030600505",
+ str_detect(tif_name, "East Dundee") & year %in% 2012 ~
+ "030320500",
+ str_detect(agency_num, "Homewood East CBD") & year == 2012 ~
+ "030600505",
+ TRUE ~ agency_num
+ ),
+ first_year = ifelse(
+ tif_name == "2011" & agency_num == "030600505",
+ 2011,
+ first_year
+ )
+ ) %>%
+ filter(!is.na(agency_num)) %>%
+ mutate(
+ tif_name = str_remove_all(tif_name, "\\ *Cancel.*"),
+ tif_name = str_remove_all(tif_name, "\\ *CANCEL.*"),
+ tif_name = str_remove_all(tif_name, "\\ *New.*"),
+ tif_name = str_squish(str_trim(tif_name)),
+ cancelled_this_year = replace_na(cancelled_this_year, FALSE),
+ across(
+ c("first_year", "curr_year_revenue", "prev_year_revenue"),
+ ~ replace_na(readr::parse_number(.x), 0)
+ )
+ ) %>%
+ select(
+ year, agency_num, tif_name, prev_year_revenue,
+ curr_year_revenue, first_year, cancelled_this_year
)
- ) %>%
- filter(!is.na(agency_num)) %>%
- mutate(
- tif_name = str_remove_all(tif_name, "\\ *Cancel.*"),
- tif_name = str_remove_all(tif_name, "\\ *CANCEL.*"),
- tif_name = str_remove_all(tif_name, "\\ *New.*"),
- tif_name = str_squish(str_trim(tif_name)),
- cancelled_this_year = replace_na(cancelled_this_year, FALSE),
- across(
- c("first_year", "curr_year_revenue", "prev_year_revenue"),
- ~ replace_na(readr::parse_number(.x), 0)
+ } else {
+ df %>%
+ mutate(year = year_ext) %>%
+ set_names(snakecase::to_snake_case(names(.))) %>%
+ rename_with(~ str_replace(.x, str_c(year_ext, "_"), "curr_year_")) %>%
+ rename_with(~ str_replace(.x, str_c(year_ext - 1, "_"), "prev_year_")) %>%
+ mutate(
+ cancelled_this_year =
+ year == str_extract(new_cancelled, "\\d{4}") &
+ str_detect(tolower(new_cancelled), "cancel"),
+ across(c(cancelled_this_year), ~ replace_na(.x, FALSE)),
+ across(c(curr_year_revenue, prev_year_revenue), ~ replace_na(.x, 0)),
+ agency = str_pad(agency, 9, "left", "0")
+ ) %>%
+ select(
+ year,
+ agency_num = agency, tif_name, prev_year_revenue,
+ curr_year_revenue, first_year, cancelled_this_year,
)
- ) %>%
- select(
- year, agency_num, tif_name, prev_year_revenue,
- curr_year_revenue, first_year, cancelled_this_year
- )
+ }
})
-# Combine Excel and PDF outputs into since data frame
-tif_main <- bind_rows(
- tif_main_pdf,
- tif_main_xls
-) %>%
- filter(!is.na(tif_name)) %>%
+tif_main <- tif_main_xls %>%
+ filter(
+ !is.na(tif_name), agency_num != "City of Chicago",
+ agency_num != "Suburban Total"
+ ) %>%
# Manual fixes for misread values
mutate(
agency_num = ifelse(
@@ -232,6 +211,14 @@ tif_main <- bind_rows(
first_year = ifelse(
agency_num == "030600504" & year == 2011,
2011, first_year
+ ),
+ agency_num = if_else(tif_name == "Melrsoe Park - Lake Street Corridor",
+ "030770509",
+ agency_num
+ ),
+ agency_num = if_else(tif_name == "Melrose Park - Joyce Bros. Storage",
+ "030770501",
+ agency_num
)
) %>%
filter(!(agency_num == "030330500" & first_year == 2012)) %>%
@@ -263,8 +250,6 @@ arrow::write_parquet(
)
-
-
# tif_distribution -------------------------------------------------------------
## Excel files -----
From fd42117cc1c8afa20992c493b7e2c35a5dca85c3 Mon Sep 17 00:00:00 2001
From: Dan Snow
Date: Thu, 18 Jan 2024 20:42:52 +0000
Subject: [PATCH 02/21] Fix spacing
---
data-raw/agency/agency.R | 2 ++
1 file changed, 2 insertions(+)
diff --git a/data-raw/agency/agency.R b/data-raw/agency/agency.R
index 1033450..d7a856e 100644
--- a/data-raw/agency/agency.R
+++ b/data-raw/agency/agency.R
@@ -43,6 +43,8 @@ file_names <- list.files(
)
+
+
# agency_fund ------------------------------------------------------------------
# Load the detail sheet from each agency file. This includes the levy and rate
From c7bf08ff2e75c2bbaaa5bb182f4e69ca51a76697 Mon Sep 17 00:00:00 2001
From: Dan Snow
Date: Thu, 18 Jan 2024 20:45:25 +0000
Subject: [PATCH 03/21] Update deprecated across() call
---
data-raw/agency/agency.R | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/data-raw/agency/agency.R b/data-raw/agency/agency.R
index d7a856e..45d5ff7 100644
--- a/data-raw/agency/agency.R
+++ b/data-raw/agency/agency.R
@@ -283,7 +283,7 @@ agency <- map_dfr(file_names, function(file) {
0,
cty_cook_eav
),
- across(starts_with("cty_"), replace_na, 0),
+ across(starts_with("cty_"), ~ replace_na(.x, 0)),
# Make all percentages decimals
across(
c(pct_burden, reduction_pct),
From ff09025ddb196e82b8beebb0039a1df8c47aabfb Mon Sep 17 00:00:00 2001
From: Dan Snow
Date: Thu, 18 Jan 2024 20:46:54 +0000
Subject: [PATCH 04/21] Replace tabulizer with pdftools dependency
---
DESCRIPTION | 5 ++---
data-raw/cpi/cpi.R | 2 +-
2 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/DESCRIPTION b/DESCRIPTION
index 8a9cae4..9c80f9e 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -38,6 +38,7 @@ Suggests:
lintr,
odbc,
openxlsx,
+ pdftools,
pkgdown,
prettymapr,
purrr,
@@ -49,7 +50,6 @@ Suggests:
sf,
snakecase,
stringr,
- tabulizer,
testthat,
tidyr,
units,
@@ -57,7 +57,6 @@ Suggests:
Depends:
R (>= 2.10)
Remotes:
- paleolimbot/geoarrow,
- ropensci/tabulizer
+ paleolimbot/geoarrow
Config/Requires_DB_Version: 2021.0.4
Config/Wants_DB_Version: 2021.0.4
diff --git a/data-raw/cpi/cpi.R b/data-raw/cpi/cpi.R
index 7976ea8..01b550d 100644
--- a/data-raw/cpi/cpi.R
+++ b/data-raw/cpi/cpi.R
@@ -14,7 +14,7 @@ row_to_names <- function(df) {
# The goal of this script is to create a data frame of Consumer Price Indices
# CPI-U used by PTELL to calculate/cap property tax extensions
# We can load the historical CPIs from a PDF provided by the State of Illinois
-# https://tax.illinois.gov/content/dam/soi/en/web/tax/localgovernments/property/documents/cpihistory.pdf
+# https://tax.illinois.gov/content/dam/soi/en/web/tax/localgovernments/property/documents/cpihistory.pdf # nolint
# Paths for local raw data storage and remote storage on S3
remote_bucket <- Sys.getenv("S3_REMOTE_BUCKET")
From 96c28bdd7a78536205fc77b2ef58fcf44cc6a119 Mon Sep 17 00:00:00 2001
From: Dan Snow
Date: Thu, 18 Jan 2024 21:09:10 +0000
Subject: [PATCH 05/21] Add bill detail data object
---
data/sample_tax_bills_detail.rda | Bin 10926 -> 11933 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
diff --git a/data/sample_tax_bills_detail.rda b/data/sample_tax_bills_detail.rda
index 413c396c165c40c883150f0f0f3fda542aa4132b..b193cb1c086a8894c3fa6221d2fffaebe08103df 100644
GIT binary patch
literal 11933
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
literal 10926
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
From e9dd0b750a55d1ff2924923afcc4adf9441375df Mon Sep 17 00:00:00 2001
From: Dan Snow
Date: Thu, 18 Jan 2024 21:36:32 +0000
Subject: [PATCH 06/21] Add sample tax bills summary data
---
.../sample_tax_bills_summary.csv | 4 ++--
data/sample_tax_bills_summary.rda | Bin 1964 -> 2250 bytes
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/data-raw/sample_tax_bills/sample_tax_bills_summary.csv b/data-raw/sample_tax_bills/sample_tax_bills_summary.csv
index b6c95a0..1feb39e 100644
--- a/data-raw/sample_tax_bills/sample_tax_bills_summary.csv
+++ b/data-raw/sample_tax_bills/sample_tax_bills_summary.csv
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:eae93e3cfc8d5396e424f4bccf11468f685e16ece56487c03a73c374e52bfda6
-size 4948
+oid sha256:426a0db657b219904d3e76983363350297e710e58c25d5ea4b7b3b78986f8b96
+size 5975
diff --git a/data/sample_tax_bills_summary.rda b/data/sample_tax_bills_summary.rda
index c9c2851f1a86d607f1f12370f4435bed69fbc037..8bbdd38156df5c34adbf631c81b8045eaebcd788 100644
GIT binary patch
literal 2250
zcmV;*2sQUYT4*^jL0KkKSs%7S0HrBTPxDKT#S000w|E
z0MGyc0000o0BC45000000001J0000rJVYeY6&L^j0000000000000000Wbgn00000
zCIJ`#fh1~-)ENdNMkYa~nlPGaiKa|VF&HL8%4z8yfF>q`005YnjSPka(WVm!G|7Su
z2AMG!0E0$Brhw6*pvcfP8UO%kqeg>6O#n0i88pxgBSSy{13+Q`4FCW%0AvF|5=erN
zB4TY!O;giqnr#WD#R2K4^$j#+27#xj27r2=pa99B&;h264@tDt0j7gTs5YS5Kn)p`
z^$h@IP9EN(90ZrN$z5HY%;d2>v4Rn7A(~~7^C5;vhBLzmW=T*J%YwCcfUUqvX8`1Y
z8Il+V1f#-dBs>`%eTOBw+c_Xmp^l<0`%s4iE-=s19HCuih2zFyDrhN@1J-N
z_I(I8t;)N`I%1|@$I*bMy=)4%%3kd11VkK2Km>7C#S=k-<;IS{FsU?&AR=6YQjw-g
z2}vfIq>!hdeK0*`P=h0G8suw5s7%NsiPDNPiNzdhT3;fJ8qAXsXogy~Yhh;~n6w2Q
zUT${9vS|n&wsy!l_Ldl{>_+aAHmyn|Qrgv}3nC3RDry)cI%Hr(ATZV@h&WTx5eX+-
zyihU)<+QT4qTFuYeGpRg-a)Y}bjgh&m>H7Sb_mMiY2t*b)t_~E%z~>^C99)!
z+%I|T1OyyN07MI@U;qMU3ppq~p%J7>D>6p_(6Ga+umS?juIqUdcLcJ?NutuF!=rFY
zcv8_xqZA~YE|S3las!YW+G^`K5@f}oQ49!yBtaLei>a`}#oW^FsM3)NRLVgew^|u1cFMnAS143C&&Tu&mXmKxoYZM;0+}
z8<`Phaw_7Z3QdLzif>qSgfe3vsinnICv95xIGW~79fo1dS&rtT02;A$q_z}AD9A*M
zh6W5&VNpumD4fgD-uVS^66ywQgbiQ|Wwcfr)Wdntuz?cIhWsp3;b;a$0hu5BA{k075t*D7L7}R!ygSf_A<)A)umsaPI?nQq(jXE_AiIV`3bKgEp`_4g
zr!WS5;1M7A6vD#PX$S@q5L!aY4H+~;!2P2LzrdV@
zAqb3v;go%d7u#r5(wlX}QH`$I=0h)Nj$!cVoFtbLB@w8?lonSai;D&%@x2=`qj9p0F1h!`4fyni%EdxU0-!
z6=X=E2aqx!0}vcLJZG|d!jz?L6bFnK!-B|SGR%?)hY;ZHR(XbMgn6K_p-nMKtjIHC
z?aTs>ZIvL9voF;C
zktRye`r=9f1K8e|dU5?a;Y}<#dl-#!q^KSwT7i+q{aM;QL~Q-ny6-CfnE^4**j#Z)
zHZA|9aMSFaPfYd^v;1cVA~<5^!r-?V@KiI^Zc(hNJy_Xt>Q%u7mTuIp8NztqONdyr
z{QXzzS!1-X=RrTiy0GwY%Y4QN*bKI2H}hFsCB&`KeG~=W3XgwO;T|>u{Vp8s3#A|r
zA%X*WC0>Bvvj?EuMjxhOr^Ga2N(-Ld3BzAXGFrJR$|Z%-wb
z0SK*L3D)xtN&jMUq;R4)O=a1Yg#f`||pTc%5cpEDD$ew1jj>krLlBC9ED%M1eOR
YI_$%~;K)P0XL-fkkxmpO2knr#0F2PuNdN!<
literal 1964
zcmb7;Ydq5n1AzZCW@BobOEVp|nPK7Q@;~L0)9e;I+sKwsYL=sMN+Fb2HP@1+VX`f~
zXJ!ed43&$J)BElH`aaM1=l9T}#eQBvQDlD9O_w8cfNArQ
zyM9V(r?!v9how9FqtL|1CRzaWOF2&6x<)k
z1s4G^FtoUm&ywJ9f%FlWG;pIjXcmXer2^vHYM2xR7IF6K|JsY?*2yFmAhJMe0ayUT
zLC0(@0GI@b8v?w6z8aRw8^i$s2;2Y@YAor-C`e7V>~@tJqQ;56paeBA1RzxajA{$^
z4zpO_^DqgvKnm)`LdnR&9gs^x1E2+9S_=$Q#UKDt1OEdE{2#Rv21%b#B~y$f+LwtD
zxx}~yiC8RxI@iXDL0lkJj8%GnKUBgbI9u>`H5ZCgoX9?>?eNJ=OwnFa?dbbBshqH?
zk0)GjgM$x*;dm-tc!7y|dZqQ4*#xO5*bI)@O%Kr)j&rGupz8KZkdQAOG$*=eP4~f<
zsjX$X4q-X+kvI`!H&bIy6W%Pv>&{Ge^_CFa)|Rq7fycA*u)LV$@M)3`s3-K}(W>~{
zU$#^x+ON!hd;dW5a^k7ag4rpmYsAF?0+}$mj(5
zrho)h;wo@Zy2p&?vdCL=^KWQl#kRG&x?Kg^*Y&0pb7mORl)T>!>|I{x(UE*(z2zaB
zi0$bYgI?`md|Hb0)VzVoY*O9Zhr^XbU0|t7dYL1ML+M{#ScQWWHCJb#O4NH+dAJd0
zTXwVaY0*#N?4k|F0mw-#&N*h-nD&Jdpy54#t;*Q4!WsuxWsdVqR9yetBWD`hmW>6Q6ld&&|Ec4M
zlI}(-PrM|@IyWJ;*rViHb3#yJu%PRf(@tPfqp;<-$c1`~IV|;hH^mK_@8aEz8tXE}
z$LEOAjGsJnYw#K&DtVtHHq$@L?Ggu0Zph`ERt9@kdckr83R!!`YkBwtCR471V^k@mA}L_i3Z)G{k4&}LH+jHd8-=>JM8$na8vR%)}-MrF(8VEaK&r3ogia5
z`kd#-@0jTP_LfgnVY1mYNLrj#Aag%Ee9E=N%|&>_M4R~`ESjZzV=_u7pu+6fA$_~Fe%zJZCvck@tJd{pVZL
z3hxqP*!8E94%(&qZmF#|ewTbY;zQ>|O6sin$se1l5y!Bwl5dzA
z*=WgDb}3zr(OK0rIsvxSVKRV)TpzE)^Gj8DEf%D?5wdr-)4~b`3Pjn(Qotr03sq!D*ylh
From 5317ba4a14b238c3bf4c063a70e489b0be1410ca Mon Sep 17 00:00:00 2001
From: Dan Snow
Date: Thu, 18 Jan 2024 22:24:30 +0000
Subject: [PATCH 07/21] Fix tax bill agency name matching
Give priority to certain names on bills in the detail output and add
names for TY2022
---
.../sample_tax_bills/agency_name_match.csv | 4 ++--
.../sample_tax_bills_detail.R | 8 ++++++--
.../sample_tax_bills_detail.csv | 4 ++--
data/sample_tax_bills_detail.rda | Bin 11933 -> 12617 bytes
4 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/data-raw/sample_tax_bills/agency_name_match.csv b/data-raw/sample_tax_bills/agency_name_match.csv
index 59327c1..6e5425f 100644
--- a/data-raw/sample_tax_bills/agency_name_match.csv
+++ b/data-raw/sample_tax_bills/agency_name_match.csv
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d76e4471b3e6b34eb199abe6e2db6887609b451361bb45d68f918172f69dc749
-size 7254
+oid sha256:71405da084f2e0f2e43eeeed38df92d170683bfcfbf540102d392148e03104d4
+size 8945
diff --git a/data-raw/sample_tax_bills/sample_tax_bills_detail.R b/data-raw/sample_tax_bills/sample_tax_bills_detail.R
index f026d9d..2566ba2 100644
--- a/data-raw/sample_tax_bills/sample_tax_bills_detail.R
+++ b/data-raw/sample_tax_bills/sample_tax_bills_detail.R
@@ -59,7 +59,10 @@ extract_tax_bill <- function(file) {
agency_name != "",
!str_detect(
agency_name,
- "TAXES|Assess|Property|EAV|Local Tax|Total Tax|Do not|Equalizer|cookcountyclerk.com"
+ paste0(
+ "TAXES|Assess|Property|EAV|Local Tax|",
+ "Total Tax|Do not|Equalizer|cookcountyclerk.com"
+ )
)
)
# Create a list with metadata for output
@@ -109,7 +112,8 @@ bills_df <- bills_df %>%
group_by(pin, year, agency_num) %>%
mutate(across(final_tax:prev_tax, sum)) %>%
select(-cook) %>%
- filter(!is.na(agency_num), row_number() == 1) %>%
+ filter(!is.na(agency_num), name_priority == 1) %>%
+ select(-name_priority) %>%
ungroup()
# Round numeric values to nearest hundredth
diff --git a/data-raw/sample_tax_bills/sample_tax_bills_detail.csv b/data-raw/sample_tax_bills/sample_tax_bills_detail.csv
index 5165fc7..0ab28d0 100644
--- a/data-raw/sample_tax_bills/sample_tax_bills_detail.csv
+++ b/data-raw/sample_tax_bills/sample_tax_bills_detail.csv
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:9214efd6a6b050bb1778f7a2be742091c79e58acd33b58456c2b21b13aaeae03
-size 54474
+oid sha256:db21c8a42ffa4197f645ecce23c82f8d1be7ee7b50646ed513b2f80ee85e647b
+size 57270
diff --git a/data/sample_tax_bills_detail.rda b/data/sample_tax_bills_detail.rda
index b193cb1c086a8894c3fa6221d2fffaebe08103df..8935633cbf78f4823fe607c3be037d1210ce3573 100644
GIT binary patch
literal 12617
zcmV-PF}BV^T4*^jL0KkKS=RkHX8>%DfB*mg|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0
z|NsC0|Nr1M+Q9qdhtOqi%Hydm?E2?bnKpH(@ld4q68qb&-~a#s1poyA05f0;prbkf
zUH||901r9`(;r&;!LZT`nvoT~Vt}VmB~iNf4-;k%h4guS>}x^LaZpe?9V??-yMXCH
zl0*7uRBcT%Z%~-hAE`9W5CcZiVtP!QQzIkP$OA^184pt?BRx|f
zJxopNm?i|!H2qQPJqXZXnrWw~$)+P}X`s_UZAK$NB194iN0Jj$YI;GC0003!O`#fM
zW|{_xfu?{o00A^(M95%95cB|yOaMjzCIBV?13*j!WMC!)N+5s;6H0!kil3>VX`z)o
zH9aFjewv<;Jtj$~l5B>F;FD@(8feJcO⪼9*Fdwpf;g|^n)O2p{9)wNP3wxGBE%&
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
literal 11933
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