python星座分析
python數據分析
python數據分析是一個非常好用的,雖然python數據分析只是剛剛起步,有些功能還未開發完成,但是用來做數據分析是綽綽有余了,本人也是專門研究和學習python數據分析的。
星座數據爬蟲
作為一個學習數據分析的人,爬蟲是一項必不可少的技能,因為很多數據不是別人提供的,而是需要自己去挖掘出來的,所以就需要自己從網站上爬取數據,這次我們主要是爬取星座屋的數據,因為上面的數據比較全,而且內容也很多。
分析網站
首先我們得進入到要獲取數據的網站(https://www.xzw.com/fortune/),然后就可以看到
然后我們就隨便進去一個星座看一看。
然后就可以看到數據都在這里了,因為這里的url地址和最原始的不一樣,所以我們就需要分析url的變化規則
下面直接給爬蟲代碼,就不細說爬蟲了,不懂也可以來問我。
''' 星座屋爬蟲 creat on July 6,2019 @Author 小明 ''' import requests from bs4 import BeautifulSoup import re import pandas as pdheaders = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36","Cookie":"my_city=%E4%BD%9B%E5%B1%B1; my_province=%E5%B9%BF%E4%B8%9C; UM_distinctid=16bb293ac7a584-0ff6fe610b1129-f353163-100200-16bb293ac7b3fc; fc_aid=4; BAIDU_SSP_lcr=https://www.google.com/; CNZZDATA30047636=cnzz_eid%3D942196296-1562064836-https%253A%252F%252Fwww.google.com%252F%26ntime%3D1562415181; CNZZDATA3473983=cnzz_eid%3D338043090-1562064968-https%253A%252F%252Fwww.google.com%252F%26ntime%3D1562416420; CNZZDATA1273458473=346194606-1562068152-https%253A%252F%252Fwww.google.com%252F%7C1562415193"}xz_lst = ['leo','libra','scorpio','aquarius','taurus','gemini','cancer','virgo','sagittarius','capricorn','pisces','aries']data_time = pd.date_range(start='20190101',end='20190706',freq='D') date_list = [re.match("(.*?)T",str(i)).group(1) for i in data_time.values] date = [re.sub("-","",j) for j in date_list]url_list = [] for i in xz_lst:for j in date:url = "https://www.xzw.com/fortune/{0}/{1}.html".format(i,j)url_list.append(url) data_list = [] for u in url_list:response = requests.get(url=u, headers=headers)print(response)soupi = BeautifulSoup(response.text, 'lxml')# 解析頁面try:dic = {}dic['標題'] = soupi.find('h4').text# 獲取標題信息infor1 = soupi.find('div', class_="c_main").find('ul').find_all('li')dic[infor1[0].text] = infor1[0].find('em')['style'].split(':')[1].split('p')[0]dic[infor1[1].text] = infor1[1].find('em')['style'].split(':')[1].split('p')[0]dic[infor1[2].text] = infor1[2].find('em')['style'].split(':')[1].split('p')[0]dic[infor1[3].text] = infor1[3].find('em')['style'].split(':')[1].split('p')[0]dic[infor1[4].find('label').text] = infor1[4].text.split(':')[1]dic[infor1[5].find('label').text] = infor1[5].text.split(':')[1]dic[infor1[6].find('label').text] = infor1[6].text.split(':')[1]dic[infor1[7].find('label').text] = infor1[7].text.split(':')[1]dic[infor1[8].find('label').text] = infor1[8].text.split(':')[1]dic[infor1[9].find('label').text] = infor1[9].text.split(':')[1]# 獲取運勢等信息infor2 = soupi.find('div', class_="c_cont").find_all('p')dic['綜合運勢文字'] = infor2[0].find('span').textdic['愛情運勢文字'] = infor2[1].find('span').textdic['事業學業文字'] = infor2[2].find('span').textdic['財富運勢文字'] = infor2[3].find('span').textdic['健康運勢文字'] = infor2[4].find('span').textprint(dic)data_list.append(dic)except:print("網頁為空")pass data_frame = pd.DataFrame(data_list) pd.DataFrame.to_csv(data_frame,"I:/crack/DATA/xingzuo.csv",encoding="utf_8_sig") print("寫入成功")用綜合運勢的文字來制作云圖
首先導入數據
from cv2 import imread import pandas as pd import jieba import matplotlib.pyplot as plt import wordcloud from scipy.interpolate import spline import numpy as nppd.set_option('display.max_columns',1000) pd.set_option('display.width',150) pd.set_option('display.max_colwidth',500) data = pd.read_csv("I:/crack/DATA/xingzuo.csv")這里面的pd.set_option(‘display.max_columns’,1000),pd.set_option(‘display.width’,150)
pd.set_option(‘display.max_colwidth’,500) 是用來在pycharm中更好的顯示數據的,如果不加上這三行代碼,讀取數據的時候會省略一些,不顯示完,加不加都沒關系,加了只是為了更好的觀察數據。
清洗標題文字和獲取綜合運勢的文字
data["標題"] = data["標題"].str[:3] # 首先要將標題只截取出來星座的名字 all_fortune = data[data["標題"] == "處女座"]["綜合運勢文字"].tolist() all_fortune_txt = "".join(all_fortune) word_list = jieba.cut(all_fortune_txt) txt = "".join(word_list)因為在爬取數據的時候也把日期爬取出來了,比如處女座運勢1月1日,但是我們在截取數據的時候想把處女座給提取出來,所以就用str[:3]的方法把原標題的文字轉換成我們想
要的文字。
然后把綜合運勢的文字轉換成列表里面的一個一個元素,然后再拼成一段話,再用結巴進行分詞,然后再把一些詞合成一句一句完整的句子。
畫云圖
w = wordcloud.WordCloud(font_path = "I:crack/font/msyh.TTF",width = 1000,height = 700,background_color = "FloralWhite").generate(txt) plt.imshow(w) #顯示圖片 plt.show() w.to_file("I:/crack/img/fortune.png") #保存圖片這里的云圖有很多參數,為了方便使用,我就直接把每個參數是用來做什么的,寫在下面
# font_path : string //字體路徑,需要展現什么字體就把該字體路徑+后綴名寫上,如:font_path = '黑體.ttf' # # width : int (default=400) //輸出的畫布寬度,默認為400像素 # # height : int (default=200) //輸出的畫布高度,默認為200像素 # # prefer_horizontal : float (default=0.90) //詞語水平方向排版出現的頻率,默認 0.9 (所以詞語垂直方向排版出現頻率為 0.1 ) # mask : nd-array or None (default=None) //如果參數為空,則使用二維遮罩繪制詞云。如果 mask 非空,設置的寬高值將被忽略,遮罩形狀被 mask 取代。除全白(#FFFFFF)的部分將不會繪制,其余部分會用于繪制詞云。如:bg_pic = imread('讀取一張圖片.png'),背景圖片的畫布一定要設置為白色(#FFFFFF),然后顯示的形狀為不是白色的其他顏色。可以用ps工具將自己要顯示的形狀復制到一個純白色的畫布上再保存,就ok了。 # # scale : float (default=1) //按照比例進行放大畫布,如設置為1.5,則長和寬都是原來畫布的1.5倍。 # # min_font_size : int (default=4) //顯示的最小的字體大小 # # font_step : int (default=1) //字體步長,如果步長大于1,會加快運算但是可能導致結果出現較大的誤差。 # # max_words : number (default=200) //要顯示的詞的最大個數 # # stopwords : set of strings or None //設置需要屏蔽的詞,如果為空,則使用內置的STOPWORDS # # background_color : color value (default=”black”) //背景顏色,如background_color='white',背景顏色為白色。 # # max_font_size : int or None (default=None) //顯示的最大的字體大小 # # mode : string (default=”RGB”) //當參數為“RGBA”并且background_color不為空時,背景為透明。 # # relative_scaling : float (default=.5) //詞頻和字體大小的關聯性 # # color_func : callable, default=None //生成新顏色的函數,如果為空,則使用 self.color_func # # regexp : string or None (optional) //使用正則表達式分隔輸入的文本 # # collocations : bool, default=True //是否包括兩個詞的搭配 # # colormap : string or matplotlib colormap, default=”viridis” //給每個單詞隨機分配顏色,若指定color_func,則忽略該方法。 # # # # fit_words(frequencies) //根據詞頻生成詞云 # generate(text) //根據文本生成詞云 # generate_from_frequencies(frequencies[, ...]) //根據詞頻生成詞云 # generate_from_text(text) //根據文本生成詞云 # process_text(text) //將長文本分詞并去除屏蔽詞(此處指英語,中文分詞還是需要自己用別的庫先行實現,使用上面的 fit_words(frequencies) ) # recolor([random_state, color_func, colormap]) //對現有輸出重新著色。重新上色會比重新生成整個詞云快很多。 # to_array() //轉化為 numpy array # to_file(filename) //輸出到文件源碼
''' 星座數據分析 creat on July 6,2019 @Author 小明 ''' from cv2 import imread import pandas as pd import jieba import matplotlib.pyplot as plt import wordcloud from scipy.interpolate import spline import numpy as nppd.set_option('display.max_columns',1000) pd.set_option('display.width',150) pd.set_option('display.max_colwidth',500)#首先制作詞云圖,處女座半年來的運勢分析 data = pd.read_csv("I:/crack/DATA/xingzuo.csv") def ciyun():data["標題"] = data["標題"].str[:3] # 首先要將標題只截取出來星座的名字all_fortune = data[data["標題"] == "處女座"]["綜合運勢文字"].tolist()print(all_fortune)all_fortune_txt = "".join(all_fortune)print(all_fortune)#將綜合運勢的文字進行切片word_list = jieba.cut(all_fortune_txt)txt = "".join(word_list)#開始畫云圖,注意這里時要根據文本畫云圖,如果需要根據詞頻畫圖那就是調用fit_wordsw = wordcloud.WordCloud(font_path = "I:crack/font/msyh.TTF",width = 1000,height = 700,background_color = "FloralWhite").generate(txt)plt.imshow(w) #顯示圖片plt.show()w.to_file("I:/crack/img/fortune.png") #保存圖片注意:因為我個人是處女座,我就把處女座的截取出來制作成云圖。
將綜合運勢走向制作成曲線圖
讀取數據
from cv2 import imread import pandas as pd import jieba import matplotlib.pyplot as plt import wordcloud from scipy.interpolate import spline import numpy as nppd.set_option('display.max_columns',1000) pd.set_option('display.width',150) pd.set_option('display.max_colwidth',500) data = pd.read_csv("I:/crack/DATA/xingzuo.csv")清洗標題和把綜合運勢的數據提取出來
data_1 = data.set_index("標題",drop=False) data_1.index = data_1.index.str[5:] data_1.index.name = "date" data_1["標題"] = data_1["標題"].str[:3] data_2 = data_1[data_1["標題"] == "處女座"]這里我把標題轉換為了行索引,方便下面要制作曲線圖的x軸坐標
畫圖
plt.figure(figsize=(12,8)) plt.rcParams["font.family"] = "SimHei" x = data_2.index[::10] y = data_2["綜合運勢:"].tolist()[::10] x_xtick = np.arange(len(x)) xnew = np.linspace(x_xtick.min(), x_xtick.max(), 300) # 定義曲線的X和Y值 power_smooth_1 = spline(x_xtick, y, xnew) plt.plot(xnew, power_smooth_1) plt.xticks(range(len(x)),x,fontsize=16,rotation=45) plt.yticks([i*16 for i in range(5)]) plt.grid() plt.savefig("I:/crack/img/處女座綜合運勢走向圖.png", bbox_inches="tight") plt.show()因為這里的數據太多了,日期太多了,如果一個一個都顯示的話就很難看出什么,圖片也很難觀察,所以這樣x = data_2.index[::10]
y = data_2[“綜合運勢:”].tolist()[::10] 用切片的方式來間隔顯示數據,這里畫曲線的思路是,先按照折線的方式畫圖,然后再把每個點連接起來畫成曲線圖,不懂也可以去百度看一看,都會有很詳細的解說的。
這里為了更好的顯示,也畫了網格線,因為綜合運勢是有序的分類變量,所以我們可以按照它的順序來做y軸的刻度。
源碼
''' 星座數據分析 creat on July 6,2019 @Author 小明 ''' from cv2 import imread import pandas as pd import jieba import matplotlib.pyplot as plt import wordcloud from scipy.interpolate import spline import numpy as nppd.set_option('display.max_columns',1000) pd.set_option('display.width',150) pd.set_option('display.max_colwidth',500)data = pd.read_csv("I:/crack/DATA/xingzuo.csv")#分析處女座綜合運勢走向,畫曲線圖 def fortuen():data_1 = data.set_index("標題",drop=False)data_1.index = data_1.index.str[5:]data_1.index.name = "date"data_1["標題"] = data_1["標題"].str[:3]data_2 = data_1[data_1["標題"] == "處女座"]#畫圖plt.figure(figsize=(12,8))plt.rcParams["font.family"] = "SimHei"x = data_2.index[::10]y = data_2["綜合運勢:"].tolist()[::10]x_xtick = np.arange(len(x))xnew = np.linspace(x_xtick.min(), x_xtick.max(), 300) # 定義曲線的X和Y值power_smooth_1 = spline(x_xtick, y, xnew)plt.plot(xnew, power_smooth_1)plt.xticks(range(len(x)),x,fontsize=16,rotation=45)plt.yticks([i*16 for i in range(5)])plt.grid()plt.savefig("I:/crack/img/處女座綜合運勢走向圖.png", bbox_inches="tight")plt.show()注意:不懂的也可以看我前面的博客,或者來問我也許。
畫愛情云圖
import pandas as pd import jieba import wordcloud from cv2 import imread import numpy as np import matplotlib.pyplot as plt#現在來看一下三個月處女座綜合運勢的分析,詞云 pd.set_option('display.max_columns',1000) pd.set_option('display.width',150) pd.set_option('display.max_colwidth',500) data = pd.read_csv("I:/crack/DATA/xingzuo.csv")data["標題"] = data["標題"].str[:3] #首先將標題轉化為只有星座的模樣data_virgo = data[data["標題"] == "處女座"]word = data_virgo["愛情運勢文字"].tolist() all_word = "".join(word)#然后用解霸來分析文字 word_list = jieba.cut(all_word,cut_all=False) txt = "".join(word_list) #來嘗試制作愛心的詞云圖,要導入cv2中的imread這個模塊 pic = imread("I:/crack/img/1.png")#然后讀出這個圖片 w_2 = wordcloud.WordCloud(mask=pic,font_path = "I:crack/font/msyh.TTF",width = 758,height = 659,background_color = "white") w_2.generate(txt) plt.imshow(w_2, interpolation="bilinear") plt.show() w_2.to_file("I:/crack/img/chi4.png")這里和上面的綜合運勢的云圖沒有什么大的區別,唯一不同的就是,這里的云圖模型是愛心型的。
首先要找到像素為愛心型的圖片,然后用cv2中的imread來讀取愛心的輪廓,然后在云圖的參數里面的mask傳遞讀取的對象就可以了
源碼
import pandas as pd import jieba import wordcloud from cv2 import imread from PIL import Image from os import path import numpy as np import matplotlib.pyplot as plt#現在來看一下三個月處女座綜合運勢的分析,詞云 pd.set_option('display.max_columns',1000) pd.set_option('display.width',150) pd.set_option('display.max_colwidth',500) data = pd.read_csv("I:/crack/DATA/xingzuo.csv")data["標題"] = data["標題"].str[:3] #首先將標題轉化為只有星座的模樣data_virgo = data[data["標題"] == "處女座"]word = data_virgo["愛情運勢文字"].tolist() all_word = "".join(word)#然后用解霸來分析文字 word_list = jieba.cut(all_word,cut_all=False) txt = "".join(word_list)#然后先制作一個簡單的詞云 # w = wordcloud.WordCloud(font_path = "I:crack/font/msyh.TTF",width = 1000,height = 700,background_color = "Pink") #這個是配置詞云設置#來嘗試制作愛心的詞云圖,要導入cv2中的imread這個模塊 pic = imread("I:/crack/img/1.png")#然后讀出這個圖片 w_2 = wordcloud.WordCloud(mask=pic,font_path = "I:crack/font/msyh.TTF",width = 758,height = 659,background_color = "white") w_2.generate(txt) plt.imshow(w_2, interpolation="bilinear") plt.show() w_2.to_file("I:/crack/img/chi4.png")分析處女座與其他星座匹配的頻數
首先讀取數據
import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy.interpolate import splinedata = pd.read_csv("I:/crack/DATA/xingzuo.csv")然后提取數據
data["標題"] = data["標題"].str[:3] data_1 = data[data["標題"] == "處女座"] data_1 = data_1["速配星座:"].value_counts()這里用到了頻數統計,就是先把處女座的數提取出來,然后分類統計出速配星座的頻數。
畫圖
源碼
''' 星座分析 creat on July 7,2019 @Author 小明 ''' import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy.interpolate import splinedata = pd.read_csv("I:/crack/DATA/xingzuo.csv")#分析這段時間處女座和其他星座匹配的頻數統計 def match():data["標題"] = data["標題"].str[:3]data_1 = data[data["標題"] == "處女座"]data_1 = data_1["速配星座:"].value_counts()plt.figure(figsize=(12, 9))plt.rcParams["font.family"] = "SimHei"x = data_1.indexy = data_1.valuesrect = plt.bar(range(len(x)), y,color = "Pink")plt.xticks(range(len(x)),x,fontsize = 15)for rects in rect:height = rects.get_height()plt.text(rects.get_x() + rects.get_width()/2,1.02*height, height,fontsize = 18,ha='center')plt.savefig("I:/crack/img/處女座與其他星座匹配的頻數.png")plt.show()這些數據還可以做很多的分析,比如幸運顏色的分析,某個月某個星座與多少個星座有匹配關系等等…
不懂可以加我QQ1693490575問我
總結
以上是生活随笔為你收集整理的python星座分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OPENGL颜色混合
- 下一篇: 海雀口中美食遭贪吃海鸥打劫