新冠肺炎資料視覺化
目前,騰訊的 疫情實時追蹤 網頁能夠看到實時的新冠病毒資料,視覺化展示也非常清晰。但每次開啟都只能看到當天的資料,所以就想把每天的資料都儲存下來。儲存下來後,也用 pyecharts 做了一個疫情地圖。記錄下要點,供參考。pyecharts 的版本更新比較快,並且 0.5 版與 1.0 版不相容,我使用的 1.6.2 版。
使用 Chrome 瀏覽器,開啟 疫情實時追蹤 網頁,然後點選 F12,開啟 Developer Tools,再次點選頁面重新整理按鈕,追蹤得到資料的 Script 如下:
Response 返回的是 applicatio/json
格式的資料,雙擊左邊的 getOnsInfo**, Chrome 開啟一個新的頁面,展示最新的病情資料:
在Query String Parameters 中,callback 引數為:
callback 引數應該是一個基於毫秒級別的時間戳。去掉這個 callback 引數也可以獲得最新的感染人數資料。
對這個返回的 json 資料,我們可以另存為一個 json 檔案,並對資料的結構進行分析。分析的過程這裡就不展開了。
我根據自己的目的,使用 pandas 模組,將資料儲存到 Excel,通過 pyecharts 模組,將視覺化地圖儲存為 html 檔案,程式碼比較直觀,主要的處理過程為對含有多層次的資料進行扁平化,得到一個二維的資料。地圖中顯示的資料市確認病例的資料。
import requests
import json
import pandas as pd
import os
import datetime
from pyecharts import options as opts
from pyecharts.charts import *
cities = []
def get_ncov_data() -> str:
url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'
data = requests.get(url).json()['data']
return data
def get_daily_data() -> list:
all = json.loads(get_ncov_data())
return all['chinaDayList']
def flatten_ncov_data() -> list:
all = json.loads(get_ncov_data())
date = all['lastUpdateTime']
# 第一層:國家
china = all['areaTree'][0]['children'] # get China data
# 第二層:省
for province in china:
province_ncov = province['children']
# 第三層:市
for city in province_ncov:
# 輸出格式
city_ncov = {
'日期': date,
'省份': province['name'],
'市': city['name'],
'新增確認': city['today']['confirm'],
'新增治癒': city['today']['heal'],
'新增死亡': city['today']['dead'],
'累計確認': city['total']['confirm'],
'累計治癒': city['total']['heal'],
'累計死亡': city['total']['dead']
}
cities.append(city_ncov)
def export_excel():
cities.clear()
flatten_ncov_data()
df = pd.DataFrame(cities)
# 匯出Excel
path = os.path.dirname(os.path.abspath(__file__))
output_file = os.path.join(path, 'output.xlsx')
df.to_excel(output_file)
def render_map_chart():
cities.clear()
flatten_ncov_data()
df = pd.DataFrame(cities)
# Render Map chart
map_chart = Map()
map_chart.add(
"中國", # map name
[list(z) for z in zip(list(df["省份"]), list(df['累計確認']))],
"china",
is_map_symbol_show=False
)
map_chart.set_global_opts(
title_opts=opts.TitleOpts(
title="nCoV疫情地圖(" + str(datetime.date.today()) + ")"
),
visualmap_opts=opts.VisualMapOpts(
max_=10000,
is_piecewise=True,
pieces=[
{"min": 1, "max": 9, "label": "10人以下", "color": "#FFE6BE"},
{"min": 10, "max": 99, "label": "10-99人", "color": "#FFB769"},
{"min": 100, "max": 499, "label": "100-499人", "color": "#FF8F66"},
{"min": 500, "max": 999, "label": "500-999人", "color": "#ED514E"},
{"min": 1000, "max": 10000, "label": "1000人以上", "color": "#CA0D11"}
]))
map_chart.render('ncov_map_chart_{}.html'.format(datetime.date.today()))
def render_line_chart():
daily_data = get_daily_data()
df = pd.DataFrame(daily_data)
line_chart = Line()
line_chart.add_xaxis(list(df["date"]))
line_chart.add_yaxis("確認", list(df["confirm"]))
line_chart.add_yaxis("疑似", list(df["suspect"]))
line_chart.set_global_opts(
title_opts=opts.TitleOpts(title="nCoV確認病例與疑似病例曲線")
)
line_chart.render('ncov_line_chart-{}.html'.format(datetime.date.today()))
if __name__ == "__main__":
export_excel()
render_map_chart()
render_line_chart()
地圖顯示的效果如下,與騰訊疫情地圖圖例的顏色一樣。
確認和疑似病例的日趨勢曲線如下:
相關文章
- 資料看板視覺化視覺化
- 資料視覺化【十五】視覺化
- 大資料視覺化大資料視覺化
- 警惕“資料視覺化”視覺化
- 資料視覺化基本原理——視覺化模型視覺化模型
- 資料視覺化與資訊視覺化怎麼搞?視覺化
- 遇見大資料視覺化 : 那些 WOW 的資料視覺化案例大資料視覺化
- 什麼是資料視覺化,為什麼資料視覺化很重要?視覺化
- 資料視覺化--實驗五:高維非空間資料視覺化視覺化
- 視覺化之資料視覺化最強工具推薦視覺化
- 資料視覺化的秘密視覺化
- 視覺化中的資料視覺化
- 如何看待資料視覺化?視覺化
- Matlab資料視覺化Matlab視覺化
- 資料視覺化實踐視覺化
- 資料視覺化的作用視覺化
- 細談資料視覺化視覺化
- 資料視覺化能否代替資料分析視覺化
- 資料視覺化的基本原理——視覺通道視覺化
- (在模仿中精進資料視覺化03)OD資料的特殊視覺化方式視覺化
- 資料視覺化學習資源視覺化
- 什麼是資料視覺化?hightopo資料視覺化助力企業數字化視覺化
- python 資料視覺化利器Python視覺化
- pyecharts做資料視覺化(二)Echarts視覺化
- python資料視覺化——echartsPython視覺化Echarts
- 視覺化資料分析軟體視覺化
- 如何做好資料視覺化視覺化
- 資料視覺化的藝術視覺化
- 什麼是資料視覺化?視覺化
- 資料視覺化:基本圖表視覺化
- 資料視覺化明星Tableau Software視覺化
- 【matplotlib教程】資料視覺化視覺化
- 資料視覺化如何選擇合適的視覺化圖表?視覺化
- 視覺化資料的目的化設計視覺化
- 獲獎的資料視覺化示例 讓人視覺震撼視覺化
- 資料視覺化Seaborn從零開始學習教程(三) 資料分佈視覺化篇視覺化
- 資料視覺化(二)A股三大指數10年漲跌幅比較:資料視覺化視覺化
- [Echarts視覺化] 二.php和ajax連線資料庫實現動態資料視覺化Echarts視覺化PHP資料庫