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