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 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()

這些數據還可以做很多的分析,比如幸運顏色的分析,某個月某個星座與多少個星座有匹配關係等等…

不懂可以加我QQ1693490575問我

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章