python画饼图_百度飞桨PaddlePaddle之[Python小白逆袭大神]7天训练营
第三次參加百度的7天訓練營了
這次參加的主題是【Python小白逆襲大神】,不過你別看是小白逆勢。。。除非你一開始參加就逆襲完,不然你真的是python小白,這個課程還是有難難度的。
說一下個訓練營的特點版。這個營從python一些基礎練習-->數(shù)據(jù)可視化-->爬蟲--->綜合練習。
我從自己在每天做作業(yè)的角度講一下自己心得,和一些自己的坑。
【Day1-Python基礎練習】
這個感覺那里都有這個練習題。。。。之前學C語言也有這個題。陰魂不散啊。還真的不知道生成乘法口訣有什么用!!!!好吧,繼續(xù)做作業(yè)。這題作業(yè)無非就考【格式打印】(不是考你會不會9*9的乘法口訣。。。)注意換行的時候print()這個函數(shù)自帶一個換行符,如果不留意就每一行都有隔了兩個換行符。還有注意字符輸出對齊問題。就這樣。
def table():#在這里寫下您的乘法口訣表代碼吧!for i in range(1,10):result = ''for j in range(1,i+1):result += "{}*{}={:<2d} ".format(j, i, j*i)print(result)這個對真的python小白來說就是考慮怎樣一個循環(huán)套一個循環(huán),然后找出目標文件。
不過知道python的大名鼎鼎的os庫。就知道一個函數(shù)os.walk(),不用想。 就用它。不要自己重復造輪子。
import os #待搜索的目錄路徑 path = "Day1-homework" #待搜索的名稱 filename = "2020" #定義保存結果的數(shù)組 result = [] def findfiles():#在這里寫下您的查找文件代碼吧!global pathindex = 1for root, subs, files in os.walk(path):for f in files:if filename in f:result.append([index, os.path.join(root, f)])index += 1for group in result:print(group)【Day2-《青春有你2》選手信息爬取】
這天的作業(yè)就是讓你嘗試做一只小小的爬蟲。讓你感受python的實際用途。不在是打印9*9的乘法口訣,哈哈哈哈哈哈。作為這個作業(yè),你就可以爬其他網(wǎng)站的小姐姐,你懂得哈哈哈哈。這里最重要的就是requests和bs4庫了,爬蟲利器。
import requests from bs4 import BeautifulSoup #重點就是知道這個庫的基本使用 #關鍵用法就這三行 response = requests.get(url,headers=headers) soup = BeautifulSoup(response.text,'lxml') tables = soup.find_all('table',{'class':'table-view log-set-param'})不過這里說一下,如果懂一些html,js那爬起來就順手很多。因為爬之前要分析網(wǎng)頁的構成成分。在游覽器按【F12】吧,或者點擊圖片【右鍵檢查元素】吧。如圖看到對應元素所在的標簽。獲取class或者id來定位標簽。
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}url='https://baike.baidu.com/item/青春有你第二季' try:response = requests.get(url,headers=headers)#將一段文檔傳入BeautifulSoup的構造方法,就能得到一個文檔的對象, 可以傳入一段字符串soup = BeautifulSoup(response.text,'lxml')#返回的是class為table-view log-set-param的<table>所有標簽tables = soup.find_all('table',{'class':'table-view log-set-param'})crawl_table_title = "參賽學員"for table in tables: #對當前節(jié)點前面的標簽和字符串進行查找table_titles = table.find_previous('div').find_all('h3')for title in table_titles:if(crawl_table_title in title):return table except Exception as e:print(e)爬取圖片也是這用步驟,只是多了一步保存圖片的代碼,不過這里有個小坑,就是爬取圖冊的連接和真正打開圖冊的鏈接不一樣了!這點要注意。看圖
網(wǎng)址后面多了這個一塊
不加這塊是不能正常爬取圖冊中每張圖片的真正圖片img地址
完畢。
【Day3-《青春有你2》選手數(shù)據(jù)分析】
這節(jié)課的作業(yè)就是讓你熟悉數(shù)據(jù)可視化。畫直方圖,餅圖等等。
作業(yè)已經(jīng)給出選手的信息的json文件。就是學習怎樣用matplotlib來畫餅圖而已。這個在網(wǎng)上pie接口和一些參數(shù)的調(diào)節(jié),就可以了。沒什么難度。注意一點就是顯示中文問題。這個也是小坑
# 下載中文字體 !wget https://mydueros.cdn.bcebos.com/font/simhei.ttf # 將字體文件復制到matplotlib字體路徑 !cp simhei.ttf /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/mpl-data/fonts/ttf/ # 一般只需要將字體文件復制到系統(tǒng)字體目錄下即可,但是在aistudio上該路徑?jīng)]有寫權限,所以此方法不能用 # !cp simhei.ttf /usr/share/fonts/ # 創(chuàng)建系統(tǒng)字體文件路徑 !mkdir .fonts # 復制文件到該路徑 !cp simhei.ttf .fonts/ !rm -rf .cache/matplotlib 還有下面這一句。 # 設置顯示中文 plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默認字體核心代碼如下,參數(shù)調(diào)節(jié)就百度一下就可以。
df = pd.read_json('data/data31557/20200422.json') weight = df['weight'] def split_(x):value = x.split('kg')[0]return float(value) df['weight_value'] = weight.apply(lambda x:split_( x) ) df['weight_value'] = pd.cut(df['weight_value'], [0,45,50,55,200]) counts = pd.value_counts(df['weight_value']) values = counts.values labels = ['<=45kg', '45~50kg','50~55kg','>55kg'] explode = (0,0.1,0,0) # 畫圖 # 設置顯示中文 plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默認字體 plt.figure(figsize=(8,8)) patches,l_text,p_text = plt.pie(x=values, labels=labels, explode=explode, autopct='%1.1f%%',shadow=True, startangle=90, ) for t in l_text:t.set_size(25) for t in p_text:t.set_size(25) plt.axis('equal') plt.title('''《青春有你2》選手體重分布''',fontsize = 24,y=-0.1) plt.show()【Day4-《青春有你2》選手識別】
這天作業(yè)有點人工智能的味道。因為是做圖像分類,把5個小姐姐的圖片準確預測名字出來(如果沒有看過青春有你,估計你會臉盲。因為有一步就是要爬取對應的人的圖片。作為訓練集。網(wǎng)上一搜你發(fā)現(xiàn)每個人都差不多樣子。。。。好難清洗數(shù)據(jù)。。。。。。。。。。。。)
爬取圖片這一步我沒有做。。。。。我是用群里面的大神爬取的圖片。大概500張。做深度學習最重要的就是數(shù)據(jù),如果你的數(shù)據(jù)數(shù)量不夠好,和不夠多的話。做出來的效果會非常差的。或者容易出現(xiàn)過擬合。還有數(shù)據(jù)中,每一類的數(shù)據(jù)數(shù)量不均衡也不行。
所有我在500張的圖片上做了數(shù)據(jù)增強,每一張都用了水平翻轉來增加數(shù)據(jù)。
因為用了飛槳的PaddleHub工具。主要就是制作標簽和訓練數(shù)據(jù)路徑的txt文檔。
import random name = {'anqi':3, 'yushuxin':0, 'xujiaqi':1, 'wangchengxuan':4, 'zhaoxiaotang':2} import os train_img_path = list() val_img_path = list() for d in os.listdir('dataset'):if d in name.keys():img_path = list()index = name[d]for file in os.listdir(os.path.join('dataset',d)):if file != '.ipynb_checkpoints':string = d + '/'+ file+ ' ' + str(index) +'n'img_path.append(string)length = len(img_path)val_img_list = random.sample(img_path, int(len(img_path)*0.2)) for i in img_path:if i in val_img_list:val_img_path.append(i)else :train_img_path.append(i) random.shuffle(train_img_path) random.shuffle(val_img_path) #print(train_img_path) with open('dataset/train_list.txt', 'w') as f:for l in train_img_path:f.write(l)with open('dataset/validate_list.txt', 'w') as f:for l in val_img_path:f.write(l)其他的就交給paddlehub就可以了。如果訓練期間有什么報錯,一定要考慮就是你的txt文檔制作有問題,就是圖片路徑問題,就是標簽問題。99.99999%都是這個問題。這里展示預測結果
【Day5-綜合大作業(yè)】
顧名思義,這天作業(yè),是大作業(yè)。。因為你要結合之前所學習的知識。例如用爬蟲來爬取愛奇藝青春有你2視頻下的評論,再要做分詞,詞頻可視化,詞云可視化。
這里最重要的就是爬取評論,這次爬取的評論的動態(tài)網(wǎng)頁。動態(tài)不像之前的靜態(tài)爬取。可以直接獲取對應的html標簽。動態(tài)它加載的是js文件。這樣就要通過特殊工具來處理了。
首先利用Fiddler來抓包,觀察評論在動態(tài)加載的時候網(wǎng)站是怎樣變換的。
通過軟件發(fā)現(xiàn)每次加載評論都會出現(xiàn)一個新js文件。不用說了,點看看,明顯能看到里面的內(nèi)容就評論
好了,完成一半了,不過這里的評論只是顯示20條,下一次的20次又怎樣得去。好,找規(guī)律,分部加載三次評論,看三次評論的網(wǎng)址是怎樣變化的
可以發(fā)現(xiàn)三個網(wǎng)址不一樣的地方就是last_id=的不同。還有網(wǎng)址最后面的網(wǎng)址那一串不同。到這一步肯定想能不能通過上一個js文件中找到下一個js文件的id。
一找就找到了,這樣就好辦,那后面那串數(shù)字呢,發(fā)現(xiàn)是找不到的,那怎么辦。試試把它刪除掉,再輸入到游覽器,發(fā)現(xiàn)完全不影響。那直接刪除掉羅。所以現(xiàn)在分析后獲取網(wǎng)址。正常安爬取就可以了
def get_content(lastId):base_url = 'https://sns-comment.iqiyi.com/v3/comment/get_comments.action?agent_type=118&agent_version=9.11.5&authcookie=null&business_type=17&content_id=15068699100&hot_size=0&last_id='last_url = '&page=&page_size=20&types=time&callback=jsonp'url = base_url + str(lastId) + last_urlhtml=urllib.request.urlopen(url).read().decode("utf-8","ignore") return html#從源碼中獲取評論的數(shù)據(jù) def get_comment(html): pat='"content":"(.*?)"' rst = re.compile(pat,re.S).findall(html) return rst#獲取下個id def get_id(html):pat = '"id":"(.*?)"'rst = re.compile(pat,re.S).findall(html)return rst if __name__ == "__main__":total = 0first_id = 240947941221html=get_content(first_id)with open('comment.txt','w') as f:while True:commentlist=get_comment(html) for j in range(1,len(commentlist)): f.write(str(commentlist[j]) + 'n') total +=1#獲取下一輪刷新頁ID if total > 1100:break lastId=get_id(html)[-1] html=get_content(lastId)print("【完成】 總共爬取了{}條評論".format(total))到后面就去掉某些評論的臟數(shù)據(jù)。例如表情等。用正則化去除。
#去除文本中特殊字符 def clear_special_char(content):'''正則處理特殊字符參數(shù) content:原文本return: 清除后的文本'''s = re.sub(r"</?(.+?)>| |t/r*",'', content)s = re.sub(r"n",'', s)s = re.sub(r"*", "*", s)s = re.sub('[^u4E00-u9FA5A-Za-z0-9 ]','',s)a = re.sub('[001002003004005006007x08x09x0ax0bx0cx0dx0ex0fx10x11x12x13x14x15x16x17x18x19x1a]+', '', s)s = re.sub('{a—zA-Z}','',s)s = re.sub('^d+(.d+)?$','',s)return s到分詞和停用詞,用jieba這個模塊。我也是第一次用,百度了一下
def fenci(text):'''利用jieba進行分詞參數(shù) text:需要分詞的句子或文本return:分詞結果'''jieba.load_userdict("add_words.txt")seg = jieba.lcut(text,cut_all=False)return segdef stopwordslist(filepath):'''創(chuàng)建停用詞表參數(shù) file_path:停用詞文本路徑return:停用詞list'''stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()]return stopwords然后根據(jù)詞頻制作柱狀圖
def drawcounts(counts,num):'''繪制詞頻統(tǒng)計表參數(shù) counts: 詞頻統(tǒng)計結果 num:繪制topNreturn:none'''x_aixs = []y_aixs = []c_order = sorted(counts.items(), key=lambda x:x[1],reverse=True)#print(c_order)#通過高頻詞的數(shù)量進行排序for c in c_order[:num]:x_aixs.append(c[0])y_aixs.append(c[1])matplotlib.rcParams['font.family'] = ['SimHei'] # 指定默認字體matplotlib.rcParams['axes.unicode_minus'] = False plt.figure(figsize=(12,8))plt.bar(x_aixs, y_aixs)plt.title ( '詞頻統(tǒng)計')plt.show( )然后就制作詞云,wordcloud的庫的參數(shù)怎樣調(diào)。。。百度就可以。。。。
def drawcloud(word_f):'''根據(jù)詞頻繪制詞云圖參數(shù) word_f:統(tǒng)計出的詞頻結果return:none'''cloud_mask = np.array(Image.open('cloud.png'))st = set(['東西','這是'])wc = WordCloud(font_path='fonts/simhei.ttf', # 設置字體mask=cloud_mask,background_color="white", # 背景顏色max_words=200, # 詞云顯示的最大詞數(shù)max_font_size=80, # 字體最大值min_font_size=10, #字體最小值random_state=42, #隨機數(shù)collocations=False, #避免重復單詞stopwords=st,relative_scaling=0.3,width=400,margin=10, #圖像寬高,字間距,需要配合下面的plt.figure(dpi=xx)放縮才有效)wc.fit_words(word_f)wc.to_file('pic.png')最后就是用paddlehub來內(nèi)容審核。這個直接查看官方文檔。沒啥說的。。。。。。
def text_detection(text,file_path):'''使用hub對評論進行內(nèi)容分析return:分析結果'''porn_detection_lstm = hub.Module(name="porn_detection_lstm")test_text = list()with open('chean_comment.txt','r') as f:for line in f:if len(line) == 1:continueelse:test_text.append(line)input_dict = {"text": test_text}results = porn_detection_lstm.detection(data=input_dict,use_gpu=True, batch_size=1)for index, result in enumerate(results):if result['porn_detection_key'] == 'porn':print(result['text'], ":", result['porn_probs'])好了。經(jīng)歷7天的訓練營,終于結束。 之前一直關注深度學習。爬蟲和詞云只是之前在學習python的時候稍微搞了一下都忘記。 通過這個課可以讓我重溫和學習爬蟲,特別爬動態(tài)的網(wǎng)站。我都是現(xiàn)做現(xiàn)學。 多謝這次訓練營。多謝各位老師,多謝群里面的小伙伴。
總結
以上是生活随笔為你收集整理的python画饼图_百度飞桨PaddlePaddle之[Python小白逆袭大神]7天训练营的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python可变参数教学,Python函
- 下一篇: python算法入门_GitHub标星2