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 pd
headers = {"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').text
dic['愛情運勢文字'] = infor2[1].find('span').text
dic['事業學業文字'] = infor2[2].find('span').text
dic['財富運勢文字'] = infor2[3].find('span').text
dic['健康運勢文字'] = infor2[4].find('span').text
print(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 np
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")
這裏面的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 np
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")
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_words
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") #保存圖片
注意:因爲我個人是處女座,我就把處女座的截取出來製作成雲圖。
將綜合運勢走向製作成曲線圖
讀取數據
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 np
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_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 np
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")
#分析處女座綜合運勢走向,畫曲線圖
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 spline
data = 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 spline
data = 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.index
y = data_1.values
rect = 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()