【腾讯云 Cloud Studio 实战训练营】使用python爬虫和数据可视化对比“泸州老窖和五粮液4年内股票变化”

Cloud Studio

请在此添加图片描述

简介

Cloud Studio是腾讯云发布的云端开发者工具,支持开发者利用Web IDE(集成开发环境),实现远程协作开发和应用部署。

现在的Cloud Studio已经全面支持Java Spring Boot、Python、Node.js等多种开发模板示例库,让开发者们可以更轻松地上手。它还具备在线开发、调试、预览等强大的功能,让你可以轻松实现各种开发需求。而且,我还听说Cloud Studio已经在内测中集成了在线开发协作模块,下一个版本将会全量开放,这意味着你将能够随时随地与团队成员一起设计、讨论和开发项目。

还有一点非常重要的是,Cloud Studio具备SSH连接能力,这意味着你可以安全地连接到云端工作空间,更加方便地连接云资源。这样一来,你可以随时随地享受到云端开发的便利,不再受限于地点和设备。

另外,Cloud Studio还具备标准化的云端安装部署能力,支持主流代码仓库的云端克隆。这就意味着你可以将你的代码库轻松地迁移到云端,让你的开发过程更加规范化和便捷化。

创建账号

Cloud Studio 的官网: https://cloudstudio.net/

目前共有三种登录方式:CODING,微信,GITHUB

如果没有GitHub,可以使用微信登录。

请在此添加图片描述

1、搭建前准备

打开Cloud Studio平台,进入个人页面。

点击Cloud Studio官网 Cloud Studio_在线编程_在线IDE_WebIDE_CloudIDE

现在实名认证的话每月会赠送 1000 分钟免费额度。

请在此添加图片描述

2、选择环境

选择环境模板

Cloud Studio内置 Node.js、Java、Python 等常见环境,这里我们需要选择一个Python模板

请在此添加图片描述

请在此添加图片描述

3、开始代码环节

3.1、配置运行环境

打开终端

请在此添加图片描述

分别执行以下命令下载依赖包

pip install openpyxl
pip install numpy
pip install pandas
pip install matplotlib

请在此添加图片描述

3.2、创建 数据爬取.py

请在此添加图片描述

运行如下代码

import requests
from openpyxl import Workbook# 请求头
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
}# 将数据转换为json格式
def getTypeJson(url):# 发送请求response = requests.get(url, headers=headers)# 返回json格式数据return response.json()# 获得数据信息
def getInformation(url, ws, name):# 获取json格式的data数据data = getTypeJson(url).get("data")# 获取klines数据klines = data.get("klines")for kline in klines:# 将kline的起始位置加上name字段kline = name + "," + kline# 将kline用,切割并保存一行ws.append(kline.split(","))# 保存数据
def saveInformationToXlsx():wb = Workbook()# 打开第一个表格ws = wb.worksheets[0]# 添加第一行数据ws.append(["名称", "时间", "开盘", "收盘", "最高", "最低", "成交量", "成交额", "振幅", "涨跌幅", "涨跌额", "换手率"])# 爬取五粮液数据url = f"http://push2his.eastmoney.com/api/qt/stock/kline/get?fields1=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13&fields2=f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61&beg=20190101&end=20500101&ut=fa5fd1943c7b386f172d6893dbfba10b&rtntype=6&secid=1.600702&klt=101&fqt=1"getInformation(url, ws, "五粮液")# 爬取泸州老窖数据url = f"http://push2his.eastmoney.com/api/qt/stock/kline/get?fields1=f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13&fields2=f51,f52,f53,f54,f55,f56,f57,f58,f59,f60,f61&beg=20190101&end=20500101&ut=fa5fd1943c7b386f172d6893dbfba10b&rtntype=6&secid=0.000568&klt=101&fqt=1"getInformation(url, ws, "泸州老窖")# 设置标题ws.title = "五粮液和泸州老窖"# 保存数据wb.save("酿酒行业个股资金流.xlsx")# 关闭资源wb.close()# 程序运行
if __name__ == '__main__':saveInformationToXlsx()

请在此添加图片描述

酿酒行业个股资金流.xlsx 文件内容如下

请在此添加图片描述

爬取的数据来自东方财富:泸州老窖和五粮液

3.3、创建 数据分析.py

请在此添加图片描述

运行如下代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import randomdef viewPlot(fileName):# 防止中文乱码plt.rcParams["font.sans-serif"] = ["SimHei"]plt.rcParams["axes.unicode_minus"] = False# 进行数据处理df = dataHandling(fileName)viewPlot1(df)viewPlot2(df)viewPlot3(df)# 对xlsx数据进行整理
def dataHandling(xlsxName):# 读取excel文件df = pd.read_excel(xlsxName, header=0)# 对时间进行处理df['年月'] = df['时间'].str[0:7]df['时间'] = pd.to_datetime(df['时间'])df['年'] = df['时间'].dt.yeardf['月'] = df['时间'].dt.monthdf['时间'] = df['时间'].dt.date# 处理成交量(将单位从次变为万次)并保留两位小数df['成交量'] = round(df['成交量'] / 10000, 2)# 处理成交额(将单位从元变为亿元)并保留两位小数df['成交额'] = round(df['成交额'] / 100000000, 2)return df# 画图
def viewPlot1(df):# 创建画板plt.figure(figsize=(12, 12), dpi=80)# 设置标题plt.suptitle("4年内酿酒行业个股资金流走势图", fontsize=20)# 获取名称集合nameList = df['名称'].unique()# 绘制第一个子图plt.subplot(2, 1, 1)# 以键值对方式存储数据dic = {}for name in nameList:# 获取数据dic[name] = groupByDayData(df, name)# 子图标题title = nameList[0] + '和' + nameList[1] + "每日成交额"drawSubPlot(dic, title, 10, "成交额(亿元)")# 绘制第二个子图plt.subplot(2, 2, 3)# 以键值对方式存储数据dic = {}for name in nameList:# 获取数据dic[name] = groupByMonthData(df, name)# 子图标题title = nameList[0] + '和' + nameList[1] + "每月平均成交额"drawSubPlot(dic, title, 6, "成交额(亿元)")# 绘制第三个子图plt.subplot(2, 2, 4)# 以键值对方式存储数据dic = {}for name in nameList:# 获取数据dic[name] = groupByMonthMaxData(df, name)# 子图标题title = nameList[0] + '和' + nameList[1] + "每月最大成交额"drawSubPlot(dic, title, 6, "成交额(亿元)")# 存图plt.savefig('./plot1.png')# 展示图片plt.show()# 封装数据并返回
def getData(group):# 获取x轴数据x = group.index# 获取y轴数据y = group.values# 将数据封装为list集合并返回data = [x, y]return data# 按名称和时间分组获取每天成交额
def groupByDayData(df, name):groupByDay = df.groupby("名称").get_group(name).groupby(['时间'])['成交额'].mean()return getData(groupByDay)# 根据名称和年月分组获取每月成交额的平均值
def groupByMonthData(df, name):groupByMonth = df.groupby("名称").get_group(name).groupby(['年月'])['成交额'].mean()return getData(groupByMonth)# 根据名称和年月分组获取每月最大成交额数据
def groupByMonthMaxData(df, name):groupByMonth = df.groupby("名称").get_group(name).groupby(['年月'])['成交额'].max()return getData(groupByMonth)# 折线颜色集合
colors = ['red', 'green', 'blue']
# 折线样式集合
line_style = ['-', '--', '-.']# 子图绘制dic:数据,title:子图标题,step:x轴显示数据的数量,yTitle:y轴单位
def drawSubPlot(dic, title, step, yTitle):# 随机生成颜色下标c = random.randint(0, len(colors) - 1)# 随机生成样式下标l = random.randint(0, len(line_style) - 1)i = 0# 遍历dicfor name, data in dic.items():# 折线颜色选取c = (c + i) % len(colors)# 折线样式选取l = (l + i) % len(line_style)# 为了使第二条线和第一条线不相等i = i + 1# 将数据代入x轴和y轴putData(name, data, step, c, l)# 设置x轴名称plt.xlabel("日期", fontdict={'size': 16})# 设置y轴名称plt.ylabel(yTitle, fontdict={'size': 16}, rotation=90)# 设置网格plt.grid(True, linestyle='--', alpha=0.5)# 设置子图标题plt.title(title, fontdict={'size': 16})# 将数据加载到子图中
def putData(name, data, step, c, l):# x轴数据x = data[0]# y轴数据y = data[1]# 将x轴和y轴数据代入并设置颜色折线类型和折线名plt.plot(x, y, c=colors[c], label=name, linestyle=line_style[l])# 设置折线上的点plt.scatter(x[::int(len(x) / step)], y[::int(len(x) / step)], c=colors[c])# 设置图例边框plt.legend(loc='best', edgecolor='blue')# 设置x轴数据plt.xticks(x[::int(len(x) / step)], rotation=30)def viewPlot2(df):# 创建画板plt.figure(figsize=(12, 12), dpi=80)# 设置标题plt.suptitle("4年内酿酒行业个股资金流走势图", fontsize=20)# 获取名称集合nameList = df['名称'].unique()# 绘制第一个子图plt.subplot(2, 2, 1)# 以键值对方式存储数据dic = {}for name in nameList:# 获取数据dic[name] = getMaxAndMinDataByName(df, name)# 子图标题title = nameList[0] + "每月最高和最低股票价格"drawSubPlot(dic[nameList[0]], title, 6, "价格(元/每股)")# 绘制第二个子图plt.subplot(2, 2, 2)# 子图标题title = nameList[1] + "每月最高和最低股票价格"drawSubPlot(dic[nameList[1]], title, 6, "价格(元/每股)")# 绘制第三个子图plt.subplot(2, 1, 2)# 以键值对方式存储数据dic = {}for name in nameList:# 获取数据dic[name] = getMeanDataByName(df, name)# 子图标题title = nameList[0] + "和" + nameList[1] + "每月平均成交量比较"drawSubPlot(dic, title, 10, "成交量(每单)")# 存图plt.savefig('./plot2.png')plt.show()# 通过名称和年月获取每月最高和最低股票价格数据
def getMaxAndMinDataByName(df, name):# 保存数据dic = {}# 通过名称和年月分组groupByNameAndMonth = df.groupby("名称").get_group(name).groupby(['年月'])# 获得每月最大数据getMax = groupByNameAndMonth['最高'].max()dic['最高'] = getData(getMax)# 获得每月最小数据getMin = groupByNameAndMonth['最低'].min()dic['最低'] = getData(getMin)# 返回数据return dic# 按名称和年月分组获取每月成交量的平均值
def getMeanDataByName(df, name):groupByMonth = df.groupby("名称").get_group(name).groupby(['年月'])['成交量'].mean()return getData(groupByMonth)# 通过名称和年分组获得每年成交额的平均值
def getInformation(df, nameList):# 根据名称分组groupByName = df.groupby("名称")# 根据年分组获取平均值groupByYear = groupByName.get_group(nameList[0]).groupby(['年'])['成交额'].mean()# 将平均值保留两位小数groupByYear = round(groupByYear, 2)# 获取x轴数据x = groupByYear.index# 获取第一组y轴数据y1 = groupByYear.values# 根据年分组获取平均值groupByYear = groupByName.get_group(nameList[1]).groupby(['年'])['成交额'].mean()# 将平均值保留两位小数groupByYear = round(groupByYear, 2)# 获取第二组y轴数据y2 = groupByYear.values# 封装数据并返回data = [x, y1, y2]return data# 柱状图
def viewPlot3(df):# 获取不同名称集合nameList = df['名称'].unique()# 获取数据information = getInformation(df, nameList)xData = information[0]y1 = information[1]y2 = information[2]# 设置画板plt.figure(figsize=(10, 8))# 条形宽度width = 0.2# 生成1到len(xData)的数组x = np.arange(len(xData))# 画第一组数据,在x位置画y1的值pa = plt.bar(x, y1, width=width, label=nameList[0], fc="r")# 画第一组数据,在 x + width 位置画y2的值pb = plt.bar(x + width, y2, width=width, label=nameList[1], fc="g")# 在柱上标数字autoLabel(pa)autoLabel(pb)# 原来这里是刻度值,现在把x轴标题替换为横坐标显示plt.xticks(x + width / 2, xData)plt.title(nameList[0] + "和" + nameList[1] + "每年平均成交额对比", fontdict={'size': 20})# 设置图例边框plt.legend(loc='best', edgecolor='blue')# 设置轴名plt.xlabel('时间', fontdict={'size': 16})plt.ylabel('成交额(亿元)', fontdict={'size': 16}, rotation=90)# 存图plt.savefig('./plot3.png')plt.show()# 在柱上显示代表的数量
def autoLabel(rects):# 遍历所有矩形for rect in rects:# 获得矩形高度height = rect.get_height()print(type(height))# 将数据标到柱顶plt.text(rect.get_x() + rect.get_width() * 0.10, 1.01 * height, height)# 运行程序
if __name__ == '__main__':# 读取数据的文件名filename = r"酿酒行业个股资金流.xlsx"# 画图方法viewPlot(filename)

如报 findfont: Generic family ‘sans-serif’ not found because none of the following families were found: SimHei
参考该博客解决:https://blog.csdn.net/ben_na_/article/details/124238611

生成如下三张图

请在此添加图片描述

请在此添加图片描述

请在此添加图片描述

使用感想

Cloud Studio 可以在云端运行代码,帮我们节省了在本地安装和配置软件的成本。

通过我的使用 Cloud Studio 的环境支持功能非常强大,几乎不需要额外配置。

总之,Cloud Studio 操作简单、功能强大,希望这个产品能够越做越好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/98862.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker常用中间件安装

文章目录 1、前言2、中间件安装2.1、mysql2.2、gitlab容器2.3、nacos2.4、redis2.5、xxljob2.6、zipkin2.7、sentinel2.8、seata2.8.1、获取镜像2.8.2、运行容器并获取配置 2.9、rockerMQ2.9.1、rockerMQ-namesrv2.9.2、rockerMQ-broker2.9.3、rockerMQ-console 2.10、jenkins2…

软考(1)-面向对象的概念

目录 一. 软考基本信息 1. 软考时间: 2. 软考科目: 3.专业知识介绍 -- 综合知识考点分布 4. 专业介绍 -- 软件设计考点分布 二. 面向对象概念 1. 封装 考点一:对象 考点二:封装private 2. 继承 考点三:类 考…

uniapp微信小程序使用stomp.js实现STOMP传输协议的实时聊天

简介: 原生微信小程序中使用 本来使用websocket,后端同事使用了stomp协议,导致前端也需要对应修改。 如何使用 1.yarn add stompjs 2.版本 “stompjs”: “^2.3.3” 3.在static/js中新建stomp.js和websocket.js,然后在需要使用…

多线程场景下谨慎使用@Transactional注解,你不信我也没办法

最近遇到一个很诡异的bug,觉得很有趣也很值得分享,于是想写篇文章记录下来,希望有缘人看到以后少踩坑~ 先简单说下场景:有个任务平台,功能很多但我们只关注 提交任务和取消任务 两个功能,并且取消任务后会有…

blender基本操作

文章目录 引言一、选择二、移动1. xyz轴移动2. xyz平面移动3. 精确移动4. 快捷键移动G 三、旋转四、缩放五、变换1. 变换坐标系2. 变换轴心: 六、吸附七、模式切换八、物体的合并和分离1. 合并2.分离 九、设置父子级关系十、叠加层和快速收藏夹1. 叠加层2. 快速收藏…

【算法与数据结构】106、LeetCode从中序与后序遍历序列构造二叉树

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:首先我们要知道后序遍历数组的最后一个元素必然是根节点,然后根据根节点在中序遍历数组中的…

NSSCTF web 刷题记录1

文章目录 前言题目[GXYCTF 2019]禁止套娃方法一方法二 [NCTF 2019]Fake XML cookbook[NSSRound#7 Team]ec_RCE[NCTF 2018]Flask PLUS 前言 今天是2023.9.3,大二开学前的最后一天。老实说ctf的功力还是不太够做的题目太少,新学期新气象。不可急于求成&am…

【Docker】 08-Dockerfile

什么是Dockerfile Dockerfile可以认为是Docker镜像的描述文件,是由一系列命令和参数构成的教程,主要作用是用来构建docker镜像的构建文件。 Dockerfile解析过程 Dockerfile的保留命令 保留字作用FROM当前镜像是基于哪个镜像的 第一个指令必须是FROMMA…

SpringAOP详解

目录 代理模式 静态代理 动态代理 AOP spring api实现 自定义类实现 使用注解实现 代理模式 AOP的底层机制就是动态代理,所以学习aop之前 , 我们要先了解一下代理模式。 静态代理 拿租房的例子进行举例 抽象角色 : 一般使用接口或者抽象类来实现&#xff…

【python爬虫】—豆瓣电影Top250

豆瓣电影Top250 豆瓣榜单简介需求描述Python实现 豆瓣榜单简介 豆瓣电影 Top 250 榜单是豆瓣网站上列出的评分最高、受观众喜爱的电影作品。这个榜单包含了一系列优秀的影片,涵盖了各种类型、不同国家和时期的电影。 需求描述 使用python爬取top250电影&#xff…

【高阶数据结构】AVL树 {概念及实现;节点的定义;插入并调整平衡因子;旋转操作:左单旋,右单旋,左右双旋,右左双旋;AVL树的验证及性能分析}

AVL树 一、AVL树的概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明…

分类算法系列②:KNN算法

目录 KNN算法 1、简介 2、原理分析 数学原理 相关公式及其过程分析 距离度量 k值选择 分类决策规则 3、API 4、⭐案例实践 4.1、分析 4.2、代码 5、K-近邻算法总结 🍃作者介绍:准大三网络工程专业在读,努力学习Java,涉…