4. 计算每周的犯罪数

  1. # 读取crime数据集,行索引设定为REPORTED_DATE,然后对行索引排序,以提高后续运算的速度
  2. In[83]: crime_sort = pd.read_hdf('data/crime.h5', 'crime') \
  3. .set_index('REPORTED_DATE') \
  4. .sort_index()
  1. # 为了统计每周的犯罪数,需要按周分组
  2. # resample方法可以用DateOffset对象或别名,即可以在所有返回的对象分组上操作
  3. In[84]: crime_sort.resample('W')
  4. Out[84]: DatetimeIndexResampler [freq=<Week: weekday=6>, axis=0, closed=right, label=right, convention=start, base=0]
  1. # size()可以查看每个分组的大小
  2. In[85]: weekly_crimes = crime_sort.resample('W').size()
  3. weekly_crimes.head()
  4. Out[85]: REPORTED_DATE
  5. 2012-01-08 877
  6. 2012-01-15 1071
  7. 2012-01-22 991
  8. 2012-01-29 988
  9. 2012-02-05 888
  10. Freq: W-SUN, dtype: int64
  1. # len()也可以查看大小
  2. In[86]: len(crime_sort.loc[:'2012-1-8'])
  3. Out[86]: 877
  4. In[87]: len(crime_sort.loc['2012-1-9':'2012-1-15'])
  5. Out[87]: 1071
  1. # 用周四作为每周的结束
  2. In[88]: crime_sort.resample('W-THU').size().head()
  3. Out[88]: REPORTED_DATE
  4. 2012-01-05 462
  5. 2012-01-12 1116
  6. 2012-01-19 924
  7. 2012-01-26 1061
  8. 2012-02-02 926
  9. Freq: W-THU, dtype: int64
  1. # groupby方法可以重现上面的resample,唯一的不同是要在pd.Grouper对象中传入抵消值
  2. In[89]: weekly_crimes_gby = crime_sort.groupby(pd.Grouper(freq='W')).size()
  3. weekly_crimes_gby.head()
  4. Out[89]: REPORTED_DATE
  5. 2012-01-08 877
  6. 2012-01-15 1071
  7. 2012-01-22 991
  8. 2012-01-29 988
  9. 2012-02-05 888
  10. Freq: W-SUN, dtype: int64
  1. # 判断两个方法是否相同
  2. In[90]: weekly_crimes.equals(weekly_crimes_gby)
  3. Out[90]: True

原理

  1. # 输出resample对象的所有方法
  2. In[91]: r = crime_sort.resample('W')
  3. resample_methods = [attr for attr in dir(r) if attr[0].islower()]
  4. print(resample_methods)
  5. ['agg', 'aggregate', 'apply', 'asfreq', 'ax', 'backfill', 'bfill', 'count', 'ffill', 'fillna', 'first', 'get_group', 'groups', 'indices', 'interpolate', 'last', 'max', 'mean', 'median', 'min', 'ndim', 'ngroups', 'nunique', 'obj', 'ohlc', 'pad', 'plot', 'prod', 'sem', 'size', 'std', 'sum', 'transform', 'var']

更多

  1. # 可以通过resample方法的on参数,来进行分组
  2. In[92]: crime = pd.read_hdf('data/crime.h5', 'crime')
  3. weekly_crimes2 = crime.resample('W', on='REPORTED_DATE').size()
  4. weekly_crimes2.equals(weekly_crimes)
  5. Out[92]: True
  1. # 也可以通过pd.Grouper的参数key设为Timestamp,来进行分组
  2. In[93]: weekly_crimes_gby2 = crime.groupby(pd.Grouper(key='REPORTED_DATE', freq='W')).size()
  3. weekly_crimes_gby2.equals(weekly_crimes_gby)
  4. Out[93]: True
  1. # 可以很方便地利用这个数据画出线图
  2. In[94]: weekly_crimes.plot(figsize=(16,4), title='All Denver Crimes')
  3. Out[94]: <matplotlib.axes._subplots.AxesSubplot at 0x10b8d3240>

4. 计算每周的犯罪数 - 图1