如何利用Python製作新型冠狀病毒省份(直轄市)實時疫情圖?

如何利用Python製作新型冠狀病毒省份(直轄市)實時疫情圖?

一.數據採集
先找到數據,對數據進行數據採集
數據來源:新浪疫情實時監測
URL: https://news.sina.cn/zt_d/yiqing0121
數據採集:
1.訪問https://news.sina.cn/zt_d/yiqing0121
2.打開Chrome開發者工具,點開network,刷新頁面,點擊各個請求,找到獲取取json的請求。
例如:附圖
https://interface.sina.cn/news/wap/fymap2020_data.d.json?1581410367084&&callback=sinajp_15814103671094932140955446096

 

返回的數據類型:

Headers:
Genneral
   Request URL: https://interface.sina.cn/news/wap/fymap2020_data.d.json?1581410367084&&callback=sinajp_15814103671094932140955446096
   Request Method: GET
   Status Code: 200 
   Remote Address: 39.156.6.163:443
   Referrer Policy: unsafe-url
Response Headers
   content-type: text/html

返回的數據顯示:

City中,cureNum是治癒數,deathNum是死亡人數。value是確診數

數據處理:
用到以下幾個模塊
1.requests模塊 (用於網頁訪問)
2.re模塊 (用於正則表達式,處理數據時需要)
3.json模塊,讀取數據
4.圖表地圖模塊:pyecharts
  數據包:echarts-china-provinces-pypkg
  數據包:echarts-china-cities-pypkg
(用pip安裝requests,pyecharts以及兩個數據包),例如:pip install pyecharts

三.數據處理代碼

說明:響應返回數據包含一個js變量需要用正則處理,然後用python自帶的json.loads方法轉爲dict

import requests
import re
import json
from pyecharts.charts import Map,Geo
from pyecharts import options as opts
import time

 


result =requests.get('https://interface.sina.cn/news/wap/fymap2020_data.d.json?1581320668601&&callback=sinajp_15813206686216973498593035714')

 

json_str = re.search("\(+([^)]*)\)+",result.text).group(1)

 

html =f"{json_str}"
json_data=json.loads(f"{html}")

 

 

 

 

 

 

 

 

 

生成地圖代碼:

For循環遍歷json數據,把省名和確診數存在data數據裏傳給map對象。

data=[]
value_hb=""
rdate=time.strftime('%Y-%m-%d',time.localtime(time.time()))
rtime=time.strftime('%Y%m%d%H%M%S',time.localtime(time.time()))
#for p in table['data']['list']:
for province in json_data['data']['list']:
    #print (province)
    #data.append((province['name'], province['value']))
    if province['name']=="湖北":
      name=province['name']
      value_hb=province['value']
      deathNum=province['deathNum']
      cureNum=province['cureNum']
      print ("當前日期:%s,湖北省實時疫情監測,確診:%s,死亡:%s,治癒:%s"%(rdate,value_hb,deathNum,cureNum))
      #data.append((province['name'], province['value']))
      for city in province['city']:
         cityname=city['mapName']
         conNum1="確診:%s"%city['conNum']
         deathNum1="死亡:%s"%city['deathNum']
         cureNum1="治癒:%s"%city['cureNum']
         message=conNum1+deathNum1+cureNum1
         print (cityname,conNum1,deathNum1,cureNum1)
         data.append((cityname,city['conNum']))
      
map_p = Map()
map_p.set_global_opts
(title_opts=opts.TitleOpts(title="2019_nCoV 湖北省疫情圖"),visualmap_opts=opts.VisualMapOpts(is_piecewise=True,
                pieces = [
                        {"min": 1000 , "label": '>1000',"color": "#893448"}, #這裏不指定 max,表示max爲無限大
                        {"min": 500, "max": 999, "label": '500-1000',"color": "#ff585e"},
                        {"min": 101, "max": 499, "label": '101-499',"color": "#fb8146"},
                        {"min": 10, "max": 99, "label": '10-100',"color": "#ffb248"},
                        {"min": 0, "max": 9, "label": '0-9',"color" : "#fff2d1" }]))
map_p.add("當前日期:%s,湖北省實時疫情監測,確診:%s,死亡:%s,治癒:%s"%(rdate,value_hb,deathNum,cureNum), data, maptype="湖北")
map_p.render("2019_ncov_hubei%s.html"%rtime) # 生成html文件

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

生成地圖如下:

 

max=1000,是指渲染指標,達到1000,就顏色越深。

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