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问我

<think>好的,用户想用Python进行星座相关的研究或编程,我需要先理解他们的具体需求。可能他们是想根据出生日期确定星座,或者分析星座与其他数据的关系,比如性格测试、星盘计算等。 首先,基础功能是输入日期返回对应的星座。这需要确定每个星座的日期范围,然后编写判断逻辑。比如,摩羯座是12月22日到1月19日,这里跨年处理需要注意。可以用元组或字典来存储星座的日期范围和名称。 然后,用户可能需要更复杂的星盘计算,比如太阳、月亮星座,上升星座等。这涉及到天文学计算,可能需要第三方库,比如PyEphem或skyfield,来获取天体位置。这部分比较复杂,可能需要用户安装这些库,并了解天文坐标和时间的处理。 另外,用户可能对数据分析感兴趣,比如将星座数据与其他数据集结合分析。比如使用pandas处理数据,matplotlib或seaborn进行可视化。例如,分析星座与职业分布的关系,但需要提醒用户相关性和因果关系的区别,避免得出不科学的结论。 还需要考虑用户的技术水平。如果用户是初学者,先从简单的日期判断开始,再逐步引入更复杂的功能。提供代码示例时,确保语法正确,比如使用datetime模块处理日期,注意比较时的条件判断是否正确,特别是跨年的摩羯座。 可能遇到的问题包括时区处理、出生地点对上升星座的影响,以及精确的天体位置计算。这时候推荐使用专业库,并给出安装方法和示例代码。同时,提醒用户星座研究属于占星学范畴,学术上可能存在争议,建议结合科学方法进行分析。 最后,生成相关问题,帮助用户深入探索,比如如何结合机器学习分析星座数据,如何处理不同时区的影响,或者如何验证星座与其他因素的相关性。这些问题可以引导用户进一步学习和应用Python在相关领域。</think># Python星座研究与编程指南 ## 一、基础星座判断 使用Python判断星座的核心方法是建立日期范围映射。以下代码可判断输入日期对应的星座: ```python from datetime import date def get_zodiac_sign(month, day): signs = [ ('摩羯座', (1, 20), (12, 31)), ('水瓶座', (1, 21), (2, 19)), ('双鱼座', (2, 20), (3, 20)), ('白羊座', (3, 21), (4, 19)), ('金牛座', (4, 20), (5, 20)), ('双子座', (5, 21), (6, 21)), ('巨蟹座', (6, 22), (7, 22)), ('狮子座', (7, 23), (8, 22)), ('处女座', (8, 23), (9, 22)), ('天秤座', (9, 23), (10, 23)), ('天蝎座', (10, 24), (11, 22)), ('射手座', (11, 23), (12, 21)) ] for sign in signs: name, (start_month, start_day), (end_month, end_day) = sign if (month == start_month and day >= start_day) or \ (month == end_month and day <= end_day): return name return '摩羯座' # 处理跨年边界 ``` ## 二、进阶应用方向 1. **星盘计算** 使用`PyEphem`库计算天体位置: ```python import ephem observer = ephem.Observer() observer.date = '2023-10-08 12:00' observer.lat = '31.2304' # 上海纬度 observer.lon = '121.4737' # 上海经度 sun = ephem.Sun(observer) print(sun.ra) # 输出太阳赤经 ``` 2. **数据分析** 使用Pandas进行星座分布分析: ```python import pandas as pd import matplotlib.pyplot as plt data = pd.read_csv('user_data.csv') data['星座'] = data.apply(lambda row: get_zodiac_sign(row['生日'].month, row['生日'].day), axis=1) data['星座'].value_counts().plot(kind='bar') plt.show() ``` ## 三、注意事项 1. 时区处理建议使用`pytz`库 2. 精确计算需要包含出生地点坐标 3. 星座日期边界存在不同标准(如恒星黄道与回归黄道)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值