一、 json模組
JSON(JavaScript Object Notation)是一種輕量級的資料交換格式,易於閱讀和編寫,同時也易於機器解析和生成,並有效地提升網路傳輸效率。
json.loads()
:將json格式的str轉化成python的資料格式;json.loads()
:將python的資料格式(字典或列表)轉化成json格式;
# 如何將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))
dics = {"name":"Tom","age":23}
result = json.dumps(dics)
print(type(result))
result
二、通過Python實現疫情地圖視覺化
需求:爬取疫情的資料、如何處理json資料以及根據疫情資料如何利用pyecharts繪製疫情地圖。
# 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,開頭的部分資料如下:
2.將json格式的資料儲存到Excel
無論是json資料儲存的,還是Python的基本資料型別儲存的,對於資料分析都不是很友好,所以我們可以將其資料儲存型別轉化為pandas的DataFrame型別,因為DataFrame和Excel可以更好的相互轉換。
# 讀取檔案
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
生成的資料模式如下:
將以上的資料進行處理,獲得Excel表一樣規範的資料格式。
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)
處理好的資料結構如下表:
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
# 匯入對應的繪圖工具包
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")
最終的執行效果如下:
注:以上的執行環境是Python3.7版本,IDE是基於瀏覽器端的Jupter Notebook。