5. 分别聚合每周犯罪和交通事故数据

  1. # 读取crime数据集,行索引设为REPORTED_DATE,对行索引排序
  2. In[95]: crime_sort = pd.read_hdf('data/crime.h5', 'crime') \
  3. .set_index('REPORTED_DATE') \
  4. .sort_index()
  1. # 按季度分组,分别统计'IS_CRIME'和'IS_TRAFFIC'的和
  2. In[96]: crime_quarterly = crime_sort.resample('Q')['IS_CRIME', 'IS_TRAFFIC'].sum()
  3. crime_quarterly.head()
  4. Out[96]:

5. 分别聚合每周犯罪和交通事故数据 - 图1

  1. # 所有日期都是该季度的最后一天,使用QS来生成每季度的第一天
  2. In[97]: crime_sort.resample('QS')['IS_CRIME', 'IS_TRAFFIC'].sum().head()
  3. Out[97]:

5. 分别聚合每周犯罪和交通事故数据 - 图2

  1. # 通过检查第二季度的数据,验证结果是否正确
  2. In[98]: crime_sort.loc['2012-4-1':'2012-6-30', ['IS_CRIME', 'IS_TRAFFIC']].sum()
  3. Out[98]: IS_CRIME 9641
  4. IS_TRAFFIC 5255
  5. dtype: int64
  1. # 用groupby重现上述方法
  2. In[99]: crime_quarterly2 = crime_sort.groupby(pd.Grouper(freq='Q'))['IS_CRIME', 'IS_TRAFFIC'].sum()
  3. crime_quarterly2.equals(crime_quarterly)
  4. Out[99]: True
  1. # 作图来分析犯罪和交通事故的趋势
  2. In[100]: plot_kwargs = dict(figsize=(16,4),
  3. color=['black', 'lightgrey'],
  4. title='Denver Crimes and Traffic Accidents')
  5. crime_quarterly.plot(**plot_kwargs)
  6. Out[100]: <matplotlib.axes._subplots.AxesSubplot at 0x10b8d12e8>

5. 分别聚合每周犯罪和交通事故数据 - 图3

原理

  1. # 如果不选择IS_CRIME和IS_TRAFFIC两列,则所有的数值列都会求和
  2. In[101]: crime_sort.resample('Q').sum().head()
  3. Out[101]:

5. 分别聚合每周犯罪和交通事故数据 - 图4

  1. # 如果想用5月1日作为季度开始,可以使用别名QS-MAR
  2. In[102]: crime_sort.resample('QS-MAR')['IS_CRIME', 'IS_TRAFFIC'].sum().head()
  3. Out[102]:

5. 分别聚合每周犯罪和交通事故数据 - 图5

更多

  1. # 画出犯罪和交通事故的增长率,通过除以第一行数据
  2. In[103]: crime_begin = crime_quarterly.iloc[0]
  3. crime_begin
  4. Out[103]: IS_CRIME 7882
  5. IS_TRAFFIC 4726
  6. Name: 2012-03-31 00:00:00, dtype: int64
  7. In[104]: crime_quarterly.div(crime_begin) \
  8. .sub(1) \
  9. .round(2) \
  10. .plot(**plot_kwargs)
  11. Out[104]: <matplotlib.axes._subplots.AxesSubplot at 0x1158850b8>

5. 分别聚合每周犯罪和交通事故数据 - 图6