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中装饰器的一个妙用
Feb 08 Python
Python selenium文件上传方法汇总
Nov 19 Python
Python连接数据库学习之DB-API详解
Feb 07 Python
python2 与python3的print区别小结
Jan 16 Python
通过cmd进入python的实例操作
Jun 26 Python
python交互模式下输入换行/输入多行命令的方法
Jul 02 Python
python如何爬取网站数据并进行数据可视化
Jul 08 Python
python 检查数据中是否有缺失值,删除缺失值的方式
Dec 02 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
Dec 04 Python
Matplotlib 折线图plot()所有用法详解
Jul 28 Python
详解anaconda安装步骤
Nov 23 Python
python 如何获取页面所有a标签下href的值
May 06 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 str_pad() 将字符串填充成指定长度的字符串
2010/02/23 PHP
PHP页面实现定时跳转的方法
2014/10/31 PHP
php安装扩展mysqli的实现步骤及报错解决办法
2017/09/23 PHP
JavaScript 学习笔记(十四) 正则表达式
2010/01/22 Javascript
禁止拷贝网页内容的js代码
2014/01/22 Javascript
使用jQuery异步加载 JavaScript脚本解决方案
2014/04/20 Javascript
jquery实现通用版鼠标经过淡入淡出效果
2014/06/15 Javascript
jQuery实现html表格动态添加新行的方法
2015/05/28 Javascript
WebSocket+node.js创建即时通信的Web聊天服务器
2016/08/08 Javascript
深入理解React中es6创建组件this的方法
2016/08/29 Javascript
jQuery实现鼠标滑过图片移动特效
2016/12/08 Javascript
vue、react等单页面项目应该这样子部署到服务器
2018/01/03 Javascript
Javascript迭代、递推、穷举、递归常用算法实例讲解
2019/02/01 Javascript
layui使用templet格式化表格数据的方法
2019/09/16 Javascript
jQuery实现手风琴特效
2021/01/11 jQuery
Python sys.path详细介绍
2013/10/17 Python
基于Python中单例模式的几种实现方式及优化详解
2018/01/09 Python
Python Flask基础教程示例代码
2018/02/07 Python
numpy给array增加维度np.newaxis的实例
2018/11/01 Python
对python_discover方法遍历所有执行的用例详解
2019/02/13 Python
Python Django搭建网站流程图解
2020/06/13 Python
对python中list的五种查找方法说明
2020/07/13 Python
HTML5的自定义属性data-*详细介绍和JS操作实例
2014/04/10 HTML / CSS
编码实现字符串转整型的函数
2012/06/02 面试题
艺术爱好者的自我评价分享
2013/10/08 职场文书
乡镇干部十八大感言
2014/02/17 职场文书
工程造价专业大学生职业规划范文
2014/03/09 职场文书
校园环保建议书
2014/05/14 职场文书
心得体会的写法
2014/09/05 职场文书
领导干部作风建设总结
2014/10/23 职场文书
安全先进班组材料
2014/12/26 职场文书
鼋头渚导游词
2015/02/05 职场文书
最美乡村教师观后感
2015/06/11 职场文书
初中团支书竞选稿
2015/11/21 职场文书
用Python将GIF动图分解成多张静态图片
2021/06/11 Python
python字符串拼接.join()和拆分.split()详解
2021/11/23 Python