Police, Crime in US
People Shot By the Police
Data is from WaPo Github repo.
All Deaths by Police Shootings, by Race
import pandas as pd
f = 'https://raw.githubusercontent.com/washingtonpost/data-police-shootings/master/v2/fatal-police-shootings-data.csv'
df = pd.read_csv(f)
df['year'] = pd.to_datetime(df['date']).dt.year
df['race'] = df['race'].fillna('O')
g = df.groupby(['year','race']).size().reset_index()
g = g.set_index(['year','race']).unstack(level=1)[0]
g.plot.bar(stacked=True)
plt.savefig('allshoot.png')
A: Asian, B: Black, H: Hispanic, N: Native Am, O: Other, W: White

Unarmed People Shot by the Police
df = pd.read_csv(f)
df['year'] = pd.to_datetime(df['date']).dt.year
df1 = df[(df.race != 'W') & (df.armed == 'unarmed')]
df1.groupby('year').size().plot()
df2 = df[(df.race == 'W') & (df.armed == 'unarmed')]
df2.groupby('year').size().plot()
plt.legend(['Non-white','White'])
plt.savefig('unarmed.png')

US Gun Violence
Data came from the Gun Violence Archive, see data for "mass shootings - all years". Plot is monthly incidents and deaths.
import pandas as pd, zipfile
pd.set_option('display.max_columns', None)
df = pd.read_csv('us-mass-shootings.csv')
df['Date'] = df.apply(lambda x: pd.to_datetime(x['Incident Date']), axis=1)
df['DateYM'] = df.apply(lambda x: "%d%02d" % (x['Date'].year, x['Date'].month), axis=1)
g = df.groupby('DateYM').agg({'Incident ID':'count', 'Victims Killed': 'sum'})
g['# Killed (Avg)'] = g['Victims Killed'].rolling(10).mean()
g = g.interpolate(limit_direction='both')
g = g.rename(columns={"Incident ID": "Incidents"})
print (g.tail(5))
g.plot()
plt.savefig('gunvio.png')
Incidents Victims Killed # Killed (Avg)
DateYM
202304 56 64 58.3
202305 79 80 60.1
202306 67 60 60.2
202307 86 70 62.2
202308 52 43 58.4

FBI Crime Data, UCR
The FBI site [4] and data.gov API publishes crime data. Data from the
first the so-called "Table 8" is for 1999-2019. The rest from the API,
see the zip below [3]. The xls to csv conversion code is in util.py.
In order to retrieve an entire year from the API data is retrieved for
each agency (PDs), the master list is in agencies.csv. Sign-up and
get the key [2].
Example,
import requests, json
agency = "AL0010100" # Bessemer Police Department
year = 2019
key = open("../../0119/2019/05/.key/.datagov").read()
url = "https://api.usa.gov/crime/fbi/sapi/api/summarized/agencies/%s/offenses/%d/%d?api_key=%s" % (agency,year,year,key)
response = requests.get(url)
res = json.loads(response.text)
res['results'][0]
Out[1]:
{'ori': 'AL0010100',
'data_year': 2019,
'offense': 'aggravated-assault',
'state_abbr': 'AL',
'cleared': 3,
'actual': 319,
'data_range': None}
res['results'][1]
Out[1]:
{'ori': 'AL0010100',
'data_year': 2019,
'offense': 'arson',
'state_abbr': 'AL',
'cleared': 0,
'actual': 0,
'data_range': None}
Crime Rates
import fbi
df = fbi.crime_annual_summary(['homicide','rape','robbery','aggravated-assault'])
df.rate.plot(title='US Crime Rate Per 100k People')
plt.savefig('rate1.png')

df = fbi.crime_annual_summary(['burglary','larceny','motor-vehicle-theft','arson'])
df.rate.plot(title='US Crime Rate Per 100k People')
plt.savefig('rate2.png')

References
[1] FBI
[2] Data.gov signup
[3] Data (zip, 10 MB)