We’ve created an interactive dashboard that explores Berlin’s covid profile and evolution by district. It was borne out of the fact that I, along with other Berliners, have friends and colleagues scattered across districts and needed a way to understand, visualize, and explore covid epidemiology on a district level.
The purpose of this dashboard is to help fellow Berliners make more informed personal decisions and policymakers and health agencies allocate resources. It includes rolling 7-day average number of cases, statistical spread of daily incidence, average daily incidence, and an average daily incidence map. Users can dig deeper by selecting start and end dates and using hover, box & lasso select, zoom, and download tooltips.
Daily district-level confirmed case data was scraped from Das Landesamt für Gesundheit und Soziales. Demographic data by district, used to calculate incidence per 100,000, was scraped from Wikipedia. While population data dates from the last census in Germany in 2010 and Berlin’s population has grown dramatically since then, it’s sufficient for the purpose here of calculating an approximate incidence to make comparisons. Not factored in are exogenous variables like increased testing and the fact that the true positivity rate in the population may be much higher than that indicated by confirmed positive tests.
High level takeaways:
1) Overall 7-day average number of cases have improved since November 17, 2020 (‘lockdown lite’ began on October 26, 2020), though they’ve ticked up again since December 3, 2020 (a hard lockdown was reinstated on December 16, 2020)
2) Berlin’s recent rolling 7-day averages of confirmed cases is roughly 6x of the peak of the 1st wave in late March. The highest case averages are in Mitte, Neukolln, Tempelhof-Schoneberg, and Friedrichshain-Kreuzberg.
3) Mitte, Friedrichshain-Kreuzberg, and Neukolln feature the highest 7-day average incidence (per 100,000) IQR and most higher-end outliers. Pankow, Charlottenburg-Wilmersdorf, Treptow-Kopenick, Steglitz have a lower median and spread (tighter distribution). Spandau has picked up in the past few weeks as a growing hotspot in terms of covid incidence.
4) Taken together, Mitte and Neukolln, even accounting for differences in population (though we don’t incorporate population density), have fared worse than districts like Pankow, which includes Prenzlauer Berg, and Charlottenburg-Wilmersdorf.
Code with explanatory notes and requirements for both the covid scrape and dashboard are on our Git.
Additionally, when deploying to Heroku, I spent many hours on failed attempts, debugging using heroku log –tail, and figuring out different pip installs before I got it to work. For first-timers, I’ve put together a list of steps (that aren’t always clear or obvious from Heroku’s or plotly dash’s existing documentation) in a google doc on deploying to Heroku (the packages I installed are specific to this covid dashboard). Hope this saves you time if you’re deploying an app of your own!
If you found this helpful and want to learn more, give us a shout at info@crawstat.com!




