統計911不同月份中不同類型的緊急電話類型

統計911不同月份中不同類型的緊急電話類型

這個數據分析涉及到三個庫,分別是pandas、numpy、matplotlib,這三個庫都是學習數據分析要掌握的庫。

導入庫

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

讀取數據

data = pd.read_csv('I:crack/DATA/911.csv')
pd.set_option('display.max_columns',1000)
pd.set_option('display.max_colwidth',1000)
print(data.info())

這裏的pd.set_option(‘display.max_columns’,1000)和pd.set_option(‘display.max_colwidth’,1000)主要是爲了在顯示的時候讓數據顯示更多,方便我們觀察,不用這兩行代碼也是可以的。
data.info()主要是用來觀察讀取的數據的基本信息,比如有多少列數據,列索引都是什麼,缺失了多少數據,這些都可以很好的展現出來。
這個911的數據csv文件可以從這裏(https://pan.baidu.com/s/1HlOvzj3fAl39I58nJ2V8wQ)提取出來,密碼是:3fyp
或者上kaggle網站中下載(https://www.kaggle.com/mchirico/montcoalert)

時間序列

#把時間那一列的字符串轉化爲時間序列,然後代替時間那列數據
data['timeStamp'] = pd.to_datetime(data['timeStamp'],format="")
#然後重新定義行索引
data.set_index('timeStamp',inplace= True)
#把索引轉化爲月
data_1 = data.resample('M').count()['title']

pandas中的時間序列是一個非常強大的功能,可以製造時間序列,也可以把一些字符串強制轉化爲時間序列,這裏所用到的就是把字符串強制轉化成時間序列,然後採用降採樣的方式來重新定義時間序列,最後代替行索引。

分類統計

group = data.groupby(by = 'time')
x = []
y_1 = []
y_2 = []
y_3 = []
for group_time,group_cate in group:
    print(group_time)
    x.append(group_time)
    group_cate.set_index('time',inplace= True)
    group_cate_1 = group_cate.groupby(by='cate').count()['title']
    y_1.append(group_cate_1[0])
    y_2.append(group_cate_1[1])
    y_3.append(group_cate_1[2])
    print(group_cate_1.index)

這裏用到的是pandas的分類彙總中的groupby,groupby返回的是一個可迭代類型的對象,所以就用循環的方式來提取出分類的值,這裏分別有四個空列表,x列表是用來接收年份的,y_1是來接收統計第一種緊急電話類型在每個月撥打的次數,y_2就是第二種類型,y_3就是第三種。

繪圖

#設置中文字體
plt.rcParams['font.family'] = 'SimHei'
#定義圖片大小
fig,ax = plt.subplots(figsize = (40,8))
#繪圖
plt.xticks(range(len(x)),x,rotation=45)
#設置柱狀圖的寬度
bar_width = 0.3
x_1 = list(range(len(x)))
x_2 = [i + bar_width for i in x_1]
x_3 = [i + bar_width*2 for i in x_1]
rect_1 = plt.bar(x_1,y_1,label=group_cate_1.index[0],width=bar_width)
rect_2 = plt.bar(x_2,y_2,label=group_cate_1.index[1],width=bar_width)
rect_3 = plt.bar(x_3,y_3,label=group_cate_1.index[2],width=bar_width)
plt.legend()
#繪製網格線
plt.grid()

#設置座標
for rect_1s in rect_1:
    height = rect_1s.get_height()
    plt.text(rect_1s.get_x() + rect_1s.get_width()/2,1.03*height,'%s'%float(height),ha='center')

for rect_2s in rect_2:
    heights = rect_2s.get_height()
    plt.text(rect_2s.get_x() + rect_2s.get_width()/2,heights,int(heights),ha='center')

for rect_3s in rect_3:
    heights = rect_3s.get_height()
    plt.text(rect_3s.get_x() + rect_3s.get_width()/2,heights,int(heights),ha='center')
#設置標題
plt.title('統計911不同月份中不同類型的緊急電話類型')
plt.show()

這裏是用條形圖中的柱狀圖繪製,如果不懂繪製柱狀圖,可以參考我的第二篇博客,或者去(https://matplotlib.org/gallery/index.html)網站去查看和學習

源碼

'''
統計911不同月份中不同類型的緊急電話類型
時間序列
creat on April 9,2019
@Author 小明
'''
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

#讀取數據
data = pd.read_csv('I:crack/DATA/911.csv')
pd.set_option('display.max_columns',1000)
pd.set_option('display.max_colwidth',1000)
# print(data.head(1))
print(data.info())

#首先把緊急電話類型提取出來
emergency_data = data['title'].str.split(': ')
emergency_data_1 = list([i[0] for i in emergency_data])
emergency_data_2 = pd.Series(emergency_data_1)
# print(emergency_data_2.value_counts())

#也可以用賦值0和1的方法來統計,先構造全爲零的數組
df_zeor = pd.DataFrame(np.zeros((data.shape[0],len(set(emergency_data_1)))),columns=set(emergency_data_1))
# print(df_zeor)
#然後賦值
for cate in set(emergency_data_1):
    df_zeor[cate][data['title'].str.contains(cate)] = 1
# print(df_zeor.sum())
#把時間那一列的字符串轉化爲時間序列,然後代替時間那列數據
data['timeStamp'] = pd.to_datetime(data['timeStamp'],format="")
#然後重新定義行索引
data.set_index('timeStamp',inplace= True)
# print(data.head(3))

#把索引轉化爲月
data_1 = data.resample('M').count()['title']
# print(data_1)

#把每月每種類型的緊急電話統計起來
#首先把時間提取到月,然後在插入一列爲時間列
time = [i.strftime("%Y-%m") for i in data.index]
data['time'] = time
#在數據後面加一列,數據爲電話類型
data['cate'] = emergency_data_1
# print(data.head(2))

#然後分類統計起來
# print(emergency_count)
# emergency_count_1 = emergency_count.groupby(by=data['cate']).count()
group = data.groupby(by = 'time')
x = []
y_1 = []
y_2 = []
y_3 = []
for group_time,group_cate in group:
    print(group_time)
    x.append(group_time)
    group_cate.set_index('time',inplace= True)
    group_cate_1 = group_cate.groupby(by='cate').count()['title']
    y_1.append(group_cate_1[0])
    y_2.append(group_cate_1[1])
    y_3.append(group_cate_1[2])
    print(group_cate_1.index)
    # print(group_cate_1.values[0])

#設置中文字體
plt.rcParams['font.family'] = 'SimHei'
#定義圖片大小
fig,ax = plt.subplots(figsize = (40,8))
#繪圖
plt.xticks(range(len(x)),x,rotation=45)
#設置柱狀圖的寬度
bar_width = 0.3
x_1 = list(range(len(x)))
x_2 = [i + bar_width for i in x_1]
x_3 = [i + bar_width*2 for i in x_1]
rect_1 = plt.bar(x_1,y_1,label=group_cate_1.index[0],width=bar_width)
rect_2 = plt.bar(x_2,y_2,label=group_cate_1.index[1],width=bar_width)
rect_3 = plt.bar(x_3,y_3,label=group_cate_1.index[2],width=bar_width)
plt.legend()
#繪製網格線
plt.grid()

#設置座標
for rect_1s in rect_1:
    height = rect_1s.get_height()
    plt.text(rect_1s.get_x() + rect_1s.get_width()/2,1.03*height,'%s'%float(height),ha='center')

for rect_2s in rect_2:
    heights = rect_2s.get_height()
    plt.text(rect_2s.get_x() + rect_2s.get_width()/2,heights,int(heights),ha='center')

for rect_3s in rect_3:
    heights = rect_3s.get_height()
    plt.text(rect_3s.get_x() + rect_3s.get_width()/2,heights,int(heights),ha='center')
#設置標題
plt.title('統計911不同月份中不同類型的緊急電話類型')
plt.show()

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章