python画饼图_百度飞桨PaddlePaddle之[Python小白逆袭大神]7天训练营
第三次參加百度的7天訓練營了
這次參加的主題是【Python小白逆襲大神】,不過你別看是小白逆勢。。。除非你一開始參加就逆襲完,不然你真的是python小白,這個課程還是有難難度的。
說一下個訓練營的特點版。這個營從python一些基礎練習-->數據可視化-->爬蟲--->綜合練習。
我從自己在每天做作業的角度講一下自己心得,和一些自己的坑。
【Day1-Python基礎練習】
這個感覺那里都有這個練習題。。。。之前學C語言也有這個題。陰魂不散啊。還真的不知道生成乘法口訣有什么用!!!!好吧,繼續做作業。這題作業無非就考【格式打印】(不是考你會不會9*9的乘法口訣。。。)注意換行的時候print()這個函數自帶一個換行符,如果不留意就每一行都有隔了兩個換行符。還有注意字符輸出對齊問題。就這樣。
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小白來說就是考慮怎樣一個循環套一個循環,然后找出目標文件。
不過知道python的大名鼎鼎的os庫。就知道一個函數os.walk(),不用想。 就用它。不要自己重復造輪子。
import os #待搜索的目錄路徑 path = "Day1-homework" #待搜索的名稱 filename = "2020" #定義保存結果的數組 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》選手信息爬取】
這天的作業就是讓你嘗試做一只小小的爬蟲。讓你感受python的實際用途。不在是打印9*9的乘法口訣,哈哈哈哈哈哈。作為這個作業,你就可以爬其他網站的小姐姐,你懂得哈哈哈哈。這里最重要的就是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那爬起來就順手很多。因為爬之前要分析網頁的構成成分。在游覽器按【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: #對當前節點前面的標簽和字符串進行查找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)爬取圖片也是這用步驟,只是多了一步保存圖片的代碼,不過這里有個小坑,就是爬取圖冊的連接和真正打開圖冊的鏈接不一樣了!這點要注意。看圖
網址后面多了這個一塊
不加這塊是不能正常爬取圖冊中每張圖片的真正圖片img地址
完畢。
【Day3-《青春有你2》選手數據分析】
這節課的作業就是讓你熟悉數據可視化。畫直方圖,餅圖等等。
作業已經給出選手的信息的json文件。就是學習怎樣用matplotlib來畫餅圖而已。這個在網上pie接口和一些參數的調節,就可以了。沒什么難度。注意一點就是顯示中文問題。這個也是小坑
# 下載中文字體 !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/ # 一般只需要將字體文件復制到系統字體目錄下即可,但是在aistudio上該路徑沒有寫權限,所以此方法不能用 # !cp simhei.ttf /usr/share/fonts/ # 創建系統字體文件路徑 !mkdir .fonts # 復制文件到該路徑 !cp simhei.ttf .fonts/ !rm -rf .cache/matplotlib 還有下面這一句。 # 設置顯示中文 plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默認字體核心代碼如下,參數調節就百度一下就可以。
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》選手識別】
這天作業有點人工智能的味道。因為是做圖像分類,把5個小姐姐的圖片準確預測名字出來(如果沒有看過青春有你,估計你會臉盲。因為有一步就是要爬取對應的人的圖片。作為訓練集。網上一搜你發現每個人都差不多樣子。。。。好難清洗數據。。。。。。。。。。。。)
爬取圖片這一步我沒有做。。。。。我是用群里面的大神爬取的圖片。大概500張。做深度學習最重要的就是數據,如果你的數據數量不夠好,和不夠多的話。做出來的效果會非常差的。或者容易出現過擬合。還有數據中,每一類的數據數量不均衡也不行。
所有我在500張的圖片上做了數據增強,每一張都用了水平翻轉來增加數據。
因為用了飛槳的PaddleHub工具。主要就是制作標簽和訓練數據路徑的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-綜合大作業】
顧名思義,這天作業,是大作業。。因為你要結合之前所學習的知識。例如用爬蟲來爬取愛奇藝青春有你2視頻下的評論,再要做分詞,詞頻可視化,詞云可視化。
這里最重要的就是爬取評論,這次爬取的評論的動態網頁。動態不像之前的靜態爬取。可以直接獲取對應的html標簽。動態它加載的是js文件。這樣就要通過特殊工具來處理了。
首先利用Fiddler來抓包,觀察評論在動態加載的時候網站是怎樣變換的。
通過軟件發現每次加載評論都會出現一個新js文件。不用說了,點看看,明顯能看到里面的內容就評論
好了,完成一半了,不過這里的評論只是顯示20條,下一次的20次又怎樣得去。好,找規律,分部加載三次評論,看三次評論的網址是怎樣變化的
可以發現三個網址不一樣的地方就是last_id=的不同。還有網址最后面的網址那一串不同。到這一步肯定想能不能通過上一個js文件中找到下一個js文件的id。
一找就找到了,這樣就好辦,那后面那串數字呢,發現是找不到的,那怎么辦。試試把它刪除掉,再輸入到游覽器,發現完全不影響。那直接刪除掉羅。所以現在分析后獲取網址。正常安爬取就可以了
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#從源碼中獲取評論的數據 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))到后面就去掉某些評論的臟數據。例如表情等。用正則化去除。
#去除文本中特殊字符 def clear_special_char(content):'''正則處理特殊字符參數 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進行分詞參數 text:需要分詞的句子或文本return:分詞結果'''jieba.load_userdict("add_words.txt")seg = jieba.lcut(text,cut_all=False)return segdef stopwordslist(filepath):'''創建停用詞表參數 file_path:停用詞文本路徑return:停用詞list'''stopwords = [line.strip() for line in open(filepath, 'r', encoding='utf-8').readlines()]return stopwords然后根據詞頻制作柱狀圖
def drawcounts(counts,num):'''繪制詞頻統計表參數 counts: 詞頻統計結果 num:繪制topNreturn:none'''x_aixs = []y_aixs = []c_order = sorted(counts.items(), key=lambda x:x[1],reverse=True)#print(c_order)#通過高頻詞的數量進行排序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 ( '詞頻統計')plt.show( )然后就制作詞云,wordcloud的庫的參數怎樣調。。。百度就可以。。。。
def drawcloud(word_f):'''根據詞頻繪制詞云圖參數 word_f:統計出的詞頻結果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, # 詞云顯示的最大詞數max_font_size=80, # 字體最大值min_font_size=10, #字體最小值random_state=42, #隨機數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來內容審核。這個直接查看官方文檔。沒啥說的。。。。。。
def text_detection(text,file_path):'''使用hub對評論進行內容分析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'])好了。經歷7天的訓練營,終于結束。 之前一直關注深度學習。爬蟲和詞云只是之前在學習python的時候稍微搞了一下都忘記。 通過這個課可以讓我重溫和學習爬蟲,特別爬動態的網站。我都是現做現學。 多謝這次訓練營。多謝各位老師,多謝群里面的小伙伴。
總結
以上是生活随笔為你收集整理的python画饼图_百度飞桨PaddlePaddle之[Python小白逆袭大神]7天训练营的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python可变参数教学,Python函
- 下一篇: python算法入门_GitHub标星2