Day01-图像处理原理与深度学习入门
Day01-圖像處理原理與深度學習入門
文章目錄
- Day01-圖像處理原理與深度學習入門
- 作業說明
- 一、數據準備
- 二、疫情地圖
- 完成作業
- paddle的本地安裝
- 繪制疫情餅圖
作業說明
今天的實戰項目是“新冠疫情可視化”。
- 作業1:飛槳本地安裝并提交安裝成功的截圖
- 作業2:請根據課上所學內容,爬取3月31日當天丁香園公開的統計數據,根據累計確診數,使用pyecharts繪制疫情分布圖(餅圖),如下圖所示,提交截圖。
Pycharts api可參考:https://pyecharts.org/#/zh-cn/
一、數據準備
上網的全過程:
- 普通用戶
- 打開瀏覽器 --> 往目標站點發送請求 --> 接收響應數據 --> 渲染到頁面上。
- 爬蟲程序
- 模擬瀏覽器 --> 往目標站點發送請求 --> 接收響應數據 --> 提取有用的數據 --> 保存到本地/數據庫。
爬蟲的過程:
request模塊是python實現的簡單易用的HTTP庫,官網地址:http://cn.python-requests.org/zh_CN/latest/。
re模塊:re模塊是python用于匹配字符串的模塊,該模塊中提供的很多功能是基于正則表達式實現的,
爬蟲整體如下:
import json import re import requests import datetimetoday = datetime.date.today().strftime('%Y%m%d') #20200315def crawl_dxy_data():"""爬取丁香園實時統計數據,保存到data目錄下,以當前日期作為文件名,存JSON文件"""response = requests.get('https://ncov.dxy.cn/ncovh5/view/pneumonia') #request.get()用于請求目標網站print(response.status_code) # 打印狀態碼try:url_text = response.content.decode() #更推薦使用response.content.deocde()的方式獲取響應的html頁面#print(url_text)url_content = re.search(r'window.getAreaStat = (.*?)}]}catch', #re.search():掃描字符串以查找正則表達式模式產生匹配項的第一個位置 ,然后返回相應的match對象。url_text, re.S) #在字符串a中,包含換行符\n,在這種情況下:如果不使用re.S參數,則只在每一行內進行匹配,如果一行沒有,就換下一行重新開始;#而使用re.S參數以后,正則表達式會將這個字符串作為一個整體,在整體中進行匹配。texts = url_content.group() #獲取匹配正則表達式的整體結果content = texts.replace('window.getAreaStat = ', '').replace('}catch', '') #去除多余的字符json_data = json.loads(content) with open('data/' + today + '.json', 'w', encoding='UTF-8') as f:json.dump(json_data, f, ensure_ascii=False)except:print('<Response [%s]>' % response.status_code)def crawl_statistics_data():"""獲取各個省份歷史統計數據,保存到data目錄下,存JSON文件"""with open('data/'+ today + '.json', 'r', encoding='UTF-8') as file:json_array = json.loads(file.read())statistics_data = {}for province in json_array:response = requests.get(province['statisticsData'])try:statistics_data[province['provinceShortName']] = json.loads(response.content.decode())['data']except:print('<Response [%s]> for url: [%s]' % (response.status_code, province['statisticsData']))with open("data/statistics_data.json", "w", encoding='UTF-8') as f:json.dump(statistics_data, f, ensure_ascii=False)if __name__ == '__main__':crawl_dxy_data()crawl_statistics_data()這里因為我們的作業是使用的累計確診數,所以其實爬蟲程序只需要一半就夠了,即我們只需要 crawl_dxy_data()函數。至于歷史統計數據,也一起生成了,但暫時還用不到。
通過反序列化實現文件的存儲,我們繪制疫情圖時需要的就是 20200331.json文件的數據。
二、疫情地圖
Echarts 是一個由百度開源的數據可視化工具,憑借著良好的交互性,精巧的圖表設計,得到了眾多開發者的認可。而 Python 是一門富有表達力的語言,很適合用于數據處理。當數據分析遇上數據可視化時,pyecharts 誕生了。pyecharts api可以參考:https://pyecharts.org/#/zh-cn/chart_api。
使用 options 配置項,在 pyecharts 中,一切皆 Options。主要分為全局配置組件和系列配置組件。
(1)系列配置項 set_series_opts(),可配置圖元樣式、文字樣式、標簽樣式、點線樣式等;
(2)全局配置項 set_global_opts(),可配置標題、動畫、坐標軸、圖例等
使用Pyecharts描繪全國疫情地圖
import json import datetime from pyecharts.charts import Map from pyecharts import options as opts# 讀原始數據文件 # 這里也可以直接讀取我們已經爬取的202003331.json文件 today = datetime.date.today().strftime('%Y%m%d') #20200331 datafile = 'data/'+ today + '.json' with open(datafile, 'r', encoding='UTF-8') as file:json_array = json.loads(file.read())# 分析全國實時確診數據:'confirmedCount'字段 china_data = [] for province in json_array:china_data.append((province['provinceShortName'], province['confirmedCount'])) china_data = sorted(china_data, key=lambda x: x[1], reverse=True) #reverse=True,表示降序,反之升序print(china_data) # 全國疫情地圖# 自定義的每一段的范圍,以及每一段的特別的樣式。 pieces = [{'min': 10000, 'color': '#540d0d'},{'max': 9999, 'min': 1000, 'color': '#9c1414'},{'max': 999, 'min': 500, 'color': '#d92727'},{'max': 499, 'min': 100, 'color': '#ed3232'},{'max': 99, 'min': 10, 'color': '#f27777'},{'max': 9, 'min': 1, 'color': '#f7adad'},{'max': 0, 'color': '#f7e4e4'}, ] labels = [data[0] for data in china_data] counts = [data[1] for data in china_data]m = Map() m.add("累計確診", [list(z) for z in zip(labels, counts)], 'china')#系列配置項,可配置圖元樣式、文字樣式、標簽樣式、點線樣式等 m.set_series_opts(label_opts=opts.LabelOpts(font_size=12),is_show=False) #全局配置項,可配置標題、動畫、坐標軸、圖例等 m.set_global_opts(title_opts=opts.TitleOpts(title='全國實時確診數據',subtitle='數據來源:丁香園'),legend_opts=opts.LegendOpts(is_show=False),visualmap_opts=opts.VisualMapOpts(pieces=pieces,is_piecewise=True, #是否為分段型is_show=True)) #是否顯示視覺映射配置#render()會生成本地 HTML 文件,默認會在當前目錄生成 render.html 文件,也可以傳入路徑參數,如 m.render("mycharts.html") m.render(path='output/全國實時確診數據.html')打開html文件即可看到繪制的疫情地圖
完成作業
paddle的本地安裝
AIStudio平臺上已經幫我們裝好了 PaddlePaddle,我們現在需要在本地安裝上Paddle。
本地安裝 Python的過程我就不贅述了,直接去官網下載即可。這里我安裝的是 Python3.6。
使用 pip安裝 Paddle時遇到了問題,無法直接安裝上 Paddle。
pip install paddle安裝過程中伴隨著一堆報錯,比如我的pip版本是9.0.1,安裝別的包像 numpy這些是一點問題沒有,安裝 Paddle時系統一直提示我要更新版本。于是我就通過命令更新了pip版本。
更新完之后再嘗試安裝 Paddle,結果提示當前 pip版本和 Python版本不匹配,無法執行操作,真是讓人吐血。在網上搜索了不少博客,嘗試了不少方法都不行,我又把 pip版本回退到了9.0.3,最后是在官方鏈接的方法中得到解決。
官方鏈接 百度官方-飛槳快速安裝,對于新手,CUDA 版本選擇為 CPU版本,跟著提示一步一步裝就行了。
這個錯誤和 pip并沒有任何關系,只是在安裝 Paddle時必須進行換源,官方推薦使用百度源或者清華源。我使用百度源之后就安裝成功了。
python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple安裝完成之后,我們可以通過命令行進行檢查,看看paddle是否安裝成功
我們可以看到,“Your Paddle is installed successfully!”,本地安裝 paddle已經成功。
繪制疫情餅圖
我先是仔細閱讀了老師給的 pyecharts繪圖的全國疫情地圖實例,一步一步地推導了這個圖是怎么畫出來的,大致上是清楚我們需要怎么繪制。
然后仿照著老師的全國疫情地圖的例子,照貓畫虎繪制了一個全國各省確診疫情的餅圖
import json from pyecharts.charts import Pie from pyecharts import options as opts# 讀取數據 datafile = 'data/20200331.json' with open(datafile, 'r', encoding='utf-8') as f:json_array = json.loads(f.read())# 從json中取數據,分析json文件可以發現,provinceShortName是省份名稱,confirmedCount是確診數量 # 按從大到小的順序排序 china_data = [] for province in json_array:china_data.append((province['provinceShortName'], province['confirmedCount'])) china_data = sorted(china_data, key=lambda x:x[1], reverse=True)# 自定義范圍及樣式 pieces = [{'min': 10000, 'color': '#A52A2A'},{'max': 9999, 'min': 1000, 'color': '#CD4F39'},{'max': 999, 'min': 500, 'color': '#CD6090'},{'max': 499, 'min': 100, 'color': '#CD853F'},{'max': 99, 'min': 10, 'color': '#C6E2FF'},{'max': 9, 'min': 0, 'color': '#C1FFC1'}, ]# 將attr和value單獨取出 labels = [data[0] for data in china_data] counts = [data[1] for data in china_data]p = Pie() p.add("累計確診", [list(z) for z in zip(labels, counts)], center=["40%", "62%"]) #系列配置項 p.set_series_opts(label_opts=opts.LabelOpts(font_size=10),is_show=False) #全局配置項 p.set_global_opts(title_opts=opts.TitleOpts(title='全國實時確診數據',subtitle='數據來源:丁香園'),legend_opts=opts.LegendOpts(is_show=False),visualmap_opts=opts.VisualMapOpts(pieces=pieces,is_piecewise=True,is_show=True)) #生成本地文件 p.render(path='output/Pie.html')這個餅圖就是通過對疫情地圖的模仿實現的,給人的視覺效果確實不如老師給的圖片好。
于是乎,我又去官方文檔中仔細學習了餅圖的畫法和使用技巧,重新繪制了一個餅圖
這次繪制的更新在于
- 更換了主題
- 放縮了餅圖的大小
- 重新設置了Label格式
- 去掉了VisualMap設置
不得不感嘆 Pyechart,也就是 Echarts的強大,僅僅修改了幾個配置組件,圖表就大變樣了,煥然一新。
OK,我們如法炮制,又可以繪制出湖北省各市確診的餅圖
import json from pyecharts.charts import Pie from pyecharts import options as opts from pyecharts.globals import ThemeTypedatafile = 'data/20200331.json' with open(datafile, 'r', encoding='utf-8') as f:json_array = json.loads(f.read())province_name = '湖北' for province in json_array:if province['provinceName'] == province_name or province['provinceShortName'] == province_name:json_array_province = province['cities']hubei_data = [(city['cityName'], city['confirmedCount']) for city in json_array_province]hubei_data = sorted(hubei_data, key=lambda x: x[1], reverse=True)# print(hubei_data)cityNames = [data[0] for data in hubei_data] confirmCounts = [data[1] for data in hubei_data]p = Pie(init_opts=opts.InitOpts(ThemeType.SHINE)) p.add("累計確診", [list(z) for z in zip(cityNames, confirmCounts)], radius="50%", center=["20%", "50%"]) p.set_series_opts(label_opts=opts.LabelOpts(formatter=": {c}"),is_show=False) p.set_global_opts(title_opts=opts.TitleOpts(title='湖北省各地級市累計確診數據',subtitle="數據來源:丁香園"),legend_opts=opts.LegendOpts(is_show=False)) p.render(path='output/HubeiPie.html')到這里我們已經學會了繪制餅圖的方法和一些設置技巧,如果說想繪制疑似病例數據之類的餅圖,也可以自己進行操作了。
總結
以上是生活随笔為你收集整理的Day01-图像处理原理与深度学习入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新手第四课-PaddlePaddle快速
- 下一篇: Day02-深度学习原理与使用方法