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 XML RPC服务器端和客户端实例
Nov 22 Python
简单的python协同过滤程序实例代码
Jan 31 Python
Python 删除整个文本中的空格,并实现按行显示
Jul 24 Python
对python生成业务报表的实例详解
Feb 03 Python
Python3 log10()函数简单用法
Feb 19 Python
详解python内置常用高阶函数(列出了5个常用的)
Feb 21 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
May 22 Python
python属于解释语言吗
Jun 11 Python
解决Keras中Embedding层masking与Concatenate层不可调和的问题
Jun 18 Python
python如何求圆的面积
Jul 01 Python
python可视化大屏库big_screen示例详解
Nov 23 Python
Python中np.random.randint()参数详解及用法实例
Sep 23 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
MYSQL 小技巧 -- LAST_INSERT_ID
2009/11/24 PHP
PHP+MySQL实现的简单投票系统实例
2016/02/24 PHP
PHP+Ajax实现的检测用户名功能简单示例
2019/02/12 PHP
PHP isset()及empty()用法区别详解
2020/08/29 PHP
JSP跨iframe如何传递参数实现代码
2013/09/21 Javascript
深入学习JavaScript对象
2015/10/13 Javascript
jquery实现左右无缝轮播图
2020/07/31 Javascript
JS限制输入框输入的实现代码
2018/07/02 Javascript
微信小程序时间选择插件使用详解
2018/12/28 Javascript
使用Angular Cli如何创建Angular私有库详解
2019/01/30 Javascript
node Buffer缓存区常见操作示例
2019/05/04 Javascript
[48:24]完美世界DOTA2联赛循环赛LBZS vs Forest 第一场 10月30日
2020/10/31 DOTA
详细解析Python中的变量的数据类型
2015/05/13 Python
python使用KNN算法手写体识别
2018/02/01 Python
用Python实现筛选文件脚本的方法
2018/10/27 Python
python DataFrame转dict字典过程详解
2019/12/26 Python
如何使用PyCharm引入需要使用的包的方法
2020/09/22 Python
Sublime Text3最新激活注册码分享适用2020最新版 亲测可用
2020/11/12 Python
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
HTML5实现一个能够移动的小坦克示例代码
2013/09/02 HTML / CSS
匡威比利时官网:Converse Belgium
2017/04/13 全球购物
城市观光通行证:The Sightseeing Pass
2018/04/28 全球购物
STP的判定过程
2012/10/01 面试题
介绍一下OSI七层模型
2012/07/03 面试题
理工科学生的自我评价
2013/12/15 职场文书
宣传策划类求职信范文
2014/01/31 职场文书
博士生求职信
2014/07/06 职场文书
单位委托书格式范本
2014/09/29 职场文书
经理助理岗位职责
2015/02/02 职场文书
电气工程师岗位职责
2015/02/12 职场文书
小学教师自我评价
2015/03/04 职场文书
2015年推普周活动方案
2015/05/06 职场文书
中秋节晚会开场白
2015/05/29 职场文书
初任公务员培训心得体会
2016/01/08 职场文书
《合作意向书》怎么写?
2019/08/20 职场文书
人民币符号
2022/02/17 杂记