【python爬虫课程设计】东方股票——数据爬虫+数据可视化
【python爬虫课程设计】东方股票——数据爬虫+数据可视化
一、选题的背景
近年来,东方股票作为中国股市的一部分,其行业地位和影响力较大。在股票市场中,数据的跨度和周期对于投资决策至关重要。本此研究的目标是通过对东方股票数据爬虫,可以有效地获取和分析这些数据,从而帮助投资者做出更明智的投资决策。东方股票的交易数据和信息披露比较完善,这些数据和信息可以为投资者提供较为准确的市场分析和预测,可以更加深入地了解市场的运行规律和趋势。掌握股票投资不仅可以促进中国社会经济的发展,还能激发全民、全社会对股票的热情,提升中国股市的规模和技术水平。因此,此次研究旨在通过数据挖掘和分析的方法,发现股票市场的周期和规律,以实现最大的投资获益。同时,这一研究也有助于提升中国股市的规模和技术水平,推动中国社会经济的发展。
二、主题式网络爬虫设计方案
1.名称:东方股票数据爬虫+数据可视化
2.爬取的数据内容:股票名称,股票代码, 最新价, 涨跌幅, 涨跌额,成交量,成交额, 振幅, 换手率, 市盈率, 量比, 最高, 最低, 今开,昨收, 市净率, 60日涨跌幅, 年初至今涨跌幅, 总市值, 流通市值, 五分钟涨跌。
3.爬虫设计方案概述:本次案例使用request对东方股票进行爬取,使用xlutils对excel文件进行处理,之后使用pandas、pyecharts、jieba对数据进行可视化
4.技术难点:东方股票数据庞大,需要爬虫技术能够高效地获取和处理大量数据,同时要考虑到数据更新的频率和实时性,也要预防访问检测。
三、数据源
我选择share certificate数据集作为实验,数据集(https://quote.eastmoney.com/center/gridlist.html#hs_a_board),该数据集包含股票名称,股票代码, 最新价, 涨跌幅, 涨跌额,成交量,成交额, 振幅, 换手率, 市盈率, 量比, 最高, 最低, 今开,昨收, 市净率, 60日涨跌幅, 年初至今涨跌幅, 总市值, 流通市值, 五分钟涨跌。
四、主题式页面结构分析
1.主题页面的结构与特征分析

东方股票主题页面由多个部分组成,包括导航栏、轮播图、热门板块、自选股、行情走势、资讯等。导航栏位于页面右上角,提供了网站的主要功能入口;轮播图展示了一些重要的股票信息和市场动态;热门板块列出了当前市场上最热门的股票板块;自选股是用户可以自定义的股票列表;行情走势展示了股票的价格走势图表;资讯则提供了最新的股票市场新闻和分析。
2.Htmls 页面解析

3.节点(标签)查找方法与遍历方法
通过data,keys()获取字典键再对其索引遍历,通过get_data获取各国数据,索引前先对data进行分析数据的索引字符串,再通过遍历对需要数据爬取添加。
四、网络爬虫设计
1.爬取到的数据

2.代码实现
将爬虫方法封装为类Spider_XieCheng,在对爬取到的数据进行逐条解析时顺便进行数据清洗
get_data方法:设置请求头以及规则和cookie,发起请求,获取响应数据
analyze_data方法:对传入的数据进行逐条解析,把股票内容进行处理(提前进行数据清洗以方便后面数据可视化绘制图形)
save_excel方法:将传入的数据存储到excel
import json import requests, time from tkinter import * import xlrd, xlwt, os from xlutils.copy import copy class GuPiao(): def __init__(self): self.num = 0 # 爬虫部分 def spider(self): for page in range(1,21): #这个地方可以页数增加数据 start_url = 'https://83.push2.eastmoney.com/api/qt/clist/get' headers = { 'Accept': '*/*', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', # Requests sorts cookies= alphabetically # 'Cookie': 'qgqp_b_id=ffb939776279b0bdd1f6e61281c3c294; st_si=89921490520325; websitepoptg_api_time=1700894106860; websitepoptg_show_time=1700894107214; HAList=ty-1-600789-%u9C81%u6297%u533B%u836F%2Cty-1-600519-%u8D35%u5DDE%u8305%u53F0%2Cty-0-000858-%u4E94%20%u7CAE%20%u6DB2%2Cty-0-002456-%u6B27%u83F2%u5149; st_asi=delete; st_pvi=61091067222435; st_sp=2023-11-03%2018%3A10%3A35; st_inirUrl=https%3A%2F%2Fwww.baidu.com%2Flink; st_sn=5; st_psi=20231125143800994-113200301321-8038820015', 'Pragma': 'no-cache', 'Referer': 'https://quote.eastmoney.com/center/gridlist.html', 'Sec-Fetch-Dest': 'script', 'Sec-Fetch-Mode': 'no-cors', 'Sec-Fetch-Site': 'same-site', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36', 'sec-ch-ua': '"Google Chrome";v="119", "Chromium";v="119", "Not?A_Brand";v="24"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', } fomdata = { 'cb': 'jQuery1124001114974346054809_1700894280689', 'pn': page, 'pz': '20', 'po': '1', 'np': '1', 'ut': 'bd1d9ddb04089700cf9c27f6f7426281', 'fltt': '2', 'invt': '2', 'wbp2u': '|0|0|0|web', 'fid': 'f3', 'fs': 'm:0 t:6,m:0 t:80,m:1 t:2,m:1 t:23,m:0 t:81 s:2048', 'fields': 'f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152', '_': '1700894280699' } response = requests.get(url=start_url, headers=headers, params=fomdata).text response = re.findall('jQuery1124001114974346054809_1700894280689\((.*?)\);', response)[0] response = json.loads(response) datas = response['data']['diff'] time.sleep(2) self.parase_data(datas) # 解析部分 def parase_data(self, datas): for data in datas: # 0、序号 self.num += 1 # 1、最新价 zuixingjia = data['f2'] # 2、涨跌幅 diezhangfu = str(data['f3']) + '%' # 3、涨跌额 diezhange = data['f4'] # 4、成交量(手) chengjiaoliang = data['f5'] # 5、成交额 chengjiaoe = data['f6'] # 6、振幅 zhengfu = str(data['f7']) + '%' # 7、换手率 huanshoulv = str(data['f8']) + '%' # 8、市盈率 shiyinglv = data['f9'] # 9、量比 liangbi = data['f10'] # 10、股票代码 diama = data['f12'] # 11、股票名称 name = data['f14'] # 12、最高 zuigao = data['f15'] # 13、最低 zuidi = data['f16'] # 14、今开 jinkai = data['f17'] # 15、昨收 zuoshou = data['f18'] # 16、市净率 jinshilv = data['f23'] # 17、60日涨跌幅 liushirezhangdiefu = str(data['f24']) + '%' # 18、年初至今涨跌幅 nianchuzhijinzhangdiefu = str(data['f25']) + '%' # 19、总市值 zongshizhi = data['f20'] # 20流通市值 liutongshizhi = data['f21'] # 21、五分钟涨跌 wufenzhongzhangdie = str(data['f11']) + '%' data = { f'股票数据': [self.num, name, diama, zuixingjia, diezhangfu, diezhange, chengjiaoliang, chengjiaoe, zhengfu, huanshoulv, shiyinglv, liangbi, zuigao, zuidi, jinkai, zuoshou, jinshilv, liushirezhangdiefu, nianchuzhijinzhangdiefu, zongshizhi, liutongshizhi, wufenzhongzhangdie] } gupiao_dict = { '序号': self.num, '股票名称': name, '股票代码': diama, '最新价': zuixingjia, '涨跌幅': diezhangfu, '涨跌额': diezhange, '成交量(手)': chengjiaoliang, '成交额': chengjiaoe, '振幅': zhengfu, '换手率': huanshoulv, '市盈率': shiyinglv, '量比': liangbi, '最高': zuigao, '最低': zuidi, '今开': jinkai, '昨收': zuoshou, '市净率': zuoshou, '60日涨跌幅': liushirezhangdiefu, '年初至今涨跌幅': nianchuzhijinzhangdiefu, '总市值': zongshizhi, '流通市值': liutongshizhi, '五分钟涨跌': wufenzhongzhangdie } print(gupiao_dict) self.chucun_excel(data) # 储存部分 def chucun_excel(self, data): if not os.path.exists(f'股票数据.xls'): # 1、创建 Excel 文件 wb = xlwt.Workbook(encoding='utf-8') # 2、创建新的 Sheet 表 sheet = wb.add_sheet(f'股票数据', cell_overwrite_ok=True) # 3、设置 Borders边框样式 borders = xlwt.Borders() borders.left = xlwt.Borders.THIN borders.right = xlwt.Borders.THIN borders.top = xlwt.Borders.THIN borders.bottom = xlwt.Borders.THIN borders.left_colour = 0x40 borders.right_colour = 0x40 borders.top_colour = 0x40 borders.bottom_colour = 0x40 style = xlwt.XFStyle() # Create Style style.borders = borders # Add Borders to Style # 4、写入时居中设置 align = xlwt.Alignment() align.horz = 0x02 # 水平居中 align.vert = 0x01 # 垂直居中 style.alignment = align # 5、设置表头信息, 遍历写入数据, 保存数据 header = ( '序号', '股票名称', '股票代码', '最新价', '涨跌幅', '涨跌额', '成交量(手)', '成交额', '振幅', '换手率', '市盈率', '量比', '最高', '最低', '今开', '昨收', '市净率', '60日涨跌幅', '年初至今涨跌幅', '总市值', '流通市值', '五分钟涨跌') for i in range(0, len(header)): sheet.col(i).width = 2560 * 3 # 行,列, 内容, 样式 sheet.write(0, i, header[i], style) wb.save(f'股票数据.xls') # 判断工作表是否存在 if os.path.exists(f'股票数据.xls'): # 打开工作薄 wb = xlrd.open_workbook(f'股票数据.xls') # 获取工作薄中所有表的个数 sheets = wb.sheet_names() for i in range(len(sheets)): for name in data.keys(): worksheet = wb.sheet_by_name(sheets[i]) # 获取工作薄中所有表中的表名与数据名对比 if worksheet.name == name: # 获取表中已存在的行数 rows_old = worksheet.nrows # 将xlrd对象拷贝转化为xlwt对象 new_workbook = copy(wb) # 获取转化后的工作薄中的第i张表 new_worksheet = new_workbook.get_sheet(i) for num in range(0, len(data[name])): new_worksheet.write(rows_old, num, data[name][num]) new_workbook.save(f'股票数据.xls') xai_data = f'已经存储第{self.num}条股票数据至《股票数据》' print(xai_data) if __name__ == '__main__': g=GuPiao() g.spider()
五、数据可视化
1.将股票60日涨跌情况进行汇总并绘制成折线图和柱状图,
通过这两图可以帮助投资者了解股票的长期趋势和表现。
股票60日涨跌幅折现图

股票60日涨跌幅柱状图

数据视图

代码实现
import pandas as pd from pyecharts.charts import Line from pyecharts import options as opts def shujufenxi(): # =============== 60 日 涨 跌 幅 ======================== # 读取数据 file_path = f'股票数据.xls' # 替换为您的文件路径 df = pd.read_excel(file_path) stock_names = df['股票名称'].tolist() # 股票名称 latest_prices = df['60日涨跌幅'].tolist() # 60日涨跌幅 # 将百分比的字符串转换为浮点数 latest_prices = [float(x.strip('%')) for x in latest_prices] # 创建高级折线图 line_chart1 = Line(init_opts=opts.InitOpts(theme='infographic', bg_color='#e7e5d0')) line_chart1.add_xaxis(stock_names) line_chart1.add_yaxis("60日涨跌幅", latest_prices, label_opts=opts.LabelOpts(position="top")) line_chart1.set_global_opts( title_opts=opts.TitleOpts(title="股票60日涨跌幅折线图"), toolbox_opts=opts.ToolboxOpts(), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"), yaxis_opts=opts.AxisOpts(name="60日涨跌幅"), xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=0)), datazoom_opts=[ opts.DataZoomOpts(type_="slider", is_show=True), opts.DataZoomOpts(type_="inside", is_show=True), ], ) # 设置系列选项,添加最大值、最小值、平均值标记 line_chart1.set_series_opts( marker_opts=opts.MarkPointOpts( data=[ opts.MarkPointItem(type_="max", name="最大值"), opts.MarkPointItem(type_="min", name="最小值"), opts.MarkPointItem(type_="average", name="平均值") ] ) ) html_content_1 = line_chart1.render_embed()
2.将股票五分钟涨跌情况进行汇总并绘制成折现图和柱状图,
通过这两图能够及时地反映股票市场的动态,帮助投资者了解市场走势和个股表现。
股票五分钟涨跌幅折线图

股票五分钟涨跌柱状图

数据视图

代码实现
# ==================五分钟涨跌================================= # 读取数据 file_path = f'股票数据.xls' # 替换为您的文件路径 df = pd.read_excel(file_path) stock_names = df['股票名称'].tolist() # 股票名称 latest_prices = df['五分钟涨跌'].tolist() # 五分钟涨跌 latest_prices = [float(x.strip('%')) for x in latest_prices] line_chart2 = Line(init_opts=opts.InitOpts(theme='dark')) line_chart2.add_xaxis(stock_names) line_chart2.add_yaxis("五分钟涨跌", latest_prices, label_opts=opts.LabelOpts(position="top")) line_chart2.set_global_opts( title_opts=opts.TitleOpts(title="股票五分钟涨跌折线图"), toolbox_opts=opts.ToolboxOpts(), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"), yaxis_opts=opts.AxisOpts(name="五分钟涨跌"), xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=0)), datazoom_opts=[ opts.DataZoomOpts(type_="slider", is_show=True), opts.DataZoomOpts(type_="inside", is_show=True), ], ) line_chart2.set_series_opts( marker_opts=opts.MarkPointOpts( data=[ opts.MarkPointItem(type_="max", name="最大值"), opts.MarkPointItem(type_="min", name="最小值"), opts.MarkPointItem(type_="average", name="平均值") ] ) )
六、总结
1.使用request对东方股票股价、成交量、市盈率等指标进行爬取。
2.对爬取的数据进行数据清洗。
3.爬取的数据保存到xls文件中,便于后续分析。
4.设计股票60日涨跌幅折线图它可以帮助投资者了解股票的长期趋势和表现。
5.设计股票5分钟涨跌幅折线图它能够捕捉到更短期的市场动态,帮助投资者更好地了解股票的短期走势。
通过这次课程设计,我们不仅掌握了Python爬虫和数据可视化的基本技能,还对股票市场有了更深入的了解。同时,我们也认识到在实际应用中,需要关注数据的质量和准确性。在未来,我们希望进一步探索股票市场的规律和趋势,为投资决策提供更有价值的信息。
完整源代码如下:
1 import json 2 import requests, time 3 from tkinter import * 4 import xlrd, xlwt, os 5 from xlutils.copy import copy 6 7 class GuPiao(): 8 def __init__(self): 9 self.num = 0 10 11 # 爬虫部分 12 def spider(self): 13 for page in range(1,21): #这个地方可以页数增加数据 14 start_url = 'https://83.push2.eastmoney.com/api/qt/clist/get' 15 headers = { 16 'Accept': '*/*', 17 'Accept-Language': 'zh-CN,zh;q=0.9', 18 'Cache-Control': 'no-cache', 19 'Connection': 'keep-alive', 20 # Requests sorts cookies= alphabetically 21 # 'Cookie': 'qgqp_b_id=ffb939776279b0bdd1f6e61281c3c294; st_si=89921490520325; websitepoptg_api_time=1700894106860; websitepoptg_show_time=1700894107214; HAList=ty-1-600789-%u9C81%u6297%u533B%u836F%2Cty-1-600519-%u8D35%u5DDE%u8305%u53F0%2Cty-0-000858-%u4E94%20%u7CAE%20%u6DB2%2Cty-0-002456-%u6B27%u83F2%u5149; st_asi=delete; st_pvi=61091067222435; st_sp=2023-11-03%2018%3A10%3A35; st_inirUrl=https%3A%2F%2Fwww.baidu.com%2Flink; st_sn=5; st_psi=20231125143800994-113200301321-8038820015', 22 'Pragma': 'no-cache', 23 'Referer': 'https://quote.eastmoney.com/center/gridlist.html', 24 'Sec-Fetch-Dest': 'script', 25 'Sec-Fetch-Mode': 'no-cors', 26 'Sec-Fetch-Site': 'same-site', 27 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36', 28 'sec-ch-ua': '"Google Chrome";v="119", "Chromium";v="119", "Not?A_Brand";v="24"', 29 'sec-ch-ua-mobile': '?0', 30 'sec-ch-ua-platform': '"Windows"', 31 } 32 fomdata = { 33 'cb': 'jQuery1124001114974346054809_1700894280689', 34 'pn': page, 35 'pz': '20', 36 'po': '1', 37 'np': '1', 38 'ut': 'bd1d9ddb04089700cf9c27f6f7426281', 39 'fltt': '2', 40 'invt': '2', 41 'wbp2u': '|0|0|0|web', 42 'fid': 'f3', 43 'fs': 'm:0 t:6,m:0 t:80,m:1 t:2,m:1 t:23,m:0 t:81 s:2048', 44 'fields': 'f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152', 45 '_': '1700894280699' 46 } 47 response = requests.get(url=start_url, headers=headers, params=fomdata).text 48 response = re.findall('jQuery1124001114974346054809_1700894280689\((.*?)\);', response)[0] 49 response = json.loads(response) 50 datas = response['data']['diff'] 51 time.sleep(2) 52 self.parase_data(datas) 53 54 # 解析部分 55 def parase_data(self, datas): 56 for data in datas: 57 # 0、序号 58 self.num += 1 59 # 1、最新价 60 zuixingjia = data['f2'] 61 # 2、涨跌幅 62 diezhangfu = str(data['f3']) + '%' 63 # 3、涨跌额 64 diezhange = data['f4'] 65 # 4、成交量(手) 66 chengjiaoliang = data['f5'] 67 # 5、成交额 68 chengjiaoe = data['f6'] 69 # 6、振幅 70 zhengfu = str(data['f7']) + '%' 71 # 7、换手率 72 huanshoulv = str(data['f8']) + '%' 73 # 8、市盈率 74 shiyinglv = data['f9'] 75 # 9、量比 76 liangbi = data['f10'] 77 # 10、股票代码 78 diama = data['f12'] 79 # 11、股票名称 80 name = data['f14'] 81 # 12、最高 82 zuigao = data['f15'] 83 # 13、最低 84 zuidi = data['f16'] 85 # 14、今开 86 jinkai = data['f17'] 87 # 15、昨收 88 zuoshou = data['f18'] 89 # 16、市净率 90 jinshilv = data['f23'] 91 # 17、60日涨跌幅 92 liushirezhangdiefu = str(data['f24']) + '%' 93 # 18、年初至今涨跌幅 94 nianchuzhijinzhangdiefu = str(data['f25']) + '%' 95 # 19、总市值 96 zongshizhi = data['f20'] 97 # 20流通市值 98 liutongshizhi = data['f21'] 99 # 21、五分钟涨跌 100 wufenzhongzhangdie = str(data['f11']) + '%' 101 data = { 102 f'股票数据': [self.num, name, diama, zuixingjia, diezhangfu, diezhange, 103 chengjiaoliang, chengjiaoe, zhengfu, huanshoulv, shiyinglv, liangbi, 104 zuigao, zuidi, jinkai, zuoshou, jinshilv, liushirezhangdiefu, 105 nianchuzhijinzhangdiefu, zongshizhi, liutongshizhi, 106 wufenzhongzhangdie] 107 } 108 gupiao_dict = { 109 '序号': self.num, 110 '股票名称': name, 111 '股票代码': diama, 112 '最新价': zuixingjia, 113 '涨跌幅': diezhangfu, 114 '涨跌额': diezhange, 115 '成交量(手)': chengjiaoliang, 116 '成交额': chengjiaoe, 117 '振幅': zhengfu, 118 '换手率': huanshoulv, 119 '市盈率': shiyinglv, 120 '量比': liangbi, 121 '最高': zuigao, 122 '最低': zuidi, 123 '今开': jinkai, 124 '昨收': zuoshou, 125 '市净率': zuoshou, 126 '60日涨跌幅': liushirezhangdiefu, 127 '年初至今涨跌幅': nianchuzhijinzhangdiefu, 128 '总市值': zongshizhi, 129 '流通市值': liutongshizhi, 130 '五分钟涨跌': wufenzhongzhangdie 131 } 132 print(gupiao_dict) 133 self.chucun_excel(data) 134 135 136 # 储存部分 137 def chucun_excel(self, data): 138 if not os.path.exists(f'股票数据.xls'): 139 # 1、创建 Excel 文件 140 wb = xlwt.Workbook(encoding='utf-8') 141 # 2、创建新的 Sheet 表 142 sheet = wb.add_sheet(f'股票数据', cell_overwrite_ok=True) 143 # 3、设置 Borders边框样式 144 borders = xlwt.Borders() 145 borders.left = xlwt.Borders.THIN 146 borders.right = xlwt.Borders.THIN 147 borders.top = xlwt.Borders.THIN 148 borders.bottom = xlwt.Borders.THIN 149 borders.left_colour = 0x40 150 borders.right_colour = 0x40 151 borders.top_colour = 0x40 152 borders.bottom_colour = 0x40 153 style = xlwt.XFStyle() # Create Style 154 style.borders = borders # Add Borders to Style 155 # 4、写入时居中设置 156 align = xlwt.Alignment() 157 align.horz = 0x02 # 水平居中 158 align.vert = 0x01 # 垂直居中 159 style.alignment = align 160 # 5、设置表头信息, 遍历写入数据, 保存数据 161 header = ( 162 '序号', '股票名称', '股票代码', '最新价', '涨跌幅', '涨跌额', '成交量(手)', '成交额', '振幅', '换手率', '市盈率', '量比', '最高', '最低', '今开', 163 '昨收', '市净率', '60日涨跌幅', '年初至今涨跌幅', '总市值', '流通市值', '五分钟涨跌') 164 for i in range(0, len(header)): 165 sheet.col(i).width = 2560 * 3 166 # 行,列, 内容, 样式 167 sheet.write(0, i, header[i], style) 168 wb.save(f'股票数据.xls') 169 # 判断工作表是否存在 170 if os.path.exists(f'股票数据.xls'): 171 # 打开工作薄 172 wb = xlrd.open_workbook(f'股票数据.xls') 173 # 获取工作薄中所有表的个数 174 sheets = wb.sheet_names() 175 for i in range(len(sheets)): 176 for name in data.keys(): 177 worksheet = wb.sheet_by_name(sheets[i]) 178 # 获取工作薄中所有表中的表名与数据名对比 179 if worksheet.name == name: 180 # 获取表中已存在的行数 181 rows_old = worksheet.nrows 182 # 将xlrd对象拷贝转化为xlwt对象 183 new_workbook = copy(wb) 184 # 获取转化后的工作薄中的第i张表 185 new_worksheet = new_workbook.get_sheet(i) 186 for num in range(0, len(data[name])): 187 new_worksheet.write(rows_old, num, data[name][num]) 188 new_workbook.save(f'股票数据.xls') 189 xai_data = f'已经存储第{self.num}条股票数据至《股票数据》' 190 print(xai_data) 191 192 193 if __name__ == '__main__': 194 g=GuPiao() 195 g.spider() 196 197 198 import pandas as pd 199 from pyecharts.charts import Line 200 from pyecharts import options as opts 201 202 203 def shujufenxi(): 204 # =============== 60 日 涨 跌 幅 ======================== 205 # 读取数据 206 file_path = f'股票数据.xls' # 替换为您的文件路径 207 df = pd.read_excel(file_path) 208 stock_names = df['股票名称'].tolist() # 股票名称 209 latest_prices = df['60日涨跌幅'].tolist() # 60日涨跌幅 210 # 将百分比的字符串转换为浮点数 211 latest_prices = [float(x.strip('%')) for x in latest_prices] 212 # 创建高级折线图 213 line_chart1 = Line(init_opts=opts.InitOpts(theme='infographic', bg_color='#e7e5d0')) 214 line_chart1.add_xaxis(stock_names) 215 line_chart1.add_yaxis("60日涨跌幅", latest_prices, label_opts=opts.LabelOpts(position="top")) 216 line_chart1.set_global_opts( 217 title_opts=opts.TitleOpts(title="股票60日涨跌幅折线图"), 218 toolbox_opts=opts.ToolboxOpts(), 219 tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"), 220 yaxis_opts=opts.AxisOpts(name="60日涨跌幅"), 221 xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=0)), 222 datazoom_opts=[ 223 opts.DataZoomOpts(type_="slider", is_show=True), 224 opts.DataZoomOpts(type_="inside", is_show=True), 225 ], 226 ) 227 228 # 设置系列选项,添加最大值、最小值、平均值标记 229 line_chart1.set_series_opts( 230 marker_opts=opts.MarkPointOpts( 231 data=[ 232 opts.MarkPointItem(type_="max", name="最大值"), 233 opts.MarkPointItem(type_="min", name="最小值"), 234 opts.MarkPointItem(type_="average", name="平均值") 235 ] 236 ) 237 ) 238 html_content_1 = line_chart1.render_embed() 239 240 241 # ==================五分钟涨跌================================= 242 # 读取数据 243 file_path = f'股票数据.xls' # 替换为您的文件路径 244 df = pd.read_excel(file_path) 245 stock_names = df['股票名称'].tolist() # 股票名称 246 latest_prices = df['五分钟涨跌'].tolist() # 五分钟涨跌 247 latest_prices = [float(x.strip('%')) for x in latest_prices] 248 line_chart2 = Line(init_opts=opts.InitOpts(theme='dark')) 249 line_chart2.add_xaxis(stock_names) 250 line_chart2.add_yaxis("五分钟涨跌", latest_prices, label_opts=opts.LabelOpts(position="top")) 251 line_chart2.set_global_opts( 252 title_opts=opts.TitleOpts(title="股票五分钟涨跌折线图"), 253 toolbox_opts=opts.ToolboxOpts(), 254 tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"), 255 yaxis_opts=opts.AxisOpts(name="五分钟涨跌"), 256 xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=0)), 257 datazoom_opts=[ 258 opts.DataZoomOpts(type_="slider", is_show=True), 259 opts.DataZoomOpts(type_="inside", is_show=True), 260 ], 261 ) 262 line_chart2.set_series_opts( 263 marker_opts=opts.MarkPointOpts( 264 data=[ 265 opts.MarkPointItem(type_="max", name="最大值"), 266 opts.MarkPointItem(type_="min", name="最小值"), 267 opts.MarkPointItem(type_="average", name="平均值") 268 ] 269 ) 270 ) 271 # 渲染图表 272 273 html_content_2 = line_chart2.render_embed() 274 # 创建最终的 HTML 页面 275 276 complete_html = f""" 277 <html> 278 <head> 279 <title>股票数据可视化</title> 280 </head> 281 <body style="background: linear-gradient(to right, #e5b8c3, #c17886);"> 282 <h1 style="text-align: center;margin-top: 20px;">股 票 数 据 可 视 化</h1> 283 <div class="one" style="display: flex; justify-content: center; flex-wrap: wrap; height: 100%;"> 284 <div style="margin: 10px; padding: 10px;"> 285 <h3 style="text-align: center;margin-top: 20px;">60日涨跌幅</h3> 286 {html_content_1} 287 </div> 288 <div style="margin: 10px; padding: 10px;"> 289 <h1 style="text-align: center;margin-top: 20px;">五分钟涨跌</h1> 290 {html_content_2} 291 </div> 292 </div> 293 294 </body> 295 </html> 296 297 # 保存整合后的 HTML 文件 298 299 with open(f'60日涨跌幅和5分钟涨跌可视化.html', "w", encoding="utf-8") as file: 300 file.write(complete_html) 301 xai_data = f'已生成股票《60日涨跌幅和5分钟涨跌》可视化.html' 302 print(xai_data) 303 shujufenxi()

浙公网安备 33010602011771号