4. 计算每周的犯罪数
# 读取crime数据集,行索引设定为REPORTED_DATE,然后对行索引排序,以提高后续运算的速度
In[83]: crime_sort = pd.read_hdf('data/crime.h5', 'crime') \
.set_index('REPORTED_DATE') \
.sort_index()
# 为了统计每周的犯罪数,需要按周分组
# resample方法可以用DateOffset对象或别名,即可以在所有返回的对象分组上操作
In[84]: crime_sort.resample('W')
Out[84]: DatetimeIndexResampler [freq=<Week: weekday=6>, axis=0, closed=right, label=right, convention=start, base=0]
# size()可以查看每个分组的大小
In[85]: weekly_crimes = crime_sort.resample('W').size()
weekly_crimes.head()
Out[85]: REPORTED_DATE
2012-01-08 877
2012-01-15 1071
2012-01-22 991
2012-01-29 988
2012-02-05 888
Freq: W-SUN, dtype: int64
# len()也可以查看大小
In[86]: len(crime_sort.loc[:'2012-1-8'])
Out[86]: 877
In[87]: len(crime_sort.loc['2012-1-9':'2012-1-15'])
Out[87]: 1071
# 用周四作为每周的结束
In[88]: crime_sort.resample('W-THU').size().head()
Out[88]: REPORTED_DATE
2012-01-05 462
2012-01-12 1116
2012-01-19 924
2012-01-26 1061
2012-02-02 926
Freq: W-THU, dtype: int64
# groupby方法可以重现上面的resample,唯一的不同是要在pd.Grouper对象中传入抵消值
In[89]: weekly_crimes_gby = crime_sort.groupby(pd.Grouper(freq='W')).size()
weekly_crimes_gby.head()
Out[89]: REPORTED_DATE
2012-01-08 877
2012-01-15 1071
2012-01-22 991
2012-01-29 988
2012-02-05 888
Freq: W-SUN, dtype: int64
# 判断两个方法是否相同
In[90]: weekly_crimes.equals(weekly_crimes_gby)
Out[90]: True
原理
# 输出resample对象的所有方法
In[91]: r = crime_sort.resample('W')
resample_methods = [attr for attr in dir(r) if attr[0].islower()]
print(resample_methods)
['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']
更多
# 可以通过resample方法的on参数,来进行分组
In[92]: crime = pd.read_hdf('data/crime.h5', 'crime')
weekly_crimes2 = crime.resample('W', on='REPORTED_DATE').size()
weekly_crimes2.equals(weekly_crimes)
Out[92]: True
# 也可以通过pd.Grouper的参数key设为Timestamp,来进行分组
In[93]: weekly_crimes_gby2 = crime.groupby(pd.Grouper(key='REPORTED_DATE', freq='W')).size()
weekly_crimes_gby2.equals(weekly_crimes_gby)
Out[93]: True
# 可以很方便地利用这个数据画出线图
In[94]: weekly_crimes.plot(figsize=(16,4), title='All Denver Crimes')
Out[94]: <matplotlib.axes._subplots.AxesSubplot at 0x10b8d3240>