数据可视化实战,画个新冠肺炎地图
本文來源于和鯨社區,作者王大毛
文中涉及數據集下載地址:
https://www.kesci.com/home/project/5e426eb4b8c462002d69c1c9/dataset?
導入庫 導入數據 import pandas as pd import matplotlib.pyplot as plt import folium import folium.plugins as plugins import numpy as np import datetimedata= pd.read_csv("/home/kesci/input/2019ncov5600/2019_nCoV_data.csv") print(data.head()) print(data.info())一、數據清洗
1.Sno編號列沒有用,要刪去
data.drop(['Sno'],axis=1,inplace=True);2.部分國家對應的地區為NAN,需要填充為空白字符串
data['Province/State'].fillna('',inplace=True)3.部分國家/地區,受感染人數為0,也被列在表格中,需要刪去
data.drop(data[data['Confirmed']==0].index.to_list(),axis=0,inplace=True)4.查看受影響的國家/地區的數量
countries = data['Country'].unique().tolist()print(countries)5.中國有China, Mainland China兩個寫法,需要統一;另外還有一些你懂的問題需要修正
data['Country'].replace({'Mainland China':'China','Hong Kong':'China','Macau':'China','Taiwan':'China'},inplace=True)countries = data[data['Confirmed']!=0]['Country'].unique().tolist() print('迄今為止,受影響的國家/地區:',countries) print('迄今為止,受影響的國家/地區個數:',len(countries))二、取出最新數據
觀察后發現,這個原始表格每天會把最新的數據更新在表格最后,而且,并不是每天每個國家都會更新數據。所以,需要篩選出每個國家的最新數據
5.將Date轉化為datetime格式,方便操作后面進行時間的比較
data['Date'] = data['Date'].apply(pd.to_datetime) data.head()6.按國家+城市字段分組,方便進行時間上的篩選
grouped = data.groupby(['Country','Province/State'])7.選出每個國家/城市最新的數據
latest = grouped['Date'].idxmax() data_latest = data.loc[latest]data_latest.head()又發現一個問題,比如Australia,一開始是以國家為單位報數據,之后又分成小區域報數據,會導致計算重復,所以要刪除這部分數據。也不能直接刪,因為不知道有多少國家的數據有這個問題。
8.篩選出國家對應的城市字符串為空,且該國家下的城市(包括空字符串)數量大于一 的數據
useless=data_latest[(data_latest['Province/State']=='') &(data_latest['Country'].apply(lambda x:data_latest['Country'].value_counts()[x])>1)].index.to_list()useless9.刪除這些數據
data_latest.drop(useless,inplace=True)三、簡單的可視化
10.查看各個國家總感染數據
world_cases = data_latest.groupby(['Country'])['Confirmed','Deaths','Recovered'].sum().sort_values(by='Confirmed', ascending=False) world_cases11.可視化以上數據,因為中國的確診數量太大,故不放在圖片里
plt.figure(figsize=(12, 8))plt.barh(y=world_cases[1:].index,width=world_cases['Confirmed'][1:],color='lightcoral')?讀入坐標數據
world_coordinates = pd.read_csv('/home/kesci/input/2019ncov5600/world_coordinates.csv')12.將坐標數據與國家感染數據合并
world_data = pd.merge(world_coordinates,world_cases,on='Country').sort_values(by='Confirmed', ascending=False) world_data13.用folium創建一個初始地圖,中心點(35,0),縮放2.3
world_map = folium.Map(location=[35, 0], zoom_start=2.3) world_map14.先嘗試在地圖上畫出中國的點
15.了解套路之后,用for畫出剩余的圓圈
?16.查看中國的各地區的數據
china_cases=data_latest[data_latest['Country']=='China'].sort_values(by='Confirmed', ascending=False) china_cases.head()17.畫出出湖北外確診病例的餅圖
explode =np.hstack((np.zeros(10),np.linspace(0,3,len(china_cases)-11)))plt.figure(figsize=(12, 8))plt.pie(china_cases['Confirmed'][1:],labels=china_cases['Province/State'][1:],autopct='%1.1f%%',explode=explode);?18.畫出除湖北外確診和痊愈的數據
plt.figure(figsize=(12, 8)) plt.barh(width="Confirmed", y="Province/State", data=china_cases[1:], color="lightcoral"); plt.barh(width="Recovered", y="Province/State", data=china_cases[1:], color="palegreen");?讀取中國的坐標數據集
china_coordinates= pd.read_csv("/home/kesci/input/2019ncov5600/china_Province_coordinates.csv") china_coordinates.head()19.坐標數據集中,name3要和Province/State匹配,所以要改個名字。以及,原表格Province/State有大寫,要處理成全部小寫
china_coordinates.rename(columns={'name3':'Province/State'},inplace=True) china_cases['Province/State']=china_cases['Province/State'].map(lambda x:x.lower())20.兩個表格數據匹配
china_data = china_cases.merge(china_coordinates) china_data.head()21.畫出中國的感染分布,先畫一個背景,中心點(39.91666667,116.383333),基礎縮放4
latitude = 39.91666667 longitude = 116.383333china_map1 = folium.Map(location=[latitude, longitude], zoom_start=4) china_map122.畫出武漢的數據
23.畫其他省市的數據
四、復雜的可視化
這部分我們要做個動態的地圖
先讀取另一份顆粒度細一點兒的數據
china_history=pd.read_csv('/home/kesci/input/ncov6321/DXYArea.csv') china_history.head()24.再來一套和之前差不多的操作,丟掉province_confirmedCount, province_suspectedCount, province_curedCount, province_deadCount四列數據
china_history.drop(['province_confirmedCount','province_suspectedCount','province_curedCount','province_deadCount'],axis=1,inplace=True)25.將updateTime轉換成date格式,就是只保留日期部分
china_history['updateTime']=china_history['updateTime'].apply(pd.to_datetime).dt.date因為涉及到后面要匹配城市名字和坐標數據集的問題,所以現在要分幾部分修改一些城市(區域)的寫法
26.因為大部分城市都沒有加“市”字,所以,要把直轄市的下屬區的“區”字去掉。另外,這幾個直轄市有時加“區”有時不加,所以需要判定一下(以下就寫了上海市的)
china_history.loc[china_history['provinceName'] == '上海市','cityName'] = china_history[china_history['provinceName'] == '上海市']['cityName'].apply(lambda x: x[0:len(x)-1] if len(x)>2 else x)還有一些沒有變化規律的城市名字,互聯網民工手動整理出來了,是個叫city_rename的字典
city_rename= {'恩施州':'恩施土家族苗族自治','神農架林區':'神農架林',...'麗江市':'麗江'}27.這部分沒有規律的名字也同樣需要修改
china_history['cityName']=china_history['cityName'].apply(lambda x:city_rename[x] if x in city_rename else x)讀入詳細坐標數據集
china_coor2=pd.read_csv('/home/kesci/input/chinacoor9160/china_coordinates.csv',header=None) china_coor2.head()28.因為坐標集沒帶標題,所以要給標題重命名,順便將城市名列改成和前面一致
china_coor2.rename(columns={0:'code',1:'cityName',2:'lon',3:'lat'},inplace=True)29.因為前面感染數據的表格,城市名后面都沒有帶“市”“區”,所以統一給去掉
china_coor2['cityName']=china_coor2['cityName'].apply(lambda x:x[0:len(x)-1]) china_coor2.head()30.2個表格合并
china_history_data=china_history.merge(china_coor2) china_history_data.head()這里開始做動態地圖需要的數據。需要構造一個三維數組,形如[[[Y1,X1,W1],...,[Y1,X1,W1]],[[Y1,X1,W1],...,[Y1,X1,W1]],...,[[Y1,X1,W1],...,[Y1,X1,W1]]],最外面一層是時間,每一層時間里面包含一堆數據點,每個數據點里面是坐標+數值。
31.篩出時間幀
update_time=china_history_data['updateTime'].unique()32.用for循環構造出三維的數組
data_move=[]for i in update_time[::-1]:tmp_pd=china_history_data[china_history_data['updateTime']==i]data_move.append(tmp_pd[['lat','lon','city_confirmedCount']].values.tolist())33.再開個新地圖,將剛剛構造的數組傳給folium的HeatMapWithTime,并設置auto_play=True
m=folium.Map(location=[latitude, longitude], zoom_start=4) plugins.HeatMapWithTime(data_move[:15],auto_play=True).add_to(m) m往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習在線手冊深度學習在線手冊AI基礎下載(pdf更新到25集)本站qq群1003271085,加入微信群請回復“加群”獲取一折本站知識星球優惠券,請回復“知識星球”喜歡文章,點個在看
總結
以上是生活随笔為你收集整理的数据可视化实战,画个新冠肺炎地图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 50题真 • 一文入门TensorFlo
- 下一篇: 疫情数据可视化讨论,作为数据分析师的我真