Chronicles of Denver's Shadows

One Wizard. 467,928 Crimes. A Truly Alarming Amount of Coffee.

Download the Grimoire
🔮

"In the data, patterns emerge like constellations—except these constellations steal cars."

467,928 incidents analyzed • 19 dimensions explored • 0 crimes committed in the making of this notebook

The Quest Begins

Having lived in Denver until recently, I did what any reasonable person does after moving away: downloaded the city's entire public crime dataset and refused to sleep until it made sense. Armed with Python and the confidence of a wizard who has not yet seen the data quality, I waded into nearly half a million incidents spanning years of urban life.

The mission was genuinely serious: organize this chaotic sea of records so Denver's law enforcement could allocate resources more efficiently. To predict where the shadows fall next, you first have to map where they have been. The shadows, for the record, did not cooperate.

This is the chronicle of that journey—a tale of data cleaning, pattern discovery, and the truths that surface when you stare at a CSV long enough for it to stare back.

Chapter I: The Purification Ritual

Before any wizard divines the future, the dishes must be done. The raw data arrived like an ancient scroll—467,928 entries across 19 columns—and, like most ancient scrolls, it was a mess. Each offense carried an ID built from incident numbers, offense codes, and extensions. Some bore precise timestamps; others spoke only in vague ranges, like witnesses who would rather not get involved.

Anomalies lurked within: 41 entries where the crime ended before it began—actual time travel, per the spreadsheet—which had to be banished. Coordinates vanished for privacy; certain dates simply refused to align, on principle. Each error was cataloged, corrected, or excised with surgical precision and only moderate muttering.

Purification complete, I filtered out traffic incidents to focus on true crimes. What remained was a pristine dataset—clean, obedient, and ready to confess everything.

The Grimoire's Contents

Total Incidents:

467,928 criminal offenses (all someone else’s)

Data Dimensions:

19 columns, each with opinions

Geography:

Districts, precincts, neighborhoods mapped

Time Span:

Multiple years of temporal patterns

Format:

Jupyter Notebook (.ipynb)

Chapter II: Revelations in the Data

📈

The Rising Tide

Auto-theft and theft-from-motor-vehicles rose steadily over three years—the data all but tugs your sleeve about it. Translation: Denver, lock your cars; the trend line is not on your side.

🌙

Temporal Prophecies

Seasonal patterns tick along like clockwork: certain months reliably run hotter than others. Crime, it turns out, keeps a calendar—which means patrol resources can keep one too.

🗺️

Geographic Shadows

Districts and precincts each have a signature. Mapping concentrations across neighborhoods shows exactly where presence matters most—no crystal ball required, just Folium and patience.

⚖️

Category Convergence

Public disorder declined while property crimes surged—two lines crossing like ships in the night, one of them carrying your catalytic converter. Category by category, the full landscape comes into focus.

Chapter III: The Wizard's Toolkit

🐍
Python

A snake that eats spreadsheets

📊
Pandas

Bear-themed, bamboo-free wrangling

📈
Matplotlib

Charts on command

🎨
Seaborn

Statistics, but make it fashion

🗺️
Folium

Maps with receipts

📐
NumPy & SciPy

The math under the hood

The Chronicle Awaits

Download the complete Jupyter notebook and walk the whole path yourself. Every visualization, every insight, every line of code—plus my comments, which grow steadily more unhinged around cell 40.

Claim Your Copy

"In data we trust. The shadows were extremely bad at hiding."