python爬取股票最新数据并用excel绘制树状图的示例


Posted in Python onMarch 01, 2021

大家好,最近大A的白马股们简直 跌妈不认,作为重仓了抱团白马股基金的养鸡少年,每日那是一个以泪洗面啊。

不过从金融界最近一个交易日的大盘云图来看,其实很多中小股还是红色滴,绿的都是白马股们。

以下截图来自金融界网站-大盘云图:

python爬取股票最新数据并用excel绘制树状图的示例

那么,今天我们试着用python爬取最近交易日的股票数据,并试着用excel简单绘制以下上面这个树状图。本文旨在抛砖引玉,吼吼。

1. python爬取网易财经不同板块股票数据

目标网址:

http://quotes.money.163.com/old/#query=hy010000&DataType=HS_RANK&sort=PERCENT&order=desc&count=24&page=0

python爬取股票最新数据并用excel绘制树状图的示例

由于这个爬虫部分比较简单,这里不做过多赘述,仅介绍一下思路并附上完整代码供大家参考。

爬虫思路:

  1. 请求目标网站数据,解析出主要行业(新)的数据:行业板块名称及对应id(如金融,hy010000)
  2. 根据行业板块对应id构造新的行业股票数据网页
  3. 由于翻页网址不变,按照《》的里的套路找到股票列表数据的真实地址
  4. 代入参数,获取全部页数,然后翻页爬取全部数据

爬虫代码:

# -*- coding: utf-8 -*-
"""
Created Feb 28 10:30:56 2021

@author: 可以叫我才哥
"""

import requests
import re
import pandas as pd

# 获取全部板块及板块id
url = 'http://quotes.money.163.com/old/#query=hy001000&DataType=HS_RANK&sort=PERCENT&order=desc&count=24&page=0'

r = requests.get(url)

html = r.text
# 替换非字符为空,便于下面的正则
html = re.sub('\s','',html)
# 正则获取 板块及id所在区域
labelHtml = re.findall(r'</span>主要行业\(新\)</a>(.*?)</span>证监会行业\(新\)',html)[0]
# 正则板块和id,结果为由元组组成的列表
label = re.findall(r'"qid="(hy.*?)"qquery=.*?"title="(.*?)">',labelHtml)
# 转化为dataframe类型
dfLabel = pd.DataFrame(label,columns=['id','板块'])

# 根据板块id和翻页获取页面数据(json格式)
def get_json(hy_id, page):
 query = 'PLATE_IDS:' + str(hy_id)
 params={
  'host': 'http://quotes.money.163.com/hs/service/diyrank.php',
  'page': page,
  'query': query,
  'fields': 'NO,SYMBOL,NAME,PRICE,PERCENT,UPDOWN,FIVE_MINUTE,OPEN,YESTCLOSE,HIGH,LOW,VOLUME,TURNOVER,HS,LB,WB,ZF,PE,MCAP,TCAP,MFSUM,MFRATIO.MFRATIO2,MFRATIO.MFRATIO10,SNAME,CODE,ANNOUNMT,UVSNEWS', #你可以不用这么多字段
  'sort': 'PERCENT',
  'order': 'desc',
  'count': '24',
  'type': 'query',
  }
 url = 'http://quotes.money.163.com/hs/service/diyrank.php?'
 r = requests.get(url,params=params)
 j = r.json()
 
 return j

# 空列表用于存取每页数据
dfs = []
# 遍历全部板块
for hy_id,板块 in dfLabel.values:
 # 获取页数
 j = get_json(hy_id, 0)
 pages = j['pagecount']
 
 for page in range(pages):
  j = get_json(hy_id, page)
  data = j['list']
  df = pd.DataFrame(data)
  df['板块'] = 板块
  dfs.append(df)
 print(f'已爬取{len(dfs)}个板块数据')

result = pd.concat(dfs)

2. excel树状图

excel树状图是在office2016级之后版本中新加的图表类型,想要绘制需要基于此版本及之后的版本哦。

2.1. 简单的树状图

简单的树状图绘制流程:框选数据—>插入—>图表—>选中树状图 即可。

python爬取股票最新数据并用excel绘制树状图的示例

以下图为例,在树状图中,每个色块代表一个省份,色块面积大小则由其GDO值大小决定。

python爬取股票最新数据并用excel绘制树状图的示例

2.2. 带有增长率的树状图

我们发现,在基础的树状图中,色块颜色除了区别色块之外并没有其他特殊含义。拿GDP来说,除了值之外我们一般也会去看其增长率,那么是否可以让色块颜色和增长率有关联呢?

下面我们试着探究一下,如果成功的话,那么金融界的大盘云图似乎也可以用excel树状图来进行绘制了不是!

思路:

  1. 我们希望色块颜色能代表增长率,比如红色是上涨,绿色是下降且颜色越深代表绝对值越大
  2. 再对每个色块进行对应的颜色填充即可

由于 树状图顶多支持多级,色块颜色也只能手动单一填充,怎么办呢?既然手动可以,那么其实就可以用VBA自动化这个过程咯。

2.3.1. 增长率配色

基于思路1,我们需要对增长率进行配色,最简单的就是用条件格式里的色阶。

框选增长率数据—>开始—>条件格式—>色阶(选中那个让值越大颜色越红的,由于这里有负增长率,所以选了带红绿的):

python爬取股票最新数据并用excel绘制树状图的示例

为了更好的展示区分正负增长率,我们在设置完色阶后再进行管理规则:

  • 我们将中间值设为数字0,这样负增长率就是绿色,正增长率就是红色;
  • 我们将最大值设置为百分点值80,也就是增长率前80%的值都是最红的。

python爬取股票最新数据并用excel绘制树状图的示例

最终配色效果:

python爬取股票最新数据并用excel绘制树状图的示例

2.3.2. VBA填充色块颜色

先看效果:

湖北因为收到疫情影响最大,有接近小半年属于封省状态,全年增长率为负数。

python爬取股票最新数据并用excel绘制树状图的示例

由于条件格式下单元格颜色是不固定的无法通过vba获取,我们需要将颜色赋值到新的一列中去,需要用到如下操作:

**选中增长率数据复制,然后点击剪切板最右下角会出现剪贴板,再鼠标左键选择需要粘贴的地方如E2,点击剪贴板中需要粘贴的数据即可。**这个时候,被粘贴的单元格区域的颜色就是固定的了,你可以选择删除数据只留颜色部分。

python爬取股票最新数据并用excel绘制树状图的示例

VBA思路:

激活需要操作的图表(Activate)

遍历全部的系列和数据点(ActiveChart.FullSeriesCollection(1).Points.Count)

从第一个数据点开始,获取对应增长率单元格颜色(ActiveSheet.Range("E" & i + 1).Interior.Color)

将单元格赋值给该数据点(Selection.Format.Fill.ForeColor.RGB)

VBA代码:

Sub My_Color()
   
 ActiveSheet.ChartObjects("图表 1").Activate
 '遍历全部的数据点
 For i = 1 To ActiveChart.FullSeriesCollection(1).Points.Count
  '选中数据点
  ActiveChart.FullSeriesCollection(1).Points(i).Select
  '获取单元格颜色
  MyColor = ActiveSheet.Range("E" & i + 1).Interior.Color
  '将单元格颜色赋值给对应数据点填充色
  Selection.Format.Fill.ForeColor.RGB = MyColor
 Next

End Sub

执行脚本过程如下:

好了,以上就是本次全部内容,大家可以试着爬取股票数据,然后试着绘制一下。

温馨提示:接近小5000股票数据,vba填充色块颜色会卡死,不建议全选操作。

以上就是python爬取股票最新数据并用excel绘制树状图的示例的详细内容,更多关于python 爬取股票数据并绘图的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python获取一组数据里最大值max函数用法实例
May 26 Python
python字符串中的单双引
Feb 16 Python
Django rest framework实现分页的示例
May 24 Python
解决Python pandas df 写入excel 出现的问题
Jul 04 Python
一百多行python代码实现抢票助手
Sep 25 Python
python变量赋值方法(可变与不可变)
Jan 12 Python
python标识符命名规范原理解析
Jan 10 Python
python多线程实现代码(模拟银行服务操作流程)
Jan 13 Python
浅谈django channels 路由误导
May 28 Python
踩坑:pytorch中eval模式下结果远差于train模式介绍
Jun 23 Python
如何在python中实现线性回归
Aug 10 Python
Python自动发送和收取邮件的方法
Aug 12 Python
python中openpyxl和xlsxwriter对Excel的操作方法
Mar 01 #Python
python中random模块详解
Mar 01 #Python
利用python实现汉诺塔游戏
Mar 01 #Python
python绘制汉诺塔
Mar 01 #Python
彻底解决pip下载pytorch慢的问题方法
Mar 01 #Python
Python 里最强的地图绘制神器
Mar 01 #Python
Python的collections模块真的很好用
Mar 01 #Python
You might like
PHP获取一个字符串中间一部分字符的方法
2014/08/19 PHP
PHP页面输出时js设置input框的选中值
2016/09/30 PHP
PHP连接MySQL进行增、删、改、查操作
2017/02/19 PHP
PHP实现在数据库百万条数据中随机获取20条记录的方法
2017/04/19 PHP
Laravel下生成验证码的类
2017/11/15 PHP
使用laravel指定日志文件记录任意日志
2019/10/17 PHP
thinkphp5.1框架模板赋值与变量输出示例
2020/05/25 PHP
jQuery点击后一组图片左右滑动的实现代码
2012/08/16 Javascript
js 判断控件获得焦点的示例代码
2014/03/04 Javascript
深入分析Javascript跨域问题
2015/04/17 Javascript
js实现可键盘控制的简单抽奖程序
2016/07/13 Javascript
bootstrap表格分页实例讲解
2016/12/30 Javascript
js实现网页的两个input标签内的数值加减(示例代码)
2017/08/15 Javascript
angularjs http与后台交互的实现示例
2018/12/21 Javascript
JS尾递归的实现方法及代码优化技巧
2019/01/19 Javascript
JavaScript Date对象功能与用法学习记录
2020/04/28 Javascript
JS变量提升原理与用法实例浅析
2020/05/22 Javascript
ES6中的类(Class)示例详解
2020/12/09 Javascript
[57:28]2018DOTA2亚洲邀请赛 4.6 淘汰赛 TNC vs Liquid 第一场
2018/04/10 DOTA
[53:38]OG vs LGD 2018国际邀请赛淘汰赛BO3 第三场 8.26
2018/08/30 DOTA
[01:09:23]KG vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
简单谈谈Python流程控制语句
2016/12/04 Python
分析python动态规划的递归、非递归实现
2018/03/04 Python
在Python中分别打印列表中的每一个元素方法
2018/11/07 Python
Python反爬虫技术之防止IP地址被封杀的讲解
2019/01/09 Python
Python如何爬取微信公众号文章和评论(基于 Fiddler 抓包分析)
2019/06/28 Python
python多项式拟合之np.polyfit 和 np.polyld详解
2020/02/18 Python
super()与this()的区别
2016/01/17 面试题
软件工程师岗位职责
2013/11/16 职场文书
幼儿园元旦家长感言
2014/02/27 职场文书
大四学生找工作的自荐信
2014/03/27 职场文书
教师求职信怎么写
2015/03/20 职场文书
企业培训简报范文
2015/07/20 职场文书
2019年个人工作总结范文(3篇)
2019/08/27 职场文书
FFmpeg视频处理入门教程(新手必看)
2022/01/22 杂记
为什么MySQL不建议使用SELECT *
2022/04/03 MySQL