from dash import Dash, html, dcc
import pandas as pd
import plotly.express as px
# Load data
url = "https://raw.githubusercontent.com/plotly/Figure-Friday/refs/heads/main/2025/week-25/Building_Permits_Issued_Past_180_Days.csv"
df = pd.read_csv(url)
# Clean up column names
df.columns = df.columns.str.strip()
# Double-check exact match for contractor column
contractor_col = [col for col in df.columns if "Contractor Address 1" in col][0] # safely resolves exact name
# Drop rows missing either contractor address or workclass
df = df.dropna(subset=[contractor_col, "workclass"])
# Filter top 20 most frequent contractor addresses
top_addresses = df[contractor_col].value_counts().nlargest(20).index
df_filtered = df[df[contractor_col].isin(top_addresses)]
# Create pivot for heatmap
pivot = df_filtered.pivot_table(
index=contractor_col,
columns="workclass",
aggfunc="size",
fill_value=0
)
# Plot heatmap
fig = px.imshow(
pivot,
text_auto=True,
labels=dict(x="Workclass", y="Contractor Address", color="Permit Count"),
title="Heatmap of Workclass by Contractor Address"
)
# Dash app (Py.Cafe-compatible)
app = Dash(__name__)
app.layout = html.Div([
html.H3("Contractor Address vs. Workclass Heatmap"),
dcc.Graph(figure=fig)
])