亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python繪制全球疫情變化地圖的實例代碼

 更新時間:2020年04月20日 09:39:47   作者:渡碼  
這篇文章主要介紹了使用Python繪制全球疫情變化地圖的實例代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

目前全球疫情仍然比較嚴重,為了能清晰地看到疫情爆發(fā)以來至現(xiàn)在全球疫情的變化趨勢,我繪制了一張疫情變化地圖。 廢話不多說,先上圖

下面就來重點介紹下上面這張圖的繪制過程,主要分為以下三個步驟:

  • 數(shù)據(jù)收集
  • 數(shù)據(jù)處理
  • 畫圖

下面一個一個來說。

數(shù)據(jù)收集

這是萬里長城的第一步,俗話說“巧婦難為無米之炊”,既然是變化圖,當然需要每個國家、每天的現(xiàn)有確診病例數(shù)。好在現(xiàn)在各大網(wǎng)站都有疫情相關(guān)的專題頁,我們可以直接抓數(shù)據(jù)。以網(wǎng)易為例

我們選擇 XHR,重新刷新下網(wǎng)頁可以看到有幾個接口,其中 list-total 接口是獲取當前所有有疫情的國家,以及對應(yīng)的國家id。另外,我們看到還有一個 list-by-area-code 接口,它是獲取每個國家歷史上每天的疫情數(shù)據(jù),請求這個接口需要帶 areaCode 參數(shù),這個參數(shù)就是我們剛剛說的國家id。所以對我們來說這兩個接口是最重要的。下面我們就看看請求 list-total 接口的代碼

def get_and_save_all_countries():
 """
 獲取所有的國家名以及對應(yīng)的id,保存為文件
 """

 url = 'https://c.m.163.com/ug/api/wuhan/app/data/list-total?t=317452696323'
 list_total_req = requests.get(url, headers=headers)
 if list_total_req.status_code == 200:
 area_tree = list_total_req.json()['data']['areaTree']

 area_dict = {}
 for area in area_tree:
  country_id = area['id']
  name = area['name']
  area_dict[country_id] = name

 area_json = json.dumps(area_dict, ensure_ascii=False) # ensure_ascii=False 防止json編碼后中文編程\u開頭的字符
 write_file('./config/countries_id2name.json', area_json)

這里將請求下來的數(shù)據(jù)臨時存放在文件里。有了所有的疫情國家的id,我們就可以請求 list-by-area-code 接口來獲取每個國家的疫情數(shù)據(jù)了。代碼與上面的類似,不同的是將請求結(jié)果存在了 mongodb 而不是文件,目的是為了方便增刪改查。當然為了大家方便使用,我將mongodb中的數(shù)據(jù)導入了文件 counties_daily.json 中,大家可以在源碼根目錄找到它。

數(shù)據(jù)處理

這一步的處理主要是為第三步畫圖做準備的。因為我們畫圖用的是pyecharts框架,它繪制世界地圖需要輸入的國家名是英文的,而我們收集的國家名是中文的,所以要將中文國家名對應(yīng)到英文國家名。最終的效果如下

網(wǎng)上能找到這樣的對應(yīng)關(guān)系,但想要用起來還需要解決兩個問題。第一,兩邊中文名統(tǒng)一,比如:我們收集的國家名是中非共和國,而對應(yīng)關(guān)系里是中非,那還是對應(yīng)不上。第二,需要自己增加映射關(guān)系,網(wǎng)上找的一般都不全,我們需要根據(jù)收集的數(shù)據(jù)自行增加。經(jīng)過上面兩個步驟處理后,我們就可以將大部分國家名對應(yīng)到pyechars能識別的英文名了。相關(guān)代碼如下

def get_cy_properties():
 # 獲取配置文件信息
 countries_id2name = read_file('./config/countries_id2name.json')
 cy_id2name_dict = json.loads(countries_id2name)
 cy_ch2en = {v: k for k, v in countries_dict.items()}

 # 調(diào)整國家的名字與配置文件一致
 cy_id2name_dict['879'] = '波斯尼亞和黑塞哥維那'
 cy_id2name_dict['8102'] = '多哥'
 cy_id2name_dict['8143'] = '剛果民主共和國'
 cy_id2name_dict['95983'] = '剛果'
 cy_id2name_dict['8144'] = '中非'
 cy_id2name_dict['95000011'] = '多米尼加'

 cy_props = {}
 for key in cy_id2name_dict:
 cy_name = cy_id2name_dict[key]
 if cy_name in cy_ch2en:
  cy_props[cy_name] = {}
  cy_props[cy_name]['id'] = key
  cy_props[cy_name]['en_name'] = cy_ch2en[cy_name]

 return cy_props

畫圖

這一步涉及到兩個核心過程——構(gòu)造數(shù)據(jù)結(jié)構(gòu)和畫圖。首先,我構(gòu)造了3個數(shù)據(jù)結(jié)構(gòu),分別是date_list、cy_name_list 和 ncov_data。date_list存放的是日期列表,因為我們畫動圖,所以需要一段時間;cy_name_list 存放收集的所有國家列表(英文名);ncov_data是一個字典,key是日期,value是數(shù)組,存放各個國家當天的確診病例數(shù)。生成這三個數(shù)據(jù)結(jié)構(gòu)的代碼如下

def parse_ncov_data(start_date, end_date, records):
 if not records:
  return

 date_list = get_date_range(start_date, end_date)
 cy_name_list = []
 res = {}
 # 獲取各國每天現(xiàn)有確認病例
 for i, record in enumerate(records):
  cy_name = record['cy_en_name']
  cy_name_list.append(cy_name)

  # 解析每天數(shù)據(jù)并計算現(xiàn)有確認病例
  existing_case_dict = {}
  for ncov_daily in record['data']['list']:
   date_str = ncov_daily['date']
   confirm = ncov_daily['total']['confirm'] # 累計確診
   heal = ncov_daily['total']['heal'] # 累計確診
   dead = ncov_daily['total']['dead'] # 累計死亡

   existing_case = confirm - heal - dead
   existing_case_dict[date_str] = existing_case

  last_existing_case = 0
  # 將每天確診病例數(shù)合并到res中
  for date_str in date_list:
   if date_str not in res: # 初始化
    res[date_str] = []

   existing_case = existing_case_dict.get(date_str)
   if existing_case is None:
    existing_case = last_existing_case
   res[date_str].append(existing_case)

   last_existing_case = existing_case

 return date_list, cy_name_list, res

參數(shù) records 是一個數(shù)組,數(shù)組每個元素代表一個國家,內(nèi)容便是我們在第一步請求 list-by-area-code 接口的數(shù)據(jù)。最后,用 pyecharts 來畫圖,直接上代碼

def render_map(date_list, cy_name_list, ncov_data):
 tl = Timeline() # 創(chuàng)建時間線輪播多圖,可以讓圖形按照輸入的時間動起來
 # is_auto_play:自動播放
 # play_interval:播放時間間隔,單位:毫秒
 # is_loop_play:是否循環(huán)播放
 tl.add_schema(is_auto_play=True, play_interval=50, is_loop_play=False)

 for date_str in date_list: # 遍歷時間列表
  map0 = (
   Map() # 創(chuàng)建地圖圖表
   # 將國家名 cy_name_list 以及各國當天確診病例 ncov_data[date_str] 加入地圖中
   .add("全球疫情趨勢", [list(z) for z in zip(cy_name_list, ncov_data[date_str])], 
    "world", is_map_symbol_show=False)
   .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) # 不顯示國家名
   .set_global_opts(
    title_opts=opts.TitleOpts(title="%s日" % date_str), # 圖表標題
    visualmap_opts=opts.VisualMapOpts(max_=80), # 當確診病例大于80 ,地圖顏色是紅色
   )
  )
  tl.add(map0, "%s" % date_str) # 將當天的地圖狀態(tài)加入時間線中

 tl.render() # 生成最終輪播多圖,會在當前目錄創(chuàng)建 render.html 文件

代碼里加了注釋,這里就不再贅述了。
運行 render_map 函數(shù)會在當前目錄生成 render.html 文件,打開后便自動播放疫情變化趨勢,如文章開頭 gif。另外,有些朋友可能會問,能不能直接輸出 gif。這一點我也嘗試過,百度、谷歌、GitHub上的教程基本上都試了一遍,比較遺憾沒有找到靠譜的方法。所以勸大家還是放棄這條路,曲線救國,錄制一個視頻轉(zhuǎn)成 gif 即可,方便快捷。畢竟人生苦短,Python 為我們節(jié)省下的時間不能再被這些無謂的坑再填回去。這樣整個過程就介紹完了,雖然思路不復雜,但局部細節(jié)上還是需要花一些時間處理的。

完整代碼共 230 行,需要的點擊下載。

鏈接: https://pan.baidu.com/s/17nIHelAGviyNhftskB-rdA 提取碼: at9z

最近國內(nèi)某些地方出現(xiàn)了反彈的跡象,希望大家無論是在工作還是生活上都能繼續(xù)保持警惕。希望這次疫情早點過去,等待全球地圖變白的那一天。

到此這篇關(guān)于Python繪制全球疫情變化地圖的實例代碼的文章就介紹到這了,更多相關(guān)Python全球疫情變化地圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python中如何獲取類屬性的列表

    Python中如何獲取類屬性的列表

    這篇文章主要給大家介紹了在Python中如何獲取類屬性的列表,文中通過示例代碼介紹的很詳細,相信對大家的學習或者工作具有一定的參考借鑒價值,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • Pandas處理時間序列數(shù)據(jù)操作詳解

    Pandas處理時間序列數(shù)據(jù)操作詳解

    這篇文章主要介紹了Pandas處理時間序列數(shù)據(jù)操作詳解,文章首先利用python自帶datetime庫,通過調(diào)用此庫可以獲取本地時間展開內(nèi)容說明具有一定的參考價值,需要的小伙伴可以參考一下
    2022-06-06
  • Python爬蟲之超級鷹驗證碼應(yīng)用

    Python爬蟲之超級鷹驗證碼應(yīng)用

    眾所周知python是一個很強大的語言,它擁有眾多的庫,今天我嘗試了使用超級鷹第三方平臺進行驗證碼的開發(fā),需要的朋友可以參考下
    2022-08-08
  • python的pandas工具包,保存.csv文件時不要表頭的實例

    python的pandas工具包,保存.csv文件時不要表頭的實例

    今天小編小編就為大家分享一篇python的pandas工具包,保存.csv文件時不要表頭的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Python安裝Selenium報錯解決之全方位排錯指南

    Python安裝Selenium報錯解決之全方位排錯指南

    pip是一個安裝Python包的管理工具,很多功能強大、使用方便的Python框架、插件、工具等,都是通過pip來進行安裝的,這篇文章主要給大家介紹了關(guān)于Python安裝Selenium報錯解決之全方位排錯的相關(guān)資料,需要的朋友可以參考下
    2024-08-08
  • Python中生成隨機密碼的常用方法小結(jié)

    Python中生成隨機密碼的常用方法小結(jié)

    密碼是信息安全的基石,它用于保護我們的賬戶、數(shù)據(jù)和隱私,在本文中,將討論多種Python方法,用于生成隨機密碼的實用示例和技巧,感興趣的可以了解下
    2024-02-02
  • python實現(xiàn)給字典添加條目的方法

    python實現(xiàn)給字典添加條目的方法

    這篇文章主要介紹了python實現(xiàn)給字典添加條目的方法,是比較實用的字典操作技巧,實例備有簡單的注釋,需要的朋友可以參考下
    2014-09-09
  • Python中循環(huán)依賴問題及其解決方案

    Python中循環(huán)依賴問題及其解決方案

    在軟件開發(fā)中,循環(huán)依賴是一個常見的問題,尤其是在使用 Python 這樣的動態(tài)語言時,循環(huán)依賴指的是兩個或多個模塊或組件相互依賴,形成一個閉環(huán),本文將探討 Python 中循環(huán)依賴的問題,并提供一些解決方案,需要的朋友可以參考下
    2024-06-06
  • Python實現(xiàn)視頻剪輯的示例詳解

    Python實現(xiàn)視頻剪輯的示例詳解

    這篇文章主要為大家詳細介紹了如何Python實現(xiàn)視頻剪輯的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-04-04
  • 詳解Python中的多線程編程

    詳解Python中的多線程編程

    這篇文章主要介紹了詳解Python中的多線程編程,Python中的多線程一直是Python學習中的重點和難點,要反復鞏固!需要的朋友可以參考下
    2015-04-04

最新評論