Tap dates to add or remove them. Tap a weekday letter to select every remaining date with that weekday this month.
Forecast details
Tap any pin on the map to see the full forecast for that spot.
Forecasted locations, ranked
Measured model accuracy
Computed after the model is fitted.
How the forecast works
Data. Every geocoded Dallas Police Department incident report the city publishes — the whole record, back to 2014, not a recent slice — pulled live from the City of Dallas open-data portal (dataset qv6i-rri7, updated daily). Non-criminal records such as traffic stops and warnings are excluded, and the duplicate rows DPD creates for multiple victims of one report are collapsed. It is a large download the first time; after that it is cached in your browser for six hours.
Model. Dallas is divided into square cells (150 m by default). In each cell the crime rate at time t is modeled as a self-exciting point process — the same family of model used in published predictive-policing field trials (Mohler et al., 2011 and 2015):
lambda(t) = mu · w(hour of week) + SUM theta · omega · exp(-omega(t - t_i))
- mu – the cell's underlying rate, separated from short-term flare-ups by expectation-maximization, with older reports discounted on their own slow half-life so a block that went quiet a year ago is not treated as still hot.
- w – the cell's own 168-hour weekly rhythm, shrunk toward the citywide rhythm in proportion to how little data that cell has.
- theta, omega – the near-repeat effect: how many follow-on incidents each incident triggers, and how fast that elevated risk decays.
Nothing is hand-picked. Every parameter is estimated from the data itself. The near-repeat half-life, how fast the background forgets, the weekly-rhythm shrinkage and the neighbour smoothing are all chosen by holding back the most recent 7 days, fitting on everything before them, and keeping whatever best predicted the held-back week. That week is scored one incident at a time in the order they happened, so the model is judged the way it is actually used — forecasting the next few hours knowing every crime reported up to that moment. The model is then refit on the full record for your forecast.
Time and day drive the answer. Your window is converted into an exposure vector over the 168 hours of the week, and each cell is scored against its own hour-of-week profile — so a Saturday 2 AM pick and a Tuesday 9 AM pick rank different places, not the same list reshuffled. The offense named on each pin is worked out the same way, from the incidents that actually happened near that hour of that weekday, with recent ones weighted more heavily.
Reading the output. Pins are ranked by probability, highest first, and the slider sets how far down that ranking to go — at its strictest only the single likeliest spot is pinned. Each pin sits on the most frequently reported address inside its cell. The percentage is the model's probability that at least one incident is reported in that cell during your window; pin color shows how many times riskier the cell is than the average cell that has recorded crime.
Limits, stated plainly. No method can say a crime will happen at an exact spot and minute. This is a calibrated probability, and its real hit rate on data it never saw is shown in the accuracy panel above. It reflects reported crime only, so under-reporting and patrol patterns shape it. DPD geocodes to the block address, and the newest few days of reports are still arriving. It describes places, never people.