5. 分别聚合每周犯罪和交通事故数据
# 读取crime数据集,行索引设为REPORTED_DATE,对行索引排序
In[95]: crime_sort = pd.read_hdf('data/crime.h5', 'crime') \
.set_index('REPORTED_DATE') \
.sort_index()
# 按季度分组,分别统计'IS_CRIME'和'IS_TRAFFIC'的和
In[96]: crime_quarterly = crime_sort.resample('Q')['IS_CRIME', 'IS_TRAFFIC'].sum()
crime_quarterly.head()
Out[96]:
# 所有日期都是该季度的最后一天,使用QS来生成每季度的第一天
In[97]: crime_sort.resample('QS')['IS_CRIME', 'IS_TRAFFIC'].sum().head()
Out[97]:
# 通过检查第二季度的数据,验证结果是否正确
In[98]: crime_sort.loc['2012-4-1':'2012-6-30', ['IS_CRIME', 'IS_TRAFFIC']].sum()
Out[98]: IS_CRIME 9641
IS_TRAFFIC 5255
dtype: int64
# 用groupby重现上述方法
In[99]: crime_quarterly2 = crime_sort.groupby(pd.Grouper(freq='Q'))['IS_CRIME', 'IS_TRAFFIC'].sum()
crime_quarterly2.equals(crime_quarterly)
Out[99]: True
# 作图来分析犯罪和交通事故的趋势
In[100]: plot_kwargs = dict(figsize=(16,4),
color=['black', 'lightgrey'],
title='Denver Crimes and Traffic Accidents')
crime_quarterly.plot(**plot_kwargs)
Out[100]: <matplotlib.axes._subplots.AxesSubplot at 0x10b8d12e8>
原理
# 如果不选择IS_CRIME和IS_TRAFFIC两列,则所有的数值列都会求和
In[101]: crime_sort.resample('Q').sum().head()
Out[101]:
# 如果想用5月1日作为季度开始,可以使用别名QS-MAR
In[102]: crime_sort.resample('QS-MAR')['IS_CRIME', 'IS_TRAFFIC'].sum().head()
Out[102]:
更多
# 画出犯罪和交通事故的增长率,通过除以第一行数据
In[103]: crime_begin = crime_quarterly.iloc[0]
crime_begin
Out[103]: IS_CRIME 7882
IS_TRAFFIC 4726
Name: 2012-03-31 00:00:00, dtype: int64
In[104]: crime_quarterly.div(crime_begin) \
.sub(1) \
.round(2) \
.plot(**plot_kwargs)
Out[104]: <matplotlib.axes._subplots.AxesSubplot at 0x1158850b8>