一、摘要:
本选题应用Python网络爬虫方法,在东方财富网站爬取个股资金流实时数据,通过数据可视化,展现各企业当日股价、涨跌率、净额度、主力净流入情况。
二、选题背景:
随着社会的高速发展,股票作为股份公司为筹建资金而发行的一种有价证券,是证明投资者投资入股并据以获取股利收入的一种股权凭证,早已走进千家万户,成为许多家庭投资的重要目标。股票投资已成为老百姓日常谈论的热门话题,但股票具有高收益、高风险的特点,所以在“炒股”过程中需要异常谨慎。
身为学习Python数据处理编程的人来说,最为清楚图形中的奥秘:一张好的可视化图形,不仅能够直观的表现出事物的现象,还能够揭示现象背后的本质;而一张差强人意的可视化图,却会给人以误导,蒙蔽现象背后的本质。在当今信息化时代,涌现了许多关于”炒股”的软件,有些股票软件数据杂乱无章,图表信息量大且不能简单明了,并不能为炒股人带去帮助。制作合适的图形来展示股市的变化信息对”炒股”来说尤为重要。在学习本课程中,学习到了一些网络爬虫和数据可视化的相关知识,利用这些知识绘制一些关于每天股市变化的相关信息,帮助炒股人规避一定的风险。
三、数据说明:
爬取东方财富网实时更新的企业资金流向数据,绘制股票价格条形图、涨跌幅折线图、净额饼图,展现各企业当天的股票行情。
四、实施过程及代码:
1、企业当日个股资金流数据情况:
(1)数据爬取
1 import requests 2 import json 3 import matplotlib.pyplot as plt 4 import pandas as pd 5 from bs4 import BeautifulSoup 6 7 #设置浏览器对象 8 headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"} 9 10 #headers=headers表示伪装浏览器访问 11 resp=requests.get("http://push2.eastmoney.com/api/qt/clist/get?pn=1&pz=50&po=1&np=1&ut=b2884a393a59ad64002292a3e90d46a5&fltt=2&invt=2&fid0=f4001&fid=f62&fs=m:0+t:6+f:!2,m:0+t:13+f:!2,m:0+t:80+f:!2,m:1+t:2+f:!2,m:1+t:23+f:!2,m:0+t:7+f:!2,m:1+t:3+f:!2&stat=1&fields=f12,f14,f2,f3,f62,f184,f66,f69,f72,f75,f78,f81,f84,f87,f204,f205,f124&rt=53597607&cb=jQuery18303181849503270513_1607928142376&_=1607928235420",headers=headers)#headers=headers表示伪装浏览器访问 12 13 #print(resp.text) #输出网页内容 14 #把网页内容存入content变量 15 content=resp.text 16 17 #去掉前后不是大括号内的代码 18 rest=content.replace(\'jQuery18303181849503270513_1607928142376(\',\'\').replace(\');\',\'\') #去掉前后不是大括号内的代码 19 20 #rest 21 #将代码通过json库载入,成为键值对的形式 22 resp_dict=json.loads(rest) 23 24 #提取data里diff列表内容 25 datas=resp_dict.get(\'data\').get(\'diff\') 26 27 #输出网页内容 28 print(datas)
(2)数据集构建
1 #构建数据集 2 companies=[] 3 prices=[] 4 shares_1=[] 5 uds=[] 6 moneys=[] 7 8 #遍历datas内容 9 for data in datas: 10 11 #公司名 12 company=data.get(\'f14\') 13 14 #今日主力净流入 净占比 15 share_1=data.get(\'f184\') 16 17 #净额 18 money=data.get(\'f62\') 19 20 #当日涨跌幅 21 ud=data.get(\'f3\') 22 23 #当天股价 24 price=data.get(\'f2\') 25 26 #把公司数据追加到companies 27 companies.append(company) 28 29 #把股价数据追加到prices 30 prices.append(price) 31 32 #把净额数据追加到moneys 33 moneys.append(money) 34 35 #把净占比追加到shares_1 36 shares_1.append(share_1) 37 38 #把涨跌幅数据追加到uds 39 uds.append(ud)
(3)储存数据、读取csv文件、检测缺失值
1 #设置数据存储 2 aa={"公司名称":companies,"最新股票价格":prices,"涨跌幅":uds,"净额":moneys,"净占比":shares_1} 3 4 #创建二维数据表,aa数据存入 5 df=pd.DataFrame(aa) 6 7 #检查是否有缺失值 8 df.isnull()
1 #数据保存为gupiao.csv文件,取消索引,编码为utf-8 2 df.to_csv("gupiao.csv",index=False,encoding=\'utf-8\') 3 4 #读取gupiao.csv文件,构建数据框province_df 5 province_df= pd.read_csv(r"个股资金流数据.csv", sep=",",encoding=\'utf-8\')
2、当日股价前十公司对比(条形图):
1 from pyecharts.charts import Bar 2 import numpy as np 3 import matplotlib.pyplot as plt 4 5 # 解决中文问题 6 plt.rcParams[\'font.sans-serif\'] = [\'SimHei\'] 7 8 #对原始数据集按照股票价格降序排列 9 province_sorted = province_df.sort_values(by = \'最新股票价格\', ascending = False) 10 11 #把公司名称数据存入列表a 12 a=province_sorted[\'公司名称\'] 13 14 #把最新股票价格数据存入列表b 15 b=province_sorted[\'最新股票价格\'] 16 17 #绘制区域大小 18 plt.figure(figsize=(12,6)) 19 20 #取a列表前10条数据 21 x=a[:10] 22 23 #取b列表前10条数据 24 y=b[:10] 25 26 #设置标题内容 27 plt.title(\'当日前十股票最高价公司对比图\',fontsize=14,color=\'red\') 28 29 #设置x坐标标签,字体大小 30 plt.xlabel(\'公司名称\',fontsize=15) 31 32 #设置x坐标标签,字体大小 33 plt.ylabel(\'股票价/元\',fontsize=15) 34 35 #显示图形 36 plt.bar(x, y) 37 38 #循环为图形添加数据注释 39 for x,y in zip(x,y): 40 plt.text(x, y, \'%.2f\' % y, ha=\'center\', va= \'bottom\',fontsize=15,color=\'b\')
运行后的条形图如下:
3、各企业股票涨跌幅比较(折线图):
1 #把涨跌幅数据存入列表c 2 c=province_sorted[\'涨跌幅\'] 3 4 ##绘制区域大小 5 fig=plt.figure(dpi=100,figsize=(10,6)) 6 7 #绘制一行两列的子图,第一张图 8 ax1 = plt.subplot(1,2,1) 9 10 #获取前15条公司数据 11 x=a[:15] 12 13 #获取前15条涨跌幅数据 14 y=c[:15] 15 16 #为图形添加标题,字体大小,颜色 17 plt.title(\'今日股票价1~15名公司涨跌幅比较图\',fontsize=10,color=\'r\') 18 19 #设置x坐标标签 20 plt.xlabel(\'公司名称\') 21 22 #设置y坐标标签 23 plt.ylabel(\'涨跌幅\%\') 24 25 #设置x轴数据字体大小 26 plt.xticks(fontsize=8) 27 28 #设置y轴数据字体大小 29 plt.yticks(fontsize=8) 30 31 #设置x轴数据斜显示 32 fig.autofmt_xdate() 33 34 #绘制图形,洋红色,点形状标记v,线形状-- 35 plt.plot(x,y, color=\'m\', marker=\'v\',linestyle = "--") 36 37 #添加网格背景,透明度为0.5,样式为-- 38 plt.grid(alpha=0.5,linestyle=\'--\') 39 40 #绘制一行两列的子图,第二张图 41 ax2 = plt.subplot(1,2,2) 42 43 #获取15-30条公司数据 44 x1=a[15:30] 45 46 #获取15-30条涨跌幅数据 47 y1=c[15:30] 48 49 #为图形添加标题,字体大小,颜色 50 plt.title(\'今日股票价15~30名公司涨跌幅比较图\',fontsize=10,color=\'r\') 51 52 #设置x坐标标签 53 plt.xlabel(\'公司名称\') 54 55 #设置y坐标标签 56 plt.ylabel(\'涨跌率\%\') 57 58 #设置x轴数据字体大小 59 plt.xticks(fontsize=8) 60 61 #设置y轴数据字体大小 62 plt.yticks(fontsize=8) 63 64 #设置x轴数据斜显示 65 fig.autofmt_xdate() 66 67 #绘制图形,青色,点形状标记v,线形状: 68 plt.plot(x1,y1, color=\'c\', marker=\'p\',linestyle = ":") 69 70 #添加网格背景,透明度为0.5,样式为-- 71 plt.grid(alpha=0.5,linestyle=\'--\')
运行后的折线图如下:
4、股价前10公司净额比例对比(饼图):
1 #把净额数据存入列表d 2 d=province_sorted[\'净额\']/100000000 3 4 #提取前10公司数据 5 x=a[:10] 6 7 #提取前10净额数据 8 y=d[:10] 9 10 #设置各项距离圆心n个半径 11 explode=[0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04] 12 13 #为图形添加标题,pad设置位置 14 plt.title(\'当日股价前10公司净额比例对比图\',fontsize=20,pad=130) 15 16 #绘制饼图,百分率,大小 17 plt.pie(y,explode=explode,labels=x,autopct=\'%1.2f%%\',radius=2,textprops={\'fontsize\':10}) 18 19 #绘制图例,图例位置 20 plt.legend(loc=\'upper left\', bbox_to_anchor=(1.7, 1.5)) 21 22 #显示图形 23 plt.show()
运行后的饼图如下:
完整代码:
1 import requests 2 import json 3 import matplotlib.pyplot as plt 4 import pandas as pd 5 from bs4 import BeautifulSoup 6 7 #设置浏览器对象 8 headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"} 9 10 #headers=headers表示伪装浏览器访问 11 resp=requests.get("http://push2.eastmoney.com/api/qt/clist/get?pn=1&pz=50&po=1&np=1&ut=b2884a393a59ad64002292a3e90d46a5&fltt=2&invt=2&fid0=f4001&fid=f62&fs=m:0+t:6+f:!2,m:0+t:13+f:!2,m:0+t:80+f:!2,m:1+t:2+f:!2,m:1+t:23+f:!2,m:0+t:7+f:!2,m:1+t:3+f:!2&stat=1&fields=f12,f14,f2,f3,f62,f184,f66,f69,f72,f75,f78,f81,f84,f87,f204,f205,f124&rt=53597607&cb=jQuery18303181849503270513_1607928142376&_=1607928235420",headers=headers)#headers=headers表示伪装浏览器访问 12 13 #print(resp.text) #输出网页内容 14 #把网页内容存入content变量 15 content=resp.text 16 17 #去掉前后不是大括号内的代码 18 rest=content.replace(\'jQuery18303181849503270513_1607928142376(\',\'\').replace(\');\',\'\') #去掉前后不是大括号内的代码 19 20 #rest 21 #将代码通过json库载入,成为键值对的形式 22 resp_dict=json.loads(rest) 23 24 #提取data里diff列表内容 25 datas=resp_dict.get(\'data\').get(\'diff\') 26 27 #输出网页内容 28 print(datas) 29 30 #构建数据集 31 companies=[] 32 prices=[] 33 shares_1=[] 34 uds=[] 35 moneys=[] 36 37 #遍历datas内容 38 for data in datas: 39 40 #公司名 41 company=data.get(\'f14\') 42 43 #今日主力净流入 净占比 44 share_1=data.get(\'f184\') 45 46 #净额 47 money=data.get(\'f62\') 48 49 #当日涨跌幅 50 ud=data.get(\'f3\') 51 52 #当天股价 53 price=data.get(\'f2\') 54 55 #把公司数据追加到companies 56 companies.append(company) 57 58 #把股价数据追加到prices 59 prices.append(price) 60 61 #把净额数据追加到moneys 62 moneys.append(money) 63 64 #把净占比追加到shares_1 65 shares_1.append(share_1) 66 67 #把涨跌幅数据追加到uds 68 uds.append(ud) 69 70 #设置数据存储 71 aa={"公司名称":companies,"最新股票价格":prices,"涨跌幅":uds,"净额":moneys,"净占比":shares_1} 72 73 #创建二维数据表,aa数据存入 74 df=pd.DataFrame(aa) 75 76 #检查是否有缺失值 77 df.isnull() 78 79 #数据保存为gupiao.csv文件,取消索引,编码为utf-8 80 df.to_csv("gupiao.csv",index=False,encoding=\'utf-8\') 81 82 #读取gupiao.csv文件,构建数据框province_df 83 province_df= pd.read_csv(r"个股资金流数据.csv", sep=",",encoding=\'utf-8\') 84 85 from pyecharts.charts import Bar 86 import numpy as np 87 import matplotlib.pyplot as plt 88 89 # 解决中文问题 90 plt.rcParams[\'font.sans-serif\'] = [\'SimHei\'] 91 92 #对原始数据集按照股票价格降序排列 93 province_sorted = province_df.sort_values(by = \'最新股票价格\', ascending = False) 94 95 #把公司名称数据存入列表a 96 a=province_sorted[\'公司名称\'] 97 98 #把最新股票价格数据存入列表b 99 b=province_sorted[\'最新股票价格\'] 100 101 #绘制区域大小 102 plt.figure(figsize=(12,6)) 103 104 #取a列表前10条数据 105 x=a[:10] 106 107 #取b列表前10条数据 108 y=b[:10] 109 110 #设置标题内容 111 plt.title(\'当日前十股票最高价公司对比图\',fontsize=14,color=\'red\') 112 113 #设置x坐标标签,字体大小 114 plt.xlabel(\'公司名称\',fontsize=15) 115 116 #设置x坐标标签,字体大小 117 plt.ylabel(\'股票价/元\',fontsize=15) 118 119 #显示图形 120 plt.bar(x, y) 121 122 #循环为图形添加数据注释 123 for x,y in zip(x,y): 124 plt.text(x, y, \'%.2f\' % y, ha=\'center\', va= \'bottom\',fontsize=15,color=\'b\') 125 126 #把涨跌幅数据存入列表c 127 c=province_sorted[\'涨跌幅\'] 128 129 ##绘制区域大小 130 fig=plt.figure(dpi=100,figsize=(10,6)) 131 132 #绘制一行两列的子图,第一张图 133 ax1 = plt.subplot(1,2,1) 134 135 #获取前15条公司数据 136 x=a[:15] 137 138 #获取前15条涨跌幅数据 139 y=c[:15] 140 141 #为图形添加标题,字体大小,颜色 142 plt.title(\'今日股票价1~15名公司涨跌幅比较图\',fontsize=10,color=\'r\') 143 144 #设置x坐标标签 145 plt.xlabel(\'公司名称\') 146 147 #设置y坐标标签 148 plt.ylabel(\'涨跌幅\%\') 149 150 #设置x轴数据字体大小 151 plt.xticks(fontsize=8) 152 153 #设置y轴数据字体大小 154 plt.yticks(fontsize=8) 155 156 #设置x轴数据斜显示 157 fig.autofmt_xdate() 158 159 #绘制图形,洋红色,点形状标记v,线形状-- 160 plt.plot(x,y, color=\'m\', marker=\'v\',linestyle = "--") 161 162 #添加网格背景,透明度为0.5,样式为-- 163 plt.grid(alpha=0.5,linestyle=\'--\') 164 165 #绘制一行两列的子图,第二张图 166 ax2 = plt.subplot(1,2,2) 167 168 #获取15-30条公司数据 169 x1=a[15:30] 170 171 #获取15-30条涨跌幅数据 172 y1=c[15:30] 173 174 #为图形添加标题,字体大小,颜色 175 plt.title(\'今日股票价15~30名公司涨跌幅比较图\',fontsize=10,color=\'r\') 176 177 #设置x坐标标签 178 plt.xlabel(\'公司名称\') 179 180 #设置y坐标标签 181 plt.ylabel(\'涨跌率\%\') 182 183 #设置x轴数据字体大小 184 plt.xticks(fontsize=8) 185 186 #设置y轴数据字体大小 187 plt.yticks(fontsize=8) 188 189 #设置x轴数据斜显示 190 fig.autofmt_xdate() 191 192 #绘制图形,青色,点形状标记v,线形状: 193 plt.plot(x1,y1, color=\'c\', marker=\'p\',linestyle = ":") 194 195 #添加网格背景,透明度为0.5,样式为-- 196 plt.grid(alpha=0.5,linestyle=\'--\') 197 198 #把净额数据存入列表d 199 d=province_sorted[\'净额\']/100000000 200 201 #提取前10公司数据 202 x=a[:10] 203 204 #提取前10净额数据 205 y=d[:10] 206 207 #设置各项距离圆心n个半径 208 explode=[0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04,0.04] 209 210 #为图形添加标题,pad设置位置 211 plt.title(\'当日股价前10公司净额比例对比图\',fontsize=20,pad=130) 212 213 #绘制饼图,百分率,大小 214 plt.pie(y,explode=explode,labels=x,autopct=\'%1.2f%%\',radius=2,textprops={\'fontsize\':10}) 215 216 #绘制图例,图例位置 217 plt.legend(loc=\'upper left\', bbox_to_anchor=(1.7, 1.5)) 218 219 #显示图形 220 plt.show()
五、案例自评:
股票是当代社会最重要的投资方式之一,深受人们的欢迎。作为一名软件工程专业的学生,在学习完Python数据处理编程后,借助Python工具,处理股市中对股民具有参考价值的数据,是我本次的目标。通过各类可视化图形的绘制,帮助股民
分析股市行情,及时加仓或者卖出。
(1)创新性
市面上的相关炒股软件,大部分并不能直观的为股民带来有用的数据消息,且有的软件并没有及时更新数据。Python有着”流程可控、工作高效、丰富的库”的特点,使用Python分析股市数据,可以大大提高数据处理的效率,实时更新股市情况,快速
的获取炒股所需要的数据信息,分析股票行情。
与使用传统的作图软件相比,使用Python中绘制的各类数据图形更加简便美观,效率也更加快。
(2)实用性
通过Python进行数据处理,大大提高了获取数据的效率。将网络爬虫和数据可视化结合起来,把获取到的数据进行可视化,能够使我们快速、高效的得到有帮助的信息。使用Python进行股市数据分析,可以极大程度上帮助股民规避一定的风险,也可
以帮助刚接触炒股的股民快速上手。该思路可以应用到许多其他的领域的实时数据展示,比如:天气情况、房子信息、用户网上消费情况等。