Florida Mass Appraisal and Valuation Intelligence

29 Aug 2026 • 12 min read

A Python and DuckDB ETL pipeline with a Power BI dashboard for analysis

Polk County Mass Appraisal and Valuation Intelligence Pipeline

An end-to-end data engineering and machine learning pipeline built to process, transform, and cluster mass appraisal real estate data for Polk County, Florida. The resulting dataset is optimized for a Power BI dashboard featuring spatial anomalies and escaped value analysis.

Pipeline Architecture

This repository contains three primary execution scripts that transform raw county tax roll and GIS data into a highly optimized, ZSTD-compressed Parquet star schema.

  1. etl_pipeline.py: The core script, using DuckDB’s in-memory processing to ingest CSV, TXT, and SHP files. It handles spatial loading, staging, statutory stratification logic, and outputs finalized fact and dimension tables.
  2. transform_gis_coords.py: A specialized spatial projection script. Uses pyproj to convert local Florida State Plane coordinates (EPSG:2882) into standard WGS84 Latitude/Longitude (EPSG:4326) within the Parquet files to enable native Azure Maps rendering in Power BI.
  3. k_means_etl.py: An unsupervised machine learning pipeline. Applies K-Means clustering to parcel characteristics (value, size, market area, quality, and use code) using a geometric, automated Elbow Method algorithm to detect the optimal number of clusters.

Repository Structure

Github Repo

TEXT
.
├── docs/
│   └── data_dictionary.md      # Schema and logic documentation
├── scripts/
│   ├── etl_pipeline.py         # DuckDB staging and dimensional modeling
│   ├── transform_gis_coords.py # Coordinate reprojection
│   └── k_means_etl.py          # ML clustering
├── .gitignore                  # Excludes data files
└── README.md

Mass Appraisal Statistics

The pipeline calculates standard mass appraisal uniformity metrics as governed by the International Association of Assessing Officers (IAAO):

Sales Ratio (Ri)

Coefficient of Dispersion: Measures appraisal uniformity, and is calcuated as the average absolute deviation of individual assessment-to-sales ratios from the median ratio, expressed as a percentage of that median.

Price-Related Differential: Measures vertical equity (regressivity vs. progressivity), and is calculated by dividing the mean assessment-to-sales ratio by the price-weighted mean assessment ratio.

Where Mean Ratio = The sum of all individual property assessment ratios divided by the number of properties,
and Weighted Mean Ratio = The total sum of all assessed values divided by the total sum of all sale prices.


Interactive Power BI Report

Detailed information regarding methods and assumptions can be found within the report, either in text boxes or tooltips.

Report User Guide

Page 1: Sales Ratio and Uniformity

This page evaluates statutory appraisal compliance by comparing assessed values to actual market transactions.

  • Filter by Stratum or Group: Use the “Active Stratum” and “Group Number” selectors at the bottom to filter the entire page’s analysis to specific property classifications.
  • Analyze Sales Ratios: The “Sales Ratio” scatter plot on the left visualizes individual parcel assessments against their sale price. Hover over any individual dot to reveal a tooltip containing specific parcel and valuation details.
  • Isolate Price Ranges: Use the “Sale Price” slider at the bottom left to zoom in on specific market segments.
  • Evaluate Uniformity: The “Sales Ratio Distribution” box plots on the right display the spread of assessment ratios across different study groups.
  • Track Compliance KPIs: The central indicator cards dynamically recalculate key mass appraisal metrics.

Page 2: Anomaly Identification

This page bridges machine learning and audit workflows to isolate valuation outliers and potential escaped revenue.

  • Explore K-Means Clusters: The “Valuation Outlier Analysis” scatter plot maps properties by “Just Value” and “Total Under Roof,” coloring them by their assigned machine learning cluster. Hover over any data point to view a detailed tooltip with the property’s specific attributes.
  • Filter by Cluster: Click the numbered “Cluster” buttons at the bottom left to cross-filter the central KPI cards, revealing the “Top 3 Market Areas,” “Top 3 Quality Codes,” and “Top 3 DOR Use Codes” dominating that specific cluster.
  • Identify Escaped Value: The “Unassessed Building Permits” bar chart tracks completed permits that received no corresponding new construction value on the subsequent tax roll.
  • Adjust Materiality Thresholds: Use the “Estimated Permit Value” slider at the bottom right to filter out minor maintenance (e.g., setting the minimum to $15,000). This updates the bar chart to show only high-value unassessed permits by property type.
The “Cluster” buttons and “Estimated Permit Value” slider filters apply to both report pages 2 and 3.

Page 3: Anomaly Identification Maps

This page translates the algorithmic and audit findings from Page 2 into interactive spatial visualizations.

  • Toggle Map Layers: Use the “K-Means Map” and “Permit Heat Map” bookmark buttons on the right side of the screen to switch between the two views.
  • Investigate Spatial Clusters (K-Means View): In the K-Means Map, use the “Cluster” dropdown to isolate specific property groupings. Hover over any plotted parcel to view a tooltip detailing its latitude, longitude, and core valuation metrics.
  • Locate Revenue Hotspots (Heat Map View): The Permit Heat Map visualizes geographic concentrations of unassessed permits. Adjust the “Estimated Permit Value” slider on the right to filter the heat map, highlighting the neighborhoods with the highest concentration of potential escaped value.

Reference: Data Dictionary

This data dictionary outlines the data architecture, schema definitions, and analytical transformations generated across the mass appraisal ETL and machine learning pipelines. All tables are saved as ZSTD-compressed Parquet files.


Schema Architecture Overview

The data warehouse follows a dimensional star/snowflake schema centered around the primary identifier parcel_id

Primary Dimension:
dim_parcels integrates Florida Department of Revenue (DOR) Name-Address-Legal (NAL) tax roll metrics, local Property Appraiser (PA) cadastre data, and reprojected spatial centroids.
Machine Learning Dimension:
dim_parcel_clusters joins to dim_parcels via parcel_id to provide unsupervised segmentation groups.
Fact Tables:
Capture structural improvements (fact_bldg), land segments (fact_land), miscellaneous features (fact_misc), construction permits (fact_permit), historical transactions (fact_sales), and physical situs addresses (fact_site).
Lookup Tables:
Normalized code-to-description mapping tables for appraisal categories, building characteristics, and statutory audit classifications.

Dimension Tables

dim_parcels

  • File Path: ./data/parquet/dim_parcels.parquet
  • Grain: One row per unique real estate parcel (parcel_id).
  • Coordinate Reference System: WGS84 Decimal Degrees (EPSG:4326), reprojected from Florida West State Plane (EPSG:2882).
...View Full Details...
Column NameData TypeSource / LogicDescription
parcel_idVARCHARstg_parcelPrimary unique parcel identifier (Strap).
rtsVARCHARChars 1–6 of parcel_idCombined Public Land Survey System (PLSS) Range, Township, Section.
range_codeVARCHARChars 1–2 of parcel_idCadastral Range identifier.
township_codeVARCHARChars 3–4 of parcel_idCadastral Township identifier.
section_codeVARCHARChars 5–6 of parcel_idCadastral Section identifier.
sub_codeVARCHARChars 7–12 of parcel_idSubdivision identification code.
parcel_codeVARCHARChars 13–18 of parcel_idParcel block and lot/sequence number.
latitudeDOUBLEReprojected stg_gisParcel centroid latitude in WGS84 decimal degrees.
longitudeDOUBLEReprojected stg_gisParcel centroid longitude in WGS84 decimal degrees.
dor_use_codeVARCHARstg_parcelFlorida DOR 4-digit standardized property use classification.
nbrhd_codeDECIMAL(10,2)stg_parcelInternal appraisal neighborhood assessment code.
nbrhd_descVARCHARstg_parcelDescriptive name of the appraisal neighborhood.
homesteadDECIMAL(10,2)stg_parcelTotal dollar value of granted Homestead Exemption.
agri_classVARCHARstg_parcelAgricultural classification status code.
total_acreageDECIMAL(12,4)stg_parcelTotal parcel land area measured in acres.
year_createdINTEGERstg_parcelCalendar year the parcel record was created in the tax roll.
year_improvedINTEGERstg_parcelYear the primary structure or major improvement was completed.
prior_parcel_idVARCHARstg_parcelParent parcel ID prior to subdivision, split, or combination.
market_area_codeVARCHARstg_nalDOR mass appraisal economic market area code.
public_landVARCHARstg_nalFlag/code indicating governmental or public entity ownership.
valuation_codeVARCHARstg_parcelProperty appraiser internal valuation methodology code.
valuation_descVARCHARstg_parcelValuation model description (e.g., Market, Cost, Income).
ag_land_valueINTEGERstg_parcelClassified agricultural use land value.
appr_land_valueINTEGERstg_parcelAppraised market value of land.
appr_bldg_valueINTEGERstg_parcelAppraised market value of all primary structures.
appr_ext_feat_valueINTEGERstg_parcelAppraised market value of extra/miscellaneous features.
total_valueINTEGERstg_parcelTotal appraised market/just value ($Land + Building + Extra$).
jv_dorDOUBLEstg_nalJust value as submitted to Florida DOR on the NAL roll.
jv_dor_changeDOUBLEstg_nalNet dollar change in DOR just value compared to prior roll.
jv_dor_change_codeVARCHARstg_nalStatutory explanation code for change in DOR just value.
new_const_val_last_yrDOUBLEstg_nalValue added from new construction in prior assessment cycle.
new_delete_val_last_yrDOUBLEstg_nalValue removed from demolitions/deletions in prior cycle.
on_reconcileVARCHARstg_parcelRoll reconciliation status indicator.
assessed_valueDECIMAL(10,2)stg_parcelAssessed value subject to statutory assessment limitation caps.
base_tax_valueDECIMAL(10,2)stg_parcelBase taxable value after applying all eligible exemptions.
asmnt_yearINTEGERstg_nalAssessment tax roll year.
basic_stratumVARCHARstg_nalDOR-assigned basic stratum for statistical sampling.
active_stratumVARCHARstg_nalDOR-assigned active stratum used in official ratio studies.
group_numVARCHARstg_nalDOR sampling group code.
spass_codeVARCHARstg_nalSpecial assessment authority code.
parcel_splitVARCHARstg_nalFlag identifying parcel split/merge activity.
disaster_codeVARCHARstg_nalCatastrophic disaster relief classification code.
disaster_yearINTEGERstg_nalYear disaster damage occurred.
impvmt_qualityVARCHARstg_nalOverall structural construction quality grade.
last_insp_dateTIMESTAMPCoalescedDate of last field inspection (derived from PA date or NAL MMYY).
my_basic_stratumINTEGERDerived (SQL CASE)Custom statutory DOR basic stratum assignment (Stratum 1–13).
my_active_stratumINTEGERDerived (Window)Custom active stratum; shifts stratums <5% of total value to Stratum 8.
has_recent_final_inspectBOOLEANDerived (stg_permit)True if parcel has a finalized permit within 6 months of audit date.
recent_permit_total_valueDOUBLEDerived (stg_permit)Sum of estimated permit values finalized in the 6-month window.
my_group_numberINTEGERDerived (Window)Value stratification group: 1–4 (value quartiles), 5 (bottom 5%), 6 (top outliers).

dim_parcel_clusters

  • File Path: ./data/parquet/dim_parcel_clusters.parquet
  • Grain: One row per clustered parcel (parcel_id).
  • Model Source: Scikit-Learn K-Means ($k$ determined dynamically via geometric Elbow Method on standardized features: total_value, total_under_roof, market_area_code, impvmt_quality, and two-digit DOR use code).
...View Full Details...
Column NameData TypeDescription
parcel_idVARCHARForeign key linking to dim_parcels[parcel_id].
cluster_labelVARCHARCategorical cluster assignment label (e.g., Cluster 1, Cluster 2).

Fact Tables

fact_bldg

  • File Path: ./data/parquet/fact_bldg.parquet
  • Grain: One row per building/structure per parcel (parcel_id + bld_num).
...View Full Details...
Column NameData TypeDescription
parcel_idVARCHARForeign key linking to dim_parcels[parcel_id].
bld_numINTEGERSequential structure number on the parcel.
bldg_styleVARCHARArchitectural building design code.
bldg_storiesVARCHARNumber of stories/levels.
bldg_shapeVARCHARPerimeter irregularity/shape classification code.
bldg_classVARCHARStructural framing class code.
num_bathroomsDOUBLETotal number of full and partial bathrooms.
total_unitsVARCHARTotal residential/commercial units within the structure.
num_bedroomsDOUBLETotal number of bedrooms.
num_fireplacesDOUBLECount of fireplaces.
bldg_foundation_typeVARCHARSubstructure foundation construction type code.
bldg_frame_typeVARCHARStructural frame construction material code.
effective_yearDOUBLE / INTEffective construction year reflecting depreciation and upgrades.
actual_yearDOUBLE / INTActual chronological construction year built.
bldg_ext_wall_typeVARCHARPrimary exterior wall finish material code.
bldg_roof_typeVARCHARRoof structural design and framing type code.
bldg_floor_typeVARCHARSubfloor and surface flooring material code.
bldg_int_wall_typeVARCHARInterior wall construction and partition material code.
total_living_areaDOUBLEFinished, climate-controlled gross living area (Sq. Ft.).
total_under_roofDOUBLETotal footprint area under roof including porches and garages (Sq. Ft.).

fact_land

  • File Path: ./data/parquet/fact_land.parquet
  • Grain: One row per land segment/line per parcel (parcel_id + land_line_num).
...View Full Details...
Column NameData TypeDescription
parcel_idVARCHARForeign key linking to dim_parcels[parcel_id].
land_line_numINTEGERSequential land appraisal segment number.
land_classVARCHARLand pricing classification code.
land_use_codeVARCHARLand-specific use category code.
land_uc_descVARCHARDescription of specific land use.
land_frontageDECIMAL(12,2)Road or water frontage measured in linear feet.
land_depthDECIMAL(12,2)Average parcel segment depth measured in linear feet.
land_unitsDECIMAL(20,4)Total quantity of land units (Acreage, Square Feet, Front Feet).
land_unit_typeVARCHARUnit of measurement code (e.g., AC, SF, FF).
land_unit_descVARCHARDescription of the pricing unit of measure.

fact_misc

  • File Path: ./data/parquet/fact_misc.parquet
  • Grain: One row per extra feature or outbuilding (parcel_id + xfeature_num).
...View Full Details...
Column NameData TypeDescription
parcel_idVARCHARForeign key linking to dim_parcels[parcel_id].
bld_numINTEGERAssociated building sequence number (if applicable).
xfeature_numINTEGERSequential extra feature record number.
xfeat_codeVARCHARExtra feature item classification code (e.g., sheds, pools, docks).
xfeat_yr_bltINTEGERYear the extra feature was constructed/installed.
xfeat_lengthINTEGERFeature length in feet.
xfeat_widthINTEGERFeature width in feet.

fact_permit

  • File Path: ./data/parquet/fact_permit.parquet
  • Grain: One row per building permit event (permit_id).
...View Full Details...
Column NameData TypeDescription
parcel_idVARCHARForeign key linking to dim_parcels[parcel_id].
permit_idINTEGERInternal tracking primary key for the permit record.
permit_agencyVARCHARIssuing municipality or jurisdictional licensing authority.
permit_numVARCHAROfficial regulatory permit tracking number.
permit_statusCHARStatus code (e.g., C for Complete/Finaled).
permit_descVARCHARNarrative description of proposed construction or alteration.
permit_typeVARCHARCategory of construction (e.g., New Construction, Alteration, Repair).
issue_dateTIMESTAMPDate the permit was formally issued to the contractor/owner.
final_insp_dateTIMESTAMPDate of successful certificate of occupancy or final field inspection.
est_valueINTEGERDeclared construction valuation or project cost estimate ($).
site_street_numVARCHARStreet number where work was permitted.
site_street_pfxCHARDirectional prefix for permitted address (e.g., N, S).
site_street_nameVARCHARStreet name for permitted location.
site_street_sfxVARCHARStreet suffix (e.g., RD, AVE, BLVD).
site_apt_numVARCHARSuite or apartment unit identifier.

fact_sales

  • File Path: ./data/parquet/fact_sales.parquet
  • Grain: One row per recorded real estate conveyance transaction (parcel_id + sale_line_num).
...View Full Details...
Column NameData TypeDescription
parcel_idVARCHARForeign key linking to dim_parcels[parcel_id].
sale_line_numINTEGERHistorical sequence number for transaction records.
sale_dateTIMESTAMPOfficial date deed/instrument was executed.
sale_priceINTEGERRecorded gross sales transaction price ($).
book_numVARCHAROfficial county public records book number.
page_numVARCHAROfficial county public records page number.
sale_typeCHARSale qualification indicator.
transact_codeVARCHARConveyance qualification and transfer code.
instr_typeVARCHARLegal instrument type code (e.g., WD for Warranty Deed).
instr_type_dscrVARCHARLegal conveyance instrument description.

fact_site

  • File Path: ./data/parquet/fact_site.parquet
  • Grain: One row per physical address point per parcel (parcel_id + site_address_id).
...View Full Details...
Column NameData TypeDescription
parcel_idVARCHARForeign key linking to dim_parcels[parcel_id].
site_address_idINTEGERSequential address record ID for the parcel.
bld_numINTEGERStructure sequence number assigned to this situs address.
streetVARCHARFull formatted street name.
street_prefixCHARDirectional street prefix (N, S, E, W).
street_numberINTEGERStreet numeric house address.
street_num_suffixCHARLetter or numeric suffix on street number (e.g., 1/2).
street_suffixVARCHARStreet roadway designation (AVE, ST, WAY, DR).
street_sfx_directionCHARDirectional street suffix (NW, SE).
street_unitVARCHARUnit, suite, apartment, or lot identifier.
zip_codeVARCHAR5-digit USPS Postal ZIP code.
cityVARCHARSitus municipal jurisdiction or postal city name.

Lookup and Reference Tables

All reference tables are stored in ./data/parquet/lookups/. They provide human-readable definitions and analytical flags for coded fields across dimension and fact tables:

...View Full Details...
Table NameSource FileKey FieldDescription Fields & Flags
active_stratum_lupactive_stratum.txtstratumdefinition, incl_in_stat_analysis (Boolean)
bld_class_codes_lupbld_class_codes.txtcodedescription (Structural frame classification)
bld_frame_codes_lupbld_frame_codes.txtcodedescription (Building frame material)
bld_shape_codes_lupbld_shape_codes.txtcodedescription (Perimeter design shape)
bld_style_codes_lupbld_style_codes.txtcodedescription (Architectural styling)
disaster_codes_lupdisaster_codes.txtcodedefinition (Declared disaster identifiers)
dor_use_codes_lupdor_use_code.csvdor_use_codedor_uc_category, dor_uc_cat_desc, dor_uc_desc
extra_feat_codes_lupextra_feat_codes.txtcodedescription (Outbuilding/feature item codes)
ext_wall_codes_lupext_wall_codes.txtcodedescription (Exterior wall construction)
floor_type_codes_lupfloor_type_codes.txtcodedescription (Flooring structure/materials)
int_wall_codes_lupint_wall_codes.txtcodedescription (Interior wall partitions)
jv_change_codes_lupjv_change_codes.txtcodedefinition (DOR Just Value change justifications)
permit_stat_cd_luppermit_stat_cd.txtcodedescription (Building permit completion status)
prop_tran_codes_lupprop_tran_codes.txtcodedefinition, is_qualified_sale, incl_in_sales_ratio
pub_land_codes_luppub_land_codes.txtcodedescription (Public land authority ownership)
roof_type_codes_luproof_type_codes.txtcodedescription (Roof structure geometry and covering)
spass_codes_lupspass_codes.txtcodedefinition (Special assessment taxing jurisdictions)
substruct_codes_lupsubstruct_codes.txtcodedescription (Foundation and substructure types)
transact_codes_luptransact_codes.txtcodedescription, incl_in_sales_ratio (Boolean)

Start searching

Enter keywords to search articles.