1. 程式人生 > >【實戰】通過Python實現疫情地圖視覺化

【實戰】通過Python實現疫情地圖視覺化

[TOC](Python實現疫情地圖視覺化) ### 一、 json模組        JSON(JavaScript Object Notation)是一種輕量級的資料交換格式,易於閱讀和編寫,同時也易於機器解析和生成,並有效地提升網路傳輸效率。 - `json.loads()`:將json格式的str轉化成python的資料格式; - `json.loads()`:將python的資料格式(字典或列表)轉化成json格式; ```python # 如何將json資料解析成我們所熟悉的Python資料型別? import json # 將json格式的str轉化成python的資料格式:字典 dic = json.loads('{"name":"Tom","age":23}') res = json.loads('["name","age","gender"]') print(f'利用loads將json字串轉化成Python資料型別{dic}',type(dic)) print(f'利用loads將json字串轉化成Python資料型別{res}',type(res)) ``` ![在這裡插入圖片描述](https://img2020.cnblogs.com/blog/2048016/202102/2048016-20210203195348731-939573102.png) ```python dics = {"name":"Tom","age":23} result = json.dumps(dics) print(type(result)) result ``` ![在這裡插入圖片描述](https://img2020.cnblogs.com/news/2048016/202102/2048016-20210203195349031-1220408579.png) ### 二、通過Python實現疫情地圖視覺化 > 需求:爬取疫情的資料、如何處理json資料以及根據疫情資料如何利用pyecharts繪製疫情地圖。 ![在這裡插入圖片描述](https://img2020.cnblogs.com/blog/2048016/202102/2048016-20210203195349297-1253094891.png) ![在這裡插入圖片描述](https://img2020.cnblogs.com/blog/2048016/202102/2048016-20210203195349786-3024834.png) ```python # 1.資料的獲取(基於request模組) import requests import json # 國內疫情資料 China_url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5' headers = { # 瀏覽器偽裝 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36', 'referer': 'https://news.qq.com/', } # 發起get請求,獲取響應資料 response = requests.get(China_url,headers=headers).json() data = json.loads(response['data']) # 儲存資料 with open('./2021-02-03國內疫情.json','w',encoding='utf-8') as f: # 不採用ASCII編碼 f.write(json.dumps(data,ensure_ascii=False,indent=2)) ``` 爬取的資料儲存格式為json,開頭的部分資料如下: ![在這裡插入圖片描述](https://img2020.cnblogs.com/news/2048016/202102/2048016-20210203195350218-1616622496.png) #### 2.將json格式的資料儲存到Excel         無論是json資料儲存的,還是Python的基本資料型別儲存的,對於資料分析都不是很友好,所以我們可以將其資料儲存型別轉化為pandas的DataFrame型別,因為DataFrame和Excel可以更好的相互轉換。 ```python # 讀取檔案 with open('./2021-02-03國內疫情.json','r',encoding='utf-8') as f: data = f.read() # 將資料轉成Python資料格式(字串轉換為字典) data = json.loads(data) # 1.獲取資料最新的更新時間 lastUpdateTime = data['lastUpdateTime'] # 2.獲取國內的所有疫情相關的資料 chinaAreaDict = data['areaTree'] # 3.獲取省級資料 provinceList = chinaAreaDict[0]['children'] # 將國內資料按城市封裝 china_citylist = [] for x in range(len(provinceList)): province = provinceList[x]['name'] province_list = provinceList[x]['children'] for y in range(len(province_list)): # 每一個地級市的資料 city = province_list[y]['name'] total = province_list[y]['total'] today = province_list[y]['today'] china_dict = {'province':province, 'city':city, 'total':total, 'today':today} china_citylist.append(china_dict) china_citylist ``` **生成的資料模式如下:** ![在這裡插入圖片描述](https://img2020.cnblogs.com/blog/2048016/202102/2048016-20210203195350431-1686847294.png) 將以上的資料進行處理,獲得Excel表一樣規範的資料格式。 ```python import pandas as pd chinaTotalData = pd.DataFrame(china_citylist) # 將整體資料chinaTotalData中的today和total資料新增到DataFrame中 # 處理total字典裡面的各個資料項 # ====================================================================== confirmlist = [] suspectlist = [] deadlist = [] heallist = [] deadRatelist = [] healRatelist = [] # print(chinaTotalData['total'].values.tolist()[0]) for value in chinaTotalData['total'].values.tolist(): confirmlist.append(value['confirm']) suspectlist.append(value['suspect']) deadlist.append(value['dead']) heallist.append(value['heal']) deadRatelist.append(value['deadRate']) healRatelist.append(value['healRate']) chinaTotalData['confirm'] = confirmlist chinaTotalData['suspect'] = suspectlist chinaTotalData['dead'] = deadlist chinaTotalData['heal'] = heallist chinaTotalData['deadRate'] = deadRatelist chinaTotalData['healRate'] = healRatelist # =================================================================== # 建立全國today資料 today_confirmlist = [] today_confirmCutslist = [] for value in chinaTotalData['today'].values.tolist(): today_confirmlist.append(value['confirm']) today_confirmCutslist.append(value['confirmCuts']) chinaTotalData['today_confirm'] = today_confirmlist chinaTotalData['today_confirmCuts'] = today_confirmCutslist # ================================================================== # 刪除total、today兩列 chinaTotalData.drop(['total','today'],axis=1,inplace=True) chinaTotalData.head() # 將其儲存到Excel中 chinaTotalData.to_excel('2021-02-03國內疫情.xlsx',index=False) ``` **處理好的資料結構如下表:** ![在這裡插入圖片描述](https://img2020.cnblogs.com/blog/2048016/202102/2048016-20210203195350707-474874664.png) #### 3.應用pyecharts進行資料視覺化         `pyecharts`是一款將python與echarts結合的強大的資料視覺化工具。繪製出來的圖比Python的Matplotlib簡單美觀。使用之前需要在Python環境中按照pycharts。在終端中輸入命令:`pip install pyecharts` **利用pyecharts繪製疫情地圖**         根據上面的疫情資料,我們可以利用其畫出全國的疫情地圖 在繪製前,我們需要安裝echarts的地圖包(可根據不同的地圖需求進行安裝) - `pip install echarts-countries-pypkg` - `pip install echarts-china-provinces-pypkg` - `pip install echarts-china-cities-pypkg` - `pip install echarts-china-misc-pypkg` - `pip install echarts-china-countries-pypkg` - `pip install echarts-united-kingdom-pypkg` ```python # 匯入對應的繪圖工具包 import pandas as pd from pyecharts import options as opts from pyecharts.charts import Map df = pd.read_excel('./2021-02-03國內疫情.xlsx') # 1.根據繪製國內總疫情圖(確診) data = df.groupby(by='province',as_index=False).sum() data_list = list(zip(data['province'].values.tolist(),data['confirm'].values.tolist())) # 資料格式[(黑龍江,200),(吉林,300),...] def map_china() -> Map: c = ( Map() .add(series_name="確診病例",data_pair=data_list,maptype='china') .set_global_opts( title_opts = opts.TitleOpts(title='疫情地圖'), visualmap_opts=opts.VisualMapOpts(is_piecewise=True, pieces = [{"max":9, "min":0, "label":"0-9","color":"#FFE4E1"}, {"max":99, "min":10, "label":"10-99","color":"#FF7F50"}, {"max":499, "min":100, "label":"100-4999","color":"#F08080"}, {"max":999, "min":500, "label":"500-999","color":"#CD5C5C"}, {"max":9999, "min":1000, "label":"1000-9999","color":"#990000"}, {"max":99999, "min":10000, "label":"10000-99999","color":"#660000"},] ) ) ) return c d_map = map_china() d_map.render("mapEchrts.html") ``` **最終的執行效果如下:** ![在這裡插入圖片描述](https://img2020.cnblogs.com/news/2048016/202102/2048016-20210203195350998-1028424323.png) > 注:以上的執行環境是Python3.7版本,IDE是基於瀏覽器端的Jupter Note