What the dashboard includes
The main source is the Philadelphia Police Department (PPD) shooting-victim dataset. One incident may produce several records. The dashboard includes only rows marked N (“No”) in the source's officer-involved field. Officer-involved records remain available in the City source but are excluded from this project.
The resulting counts describe the records in that dataset after this exclusion. They should not be read as a count of every incident involving a firearm or as a complete measure of firearm-related harm in Philadelphia.
PPD homicide statistics cover all homicides citywide, whether or not a gun was involved. The dashboard reports them separately from shooting-victim records.
For each police incident number, the project runs an automated search of the Pennsylvania Unified Judicial System (UJS) public court portal. It records whether the search returned a result but does not copy case details into the dashboard.
From source to dashboard
Four stages prepare a new version of the data. The previously published version remains available unless every stage succeeds.
Collect
On a schedule, the system retrieves shooting-victim records and homicide totals from their public sources and runs automated searches of the UJS public court portal. Geographic reference files are refreshed separately.
Prepare
The system standardizes dates and categories, checks and supplements coordinates, adds geographic fields, estimates street and block fields, and adds a court-search flag.
Check
Automated checks confirm required fields and valid output, then compare the newest date, record count, and fatal-record count with the current published version. A failed check stops publication.
Publish
Only a version that passes the checks replaces the dashboard's current data. The published files include source dates so readers can see how current each measure is.
Important transformations
| Field or issue | Treatment |
|---|---|
| Date and time | Dates are standardized. A missing source time is stored as midnight, so a midnight value should not always be interpreted as the exact time. Records dated in the future at the time of processing are excluded. |
| Fatal outcome | Accepted values from the PPD fatal field are converted to true or false. Missing or unrecognized values stop publication rather than being assigned a category. |
| Race and ethnicity | The source's Latino indicator is combined with the source race field. Values outside the displayed categories are grouped as Other/Unknown. The dashboard does not independently verify these source fields. |
| Age group | Ages are grouped as younger than 18, 18–30, 31–45, older than 45, or unknown. |
| Point validation and backfill | A source point is checked against Philadelphia's boundary. If the point is missing or outside that boundary, the system looks for a PPD crime-incident record with the same incident number and uses its coordinates when available. |
| Records without coordinates | Records that still lack usable coordinates remain in totals and downloadable files but do not appear on the point map or in geographic summaries. |
| Street and block fields | The fields come from a nearest-street comparison. When the comparison returns more than one candidate, the system prefers a matching hundred-block number; otherwise it uses the nearest segment. There is no maximum distance. These fields are approximations, not verified addresses. |
| Geographic districts | ZIP code, neighborhood, police and City Council districts, state legislative districts, and school catchment are joined from public boundary files when a record has usable coordinates. A boundary can be missing even when the point can be mapped. |
| Court search | An automated search checks the UJS public portal using the PPD incident number. The published field records only whether that search returned a result at the time it was run. |
Quality checks and revisions
Before a new version is published, automated checks reject empty source responses, missing required fields, unsupported outcome values, dates that move backward, and implausible changes in the total number of records or fatal records. Each output row must also match the expected field types.
If a check fails, publication stops and the last version that passed remains available. These checks are designed to catch processing and source-format failures; they do not confirm every fact in an individual record.
PPD can add, remove, or revise preliminary records after their first publication. A data-through date identifies the most recent event date in the version loaded by the dashboard. It does not guarantee that every event through that date has already been entered or will remain unchanged.
How to interpret the data
- The map and geographic totals are not population-adjusted rates. When comparing places, consider population, the time period, and records that could not be assigned usable coordinates.
- The dashboard does not routinely shift coordinates published by the source. Some locations are missing or imprecise, and a mapped point or estimated street field should not be treated as a verified address.
- Locations and reported demographic categories can help describe patterns in the records. They do not explain causes, neighborhood conditions, or a person's circumstances, and they should not be used to make claims about an individual.
- A positive court-search flag means only that the automated UJS search returned a result for the PPD incident number. It does not identify a defendant, establish a charge or disposition, or show how a court record relates to a particular victim. A negative flag does not prove that no case exists; records may be delayed, unavailable, or unmatched.
Code and reproducibility
The project repository contains the processing code, schemas, and automated checks. The data page provides downloadable records and field definitions. To report a possible data or documentation problem, see Corrections.