python+matplotlib+pandas股票爬虫可视化

python+matplotlib+pandas股票爬虫可视化股票数据爬虫数据源股城网,重心放在多支股票的概览信息上【未放在单只股票历史数据的分析与可视化,这一点也值得去做】;绘图用matplotlib,涉及饼图、柱状图、雷达图的设计、实现和优化,值得参考;_pandas计算股票总市值

最后更新时间:2020/8/6
更新说明:修复pandas read_excel方法,去掉官方已删除参数,给出源码

1. 功能点

股票数据爬虫数据源股城网,重心放在多支股票的概览信息上【未放在单只股票历史数据的分析与可视化,这一点也值得去做】;

绘图用matplotlib,涉及饼图、柱状图、雷达图的设计、实现和优化,值得参考;

源码仓库 stock_spider

    1. 可以获取股票数据保存至excel文件
    1. 股票的爬取与展示
    1. 股票信息的可视化
    1. 股票信息文件的删除

2. 业务分析

首先是数据源的获取,从股城网股票代码一览表获取,我们打开网页,源码模式观察,股票代码从href中获取
在这里插入图片描述
然后进入每支股票的详情页面爬取当日信息:
在这里插入图片描述
待爬取的位置:
在这里插入图片描述

3. 代码设计说明

采用console中提示菜单的方式贯通整个操作过程,简约高效;
表格处理使用pandas库;
作图matplotlib,涉及饼图、柱状图、雷达图及各种图的优化;
计时器是封装好的常用的装饰器;

4. 绘图代码说明

4.1. 饼图

def draw_pie():
    '''多支股票进行对比——饼图 '''
    df = read_excel()       # 读取数据
    # 根据 振幅 列排序 ascending:默认True升序排列;False降序排列
    df = df.sort_values(by="振幅", axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last')
    print(df)
    print("股票根据【振幅】做过排序!")
    stock_names = df["股票名称"].tolist()
    stock_sum_values = [float(x.split("亿")[0]) for x in df["总市值"].tolist()]
    # 计算各数据占比
    data = [x / sum(stock_sum_values) for x in stock_sum_values]

    # 设置绘图的主题风格(不妨使用R中的ggplot分隔)
    plt.style.use('ggplot')
    explode = []
    for i in range(len(stock_names)):
        if i == 0:
            explode.append(0.1)         # 用于突出显示某一扇形,此时将前三位位凸显
        elif i == 1:
            explode.append(0.1)
        elif i == 2:
            explode.append(0.1)
        else:
            explode.append(0)
    # 颜色映射
    cmap = plt.cm.prism
    colors = cmap(np.linspace(0., 1., len(stock_names)))
    # 横纵坐标轴标准化处理,使饼图是正圆
    plt.axes(aspect='equal')
    # 控制x轴和y轴的范围
    plt.xlim(0, 6)
    plt.ylim(0, 6)
    # 自定义半径
    radius = 1          # 不小于1
    pctdistance = radius - 0.4
    labeldistance = radius + 0.1
    # 绘制饼图
    plt.pie(x=data,  # 绘图数据
            explode=explode,                    # 突出显示设置
            labels=stock_names,                 # 添加各扇形区域标签
            colors=colors,                      # 设置饼图的自定义填充色
            autopct='%.1f%%',                   # 设置百分比的格式,这里保留一位小数
            pctdistance=pctdistance,            # 设置百分比标签与圆心的距离
            labeldistance=labeldistance,        # 设置各扇形标签与圆心的距离
            startangle=180,                     # 设置饼图的初始角度
            radius=radius,                      # 设置饼图的半径
            counterclock=False,                 # 是否逆时针,这里设置为顺时针方向
            wedgeprops={ 
   'linewidth': 1, 'edgecolor': 'w'},          # 设置饼图内外边界的属性值
            textprops={ 
   'fontsize': 10, 'color': 'k'},               # 设置文本标签的属性值
            center=(1.8, 1.8),                  # 设置饼图的原点
            # frame=2 # 是否显示饼图的图框,此处设置不显示
            )
    # 删除x轴和y轴的刻度
    plt.xticks(())
    plt.yticks(())
    # 添加图标题
    plt.title("多支股票总市值对比分布饼图")
    # 图例
    plt.legend(loc="lower left", fontsize=10, bbox_to_anchor=(-.3, .05))
    # 显示图形
    plt.show()

4.2. 柱状图

def draw_histogram():
    '''根据多支股票绘制【股票名称】——【最高】柱状图 '''
    df = read_excel()       # 读取数据
    x = df["股票名称"]
    y = df["最高"]
    # 绘制折线图
    plt.bar(x, y, color='darkcyan', align='center')
    # 设置横坐标显示角度,角度是逆时针
    plt.xticks(rotation=-55)
    # 添加标题
    plt.title("股票可视化——柱状图")
    plt.ylabel("最高")
    plt.xlabel("股票名称")
    # 自动调整子图参数适应大小
    plt.tight_layout()
    # 图例
    plt.legend(["最高"], loc="upper right", fontsize=10)
    # 添加数值标签
    for x, y in enumerate(y):
        plt.text(x, y, '%s' % round(y, 1), ha='center')
    plt.show()

4.3. 雷达图

def draw_radar():
    '''根据多支股票绘制 最高、最低、今开、昨收、涨停、跌停 雷达图 有实际意义,可对两支股票作对比 '''
    df = read_excel()       # 读取数据
    print(df)
    print("请根据以上展示信息,输入两支股票索引进行对比!")
    print("例如:输入1,然后回车; 再输入2,然后回车; 即可对第2、3支股票进行对比。")
    num1 = int(input(">>>>>>>>>>【输入待展示的股票序号1】<<<<<<<<<\n"))
    num2 = int(input(">>>>>>>>>>【输入待展示的股票序号2】<<<<<<<<<\n"))
    # 选取 最高、最低、今开、昨收、涨停、跌停 这五列标题
    titles = df.columns.tolist()[2:8]
    # 股票一
    stock_name1 = df["股票名称"][num1]
    stock_code1 = df["股票代码"][num1]
    data1 = df.loc[num1].tolist()[2:8]      # 选取 最高、最低、今开、昨收、涨停、跌停 这六列数据
    # 股票二
    stock_name2 = df["股票名称"][num2]
    stock_code2 = df["股票代码"][num2]
    data2 = df.loc[num2].tolist()[2:8]      # 选取 最高、最低、今开、昨收、涨停、跌停 这六列数据
    data = [data1, data2]
    N = len(titles)     # 雷达图等分数目
    titles.append(titles[0])        # 标题数目和数据一致

    # 样式 大于当前的5
    sam = ['r-', 'm-', 'g-', 'b-', 'y-', 'k-', 'w-', 'c-']
    for i in range(len(data)):
        values = data[i]
        # 设置雷达图的角度,平分圆面
        angles = np.linspace(0, 2 * np.pi, N, endpoint=False)
        # 雷达图封闭 两种方法
        # values.append(values[0])
        values = np.concatenate((values, [values[0]]))
        # 角度
        angles = np.append(angles, angles[0])
        # 绘制折线图
        plt.polar(angles, values, sam[num1 % 5], lw=2)
        # 添加特征标签
        plt.thetagrids(angles * 180 / np.pi, titles)
        # 填充颜色
        plt.fill(angles, values, facecolor='c', alpha=0.4)
        # 标题
        plt.title('【' + stock_name1 + stock_code1 + '】 VS 【' + stock_name2 + stock_code2 + '】')
    plt.show()

5. 效果展示

5.1 爬取股票信息

输入1回车
提示需要爬取的最大数目【建议15-20,因为后面绘图都是全量的,太多股票显示效果不好,没有随机采样有限个数个】此处列为TODO考虑作优化~
输入18个,因为网络和网页问题,可能会缺失几条股票信息!
在这里插入图片描述
例如我输入爬取40条,结果少了四条:
在这里插入图片描述
两个显示效果不好的例子
36支股票的效果已经很不好看了:
在这里插入图片描述
数目过多情况下,饼图已经重叠到爆炸:
在这里插入图片描述

5.2 展示股票信息

输入2回车
即可看到当前表格文件中存储的所有股票的信息,以pandas的dataframe格式展示,中间过多数据以…省略号缩写;
在这里插入图片描述

5.3 饼图

输入3回车,即可对当前文件中所有股票进行对比;
颜色和图例做过优化,但是仍有叠加情况【考虑过占比少和多的扇形交叉展示,但是此处数据根据涨跌幅做过排序】
点击关闭图形窗口即可继续运行系统!~
在这里插入图片描述

5.4 柱状图

输入4回车,即可生成当前所有股票【最高】柱状图;
在这里插入图片描述

5.5 雷达图 对比两支股票差距

输入5回车,先展示当前股票信息,最前面一列为股票的索引,从0开始;
在这里插入图片描述
然后根据提供的股票索引,输入两个存在的整数,即可生成雷达对比图;
在这里插入图片描述

5.6 删除旧股票信息文件&退出系统

输入6回车
即可将保存的股票表格文件删除,以方便下次爬取和生成新的股票表格文件;
输入0回车
即可退出并关闭程序;
在这里插入图片描述

6. 总结

通过此系统的设计与开发并优化过程,熟悉了matplotlib与pandas两个重要库的基本操作和使用;
另外对爬虫的网页分析和爬取也有了一定程度的学习;
需要优化的地方更在于系统项目更具有业务上的意义的设计;

今天的文章python+matplotlib+pandas股票爬虫可视化分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/87461.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注