通过以下题目进行练习:
现在有2015道2017年40万条911的紧急电话的数据,请统计出这些数据中不同类型的紧急情况的次数,如果我们还想统计出不同月份不同类型紧急电话的次数的变化情况,应该怎么做.
导入模块
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
首先概览数据信息,找到我们需要的信息在哪,经过观察得知数据类型在title列中
df = pd.read_csv('D:/data/911.csv')
print(df.head(5)["title"])
print(df.info())
接下来对取title列,对其进行切片并且剔除所有重复类型
temp_list = df["title"].str.split(":").tolist()
cate_list = list(set([i[0] for i in temp_list]))
第一种方法:
# 构造全为0的数组
dn = pd.DataFrame(np.zeros((df.shape[0], len(cate_list))), columns=cate_list)
# print(dn)
# 只需要循环三次,如果对dn遍历需要40W+次,会很慢
for cate in cate_list:
# dn[df["title"].str.contains(cate)][cate] = 1
dn.loc[df["title"].str.contains(cate), cate] = 1
print(dn.sum(axis=0))
第二种方法:
在原有数据中添加一列cate,再采用分组,聚合求和的方式求各类总数
temp_list = df["title"].str.split(":").tolist()
cate_list = [i[0] for i in temp_list]
df["cate"] = pd.DataFrame(np.array(cate_list).reshape((df.shape[0], 1)))
# print(df.info())
print(df.groupby(by="cate").count()["title"])
第三种方法:
temp_list = df["title"].str.split(":").tolist()
# 该方法会遍历40W+次,效率极低
for i in range(df.shape[0]):
dn.loc[i, temp_list[i][0]] = 1
print(dn.sum(axis=0))
在对以上三种方法计时后得到:
第一种方法: 3.36s
第二种方法: 2.69s
第三种方法: 55.69s
记下来计算每个月发生的次数
df = pd.read_csv('D:/data/911.csv')
# n为切割次数
month = df["timeStamp"].str.rsplit("-", n=1).tolist()
# print(month)
month_list = [i[0] for i in month]
df["month"] = pd.DataFrame(np.array(month_list).reshape((df.shape[0], 1)))
# print(df.info())
print(df.groupby(by="month").count()["title"])
实际上pandas中有时间序列,可以更好的处理这种时间戳.
df = pd.read_csv('D:/data/911.csv')
# print(df.info())
# 将字符串转化为时间序列
df["timeStamp"] = pd.to_datetime(df["timeStamp"])
# 设置timeStamp为索引,不删除原timeStamp列
df.set_index("timeStamp", inplace=True)
# 对时间序列以月份进行重采样,结果形式类似于groupby
month_count = df.resample("M").count()["title"]
plt.figure(figsize=(20, 8), dpi=80)
_x = month_count.index
_y = month_count.values
# _x中时间序列有时分秒,将其重新格式化
_x2 = [i.strftime('%Y-%m-%d') for i in _x]
plt.plot(range(len(_x2)), _y)
plt.xticks(range(len(_x2)), _x2, rotation=45)
plt.savefig('./2.png')
plt.show()
接下来统计不同月份不同类型事件的变化情况.
df = pd.read_csv('D:/data/911.csv')
# 添加事件列
temp_list = df["title"].str.split(":").tolist()
cate_list = [i[0] for i in temp_list]
df["cate"] = pd.DataFrame(np.array(cate_list).reshape((df.shape[0], 1)))
# 将timeStamp转化为时间序列并设置为索引
df["timeStamp"] = pd.to_datetime(df["timeStamp"])
df.set_index("timeStamp", inplace=True)
# 对事件类型分组,得到的groups格式为 [[group_name, group_data],[]...]
groups = df.groupby(by="cate")
plt.figure(figsize=(20, 8), dpi=80)
#
for group_name, group_data in groups:
cate_count = group_data.resample("M").count()["title"]
x = cate_count.index
y = cate_count.values
_x = [i.strftime('%Y-%m-%d') for i in x]
plt.plot(range(len(x)), y, label=group_name)
plt.xticks(range(len(_x)), _x, rotation=45)
plt.legend(loc="best")
plt.savefig('./3.png')
plt.show()