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

编程入门 行业动态 更新时间:2024-10-08 10:54:59

python+matplotlib+pandas股票<a href=https://www.elefans.com/category/jswz/34/1770264.html style=爬虫可视化"/>

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

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

  • 1. 功能点
  • 2. 业务分析
  • 3. 代码设计说明
  • 4. 绘图代码说明
    • 4.1. 饼图
    • 4.2. 柱状图
    • 4.3. 雷达图
  • 5. 效果展示
    • 5.1 爬取股票信息
    • 5.2 展示股票信息
    • 5.3 饼图
    • 5.4 柱状图
    • 5.5 雷达图 对比两支股票差距
    • 5.6 删除旧股票信息文件&退出系统
  • 6. 总结

最后更新时间: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.prismcolors = cmap(np.linspace(0., 1., len(stock_names)))# 横纵坐标轴标准化处理,使饼图是正圆plt.axes(aspect='equal')# 控制x轴和y轴的范围plt.xlim(0, 6)plt.ylim(0, 6)# 自定义半径radius = 1          # 不小于1pctdistance = radius - 0.4labeldistance = 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])        # 标题数目和数据一致# 样式 大于当前的5sam = ['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股票爬虫可视化

本文发布于:2024-03-10 16:01:44,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1728409.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:爬虫   股票   python   matplotlib   pandas

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!