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

news/2024/7/19 9:53:11 标签: 腾讯云, python, 爬虫

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.niftyadmin.cn/n/5003609.html

相关文章

大数据组件系列-Hadoop每日小问

1、谈谈对HDFS的理解?HDFS这种存储适合哪些场景? HDFS即Hadoop Distributed File System,Hadoop 分布式文件系统。它为的是解决海量数据的存储与分析的问题,它本身是源于Google在大数据方面的论文,GFS-->HDFS; HD…

纯前端实现 导入 与 导出 Excel

最近经常在做 不规则Excel的导入,或者一些普通Excel的导出,当前以上说的都是纯前端来实现;下面我们来聊聊经常用到的Excel导出与导入的实现方案,本文实现技术栈以 Vue2 JS 为例 导入分类: 调用 API 完全由后端来解析数…

C++ 命名空间 vector 模板

命名空间 为了区分不同库中相同名称的函数、类、变量等,引入概念:命名空间。它可作为附加信息来帮助区分它们。使用了命名空间即定义了上下文,本质上就是定义了一个范围。 定义命名空间 命名空间的定义使用关键字 namespace&#x…

长胜证券:三大拐点共振 看好智能驾驶新一轮行情

摘要 【长胜证券:三大拐点共振 看好智能驾驭新一轮行情】长胜证券研报指出,全球共振,国内智驾商场正迎来三大拐点:1)技能上,“BEV Transformer数据闭环”新架构2023年开端上车,使得不依靠高精地…

初步了解android如何锁键

百年三万六千日,光阴只有瞬息间。 手机下面的三个图形,正方形,园形,三角形分别的什么建?都起到什么功能? 三角形的那个叫返回键,就是可以返回你的上一个操作; 圆形是HOME键,按一下可…

react 初级基础

react基本使用 项目创建 项目的创建命令 npx create-react-app react-basic创建一个基本元素进行渲染 // 1 导入react 和 react-dom import React from "react"; import ReactDOM from "react-dom";// 2 创建 react 元素 React提供了创建元素的api Rea…

基于 Flink CDC 构建 MySQL 和 Postgres 的 Streaming ETL

官方网址:https://ververica.github.io/flink-cdc-connectors/release-2.3/content/%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B/mysql-postgres-tutorial-zh.html官方教程有些坑,经过自己实测,记录个笔记。 服务器环境: VM虚拟机&am…

您的计算机已被[new_day@torguard.tg].faust 勒索病毒感染?恢复您的数据的方法在这里!

导言: 随着科技的迅速发展,网络空间也变得越来越危险,而勒索病毒则是网络威胁中的一个严重问题。 [ new_daytorguard.tg ].faust 勒索病毒是最新的威胁之一,采用高度复杂的加密技术,将受害者的数据文件锁定&#xff0c…