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

news2024/11/28 0:53:25

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 random


def 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.year
    df['月'] = df['时间'].dt.month
    df['时间'] = 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
    # 遍历dic
    for 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.coloradmin.cn/o/976218.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

正中优配:证券账户除了炒股还可以干啥?

大部分出资者开一个证券账户是用来买卖股票的,殊不知,证券账户除了买卖股票之外,还能够干许多其他的出资,下面正中优配为大家准备了相关内容,以供参阅。 证券账户除了炒股之外还能够干以下出资: 1、购买基…

智能电力监控平台

智能电力监控平台依托电易云-智慧电力物联网,综合采用物联网、云计算、边缘计算,人工智能等”现代化信息技术将配电室进行远程集中监控,实时监测配电室设备运行状态、电参量、配电室环境等,可以有效降低隐患风险。 智能电力监控平…

这么近,那么美,到天津看大爷跳水

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 小黑 运营 / SandLiu 卷圈 监制 / 姝琦 现场采访 / 朱峰、姝琦 产品统筹 / bobo 场地支持 / 声湃轩天津录音间 日前,天津局部持续下“大爷”。连续多日的下“大爷”让天津这座城市接棒淄博烧烤&#xff0c…

算法 数据结构 什么是递归 递归解决阶乘 阶乘递归代码 递归解决问题 递归反向打印字符串 数据结构(七)

递 归: 计算机科学中,递归是一种解决计算问题的方法,其中解决方案取决于同一类问题的更小子集 In computer science, recursion is a method of solving a computational problem where the solution depends on solutions to smaller instan…

代码随想录算法训练营之JAVA|第四十三天|139. 单词拆分

今天是第 天刷leetcode,立个flag,打卡60天。 算法挑战链接 139. 单词拆分https://leetcode.cn/problems/word-break/ 第一想法 看完之后完全没有想法。 看完代码随想录之后的想法 这是一个完全背包的问题,使用完全背包的解法。 单词就…

pinia和vuex的使用以及区别

还是要记笔记多看才行,要不然老是会忘记 它没有mutation,他只有state,getters,action【同步、异步】使用他来修改state数据pinia没有modules配置,每一个独立的仓库都是definStore生成出来的state是一个对象返回一个对象和组件的da…

面试被问到:测试计划和测试方案有什么区别?你会回答吗~

面试的时候,很多小伙伴都被面试官问过这个问题 “测试计划和测试方案有什么区别”? 到底有什么区别呢?我们先好好了解下这两个文档。 一、测试计划 1、测试计划是什么 测试计划是组织管理层面的文件,从组织管理的角度对一次测…

接口自动化测试如何处理 Header cookie

Cookie(复数形态:Cookies)是某些网站为了辨别用户身份而储存在用户本地终端上的数据。在接口测试过程中,如果网站采取了 Cookie 认证的方式,那么发送的请求需要附带 Cookie,才会得到正常的响应的结果。接口…

牛客周赛 Round 10

A.游游的最长稳定子数组 原题链接 : 登录—专业IT笔试面试备考平台_牛客网 思路 : 一个线性dp,dp[i]表示以a[i]结尾的最长稳定子数组的长度; dp方程 : if(abs(a[i]-a[i-1]) < 1) dp[i]dp[i-1]1; else dp[i] 1; 代码 : #include<bits/stdc.h> #def…

Java低代码开发:jvs-list(列表引擎)功能(一)配置说明

在低代码开发平台中&#xff0c;列表页是一个用于显示数据列表的页面。它通常用于展示数据库中的多条记录&#xff0c;并提供搜索、排序和筛选等功能&#xff0c;以方便用户对数据进行查找和浏览。 jvs-list是jvs快速开发平台的列表页的配置引擎&#xff0c;它和普通的crud 具…

【招标投标API】有人靠它赚数百万,绝大多数企业却熟视无睹!

引言 在当前优胜劣汰的市场&#xff0c;中小企业的竞争压力日益增大&#xff0c;一些与时代发展逆向而行的企业也将被淘汰。众所周知&#xff0c;传统的招投标行业信息存在各自分裂、数据局限的问题&#xff0c;所以招投标行业发展滞后&#xff0c;给各招投标企业造成了巨大的…

利用MQ实现mysql与elasticsearch数据同步

流程 1.声明exchange、queue、RoutingKey 2. 在hotel-admin中进行增删改&#xff08;SQL&#xff09;&#xff0c;完成消息发送 3. 在hotel-demo中完成消息监听&#xff0c;并更新elasticsearch数据 4. 测试同步 1.引入依赖 <!--amqp--> <dependency><groupId&…

RHCA之路---EX280(10)

RHCA之路—EX280(10) 1. 题目 On master.lab.example.com install the OpenShift Mertics component with the following requirements: Use the storage /exports/metrics for cassandra storage. You can use the files on http://materials.example.com/exam280/storage fo…

js recude求和

let unReadCount resultList.reduce((pre, cur) > {return pre cur.unReadCount}, 0)

电脑Windows关闭系统自动更新

1.在winr运行框中输入services.msc&#xff0c;打开windows服务窗口。 2.在服务窗口中&#xff0c;我们找到Windows update选项&#xff0c;如下图所示&#xff1a; 3.双击windows update服务&#xff0c;我们把启动类型改为禁用&#xff0c;如下图所示&#xff0c;点击应用和…

Windows共享文件夹

Windows共享文件夹 将服务器相应磁盘设置为共享式本机可远程访问服务器共享到本地注意 将服务器相应磁盘设置为共享式 这里E已经是共享式 将D也设置为共享式 \\Desktop-erps210\d本机可远程访问服务器 将本机和服务器的ip设置一个网段&#xff0c;然后网线直连 需要关闭服务器…

AUTOSAR Davinci Idle task 与 Init Task的配置

最近在用Davinci配置Idle task和Init Task的时候遇到了一些问题&#xff0c;配置OS的时候&#xff0c;软件会自动为每个Application生成一个Idle task和Init Task&#xff1a; 先来看Idle Task&#xff0c;自动生成的Idle task的优先级是0xFFFFFFFF&#xff0c;官方给出的解释…

Library ‘libs‘ required for module ‘xxx‘ is missing from the artifact

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 错误概述 项目报错&#xff1a;Library ‘libs’ required for module ‘xxx’ is missing from the artifact&#xff1b;图示如下&#xff1a; 解决方案 点击减号删除当…

Stack-queue

文章目录 stack适配器关于为什么不直接在成员函数里调用push_back... stack 适配器 stack和queue使用了container适配器&#xff0c;因为它觉得我不需要自己实现一个容器来实现而直接用现成的 stack和queue并没有迭代器&#xff0c;因为本来就是后进先出&#xff0c;先进先出&…

无涯教程-JavaScript - DATE函数

描述 DATE函数返回特定日期的序列号。 语法 DATE (year, month, day)争论 Argument描述Required/Optionalyear year参数的值可以包含1-4位数字。 Excel会根据计算机使用的日期系统解释年份参数。 默认情况下,Microsoft Excel for Windows使用1900日期系统。 请参阅下面的注…