Py.Cafe

ThomasD21M/

Simple Permit Visualizer

Simple Permit Visualizer

DocsPricing
  • app.py
  • requirements.txt
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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)
])