Service request no. NYC311-PULSE-01 Filed 2026 In progress

Where does NYC's 311 system fall behind?

A relational database and Power BI dashboard built on real NYC 311 service request data, with an automated Python and SQL pipeline behind it.

The question

NYC's 311 line handles millions of service requests a year, everything from noise complaints to broken streetlights. Response times vary a lot by agency, borough, and complaint type, but that variation is buried in raw city data. This project turns it into something a decision maker could actually act on.

This analysis asks which NYC agencies actually meet a 72-hour response window on 311 requests, and how wide the gap is between the agencies that do and the ones that don't.

How it works

1

Pull

A Python script calls the NYC Open Data (Socrata) API for 311 requests.

2

Automate

A scheduled GitHub Actions workflow runs that script weekly, no manual step required.

3

Model

Data lands in a PostgreSQL star schema: one fact table, four dimension tables.

4

Analyze

SQL with CTEs and window functions answers questions like agency ranking and month over month change.

5

Visualize

Power BI connects to the database directly and models relationships, DAX measures, and the dashboard below.

Data model

Fact table
fact_311_requests
Dimension
dim_agency
Dimension
dim_complaint_type
Dimension
dim_borough
Dimension
dim_date

Key finding

74.6 pts

NYPD closes 99.9% of its 311 requests within 72 hours. Housing Preservation and Development closes just 25.3%, a 74.6 percentage point gap between the fastest and slowest agencies in the dataset.

Live dashboard

NYC 311 Service Requests Dashboard

Download full-resolution PDF

Tech stack

SQL PostgreSQL Relational database design Star schema data modeling Python ETL pipeline Power BI DAX Data visualization GitHub Actions CI/CD automation REST API integration