day10_practice

news2025/1/24 11:45:17

用面向对象思想实现数据分析

1、设计类,完成数据封装
2、设计抽象类,定义文件读取相关功能,使用子类实现具体功能(由于两份文件格式不同)
3、读取文件,产生数据对象
4、计算每天销售额
5、绘图

一、数据封装类设计

"""
数据定义的类
"""


class Record:
    def __init__(self, date, order_id, money, province):
        self.date = date  # 日期
        self.order_id = order_id  # 订单id
        self.money = money  # 订单金额
        self.province = province  # 省份

    # 魔术方法,构建对象时自动运行
    def __str__(self):
        return f"{self.date},{self.order_id},{self.money},{self.province}"

二、抽象类,子类,获取数据

"""
文件相关的类定义
"""
import json

from data_define import Record


class FileReader:
    def read_data(self) -> list[Record]:
        # 读文件数据,将读到数据转为Record对象,将其封装到list内返回
        pass


class TextFileReader(FileReader):
    # 构造方法定义成员变量
    def __init__(self, path):
        self.path = path  # 文件路径

    # 复写(实现抽象方法)
    def read_data(self) -> list[Record]:
        f = open(self.path, "r", encoding="utf-8")

        record_list: list[Record] = []  # 类型注解
        # lines = f.readlines()
        # print(lines)
        for line in f.readlines():
            # print(line)
            line = line.strip()  # 去除首尾空格换行符
            data_list = line.split(',')
            # print(data_list)
            # 将数据转为Record类对象  ['2011-01-01', '4b34218c-9f37-4e66-b33e-327ecd5fb897', '1689', '湖南省']
            record = Record(data_list[0], data_list[1], int(data_list[2]), data_list[3])
            record_list.append(record)

        # 关闭文件流
        f.close()
        # print(record_list)
        return record_list


class JsonFileReader(FileReader):
    # 构造方法定义成员变量
    def __init__(self, path):
        self.path = path  # 文件路径

    def read_data(self) -> list[Record]:
        f = open(self.path, "r", encoding="utf-8")  # 成员变量勿忘self

        record_list: list[Record] = list()  # 类型注解
        # print(f.read())
        for line in f:
            data_dict = json.loads(line)
            # print(data_dict)
            # 将数据转为Record类对象
            """
            {'date': '2011-02-01', 
            'order_id': 'caf99222-53d6-427b-925d-3187fc71a86a', 
            'money': 1805, 
            'province': '江西省'}
            """
            record = Record(data_dict["date"], data_dict["order_id"], int(data_dict["money"]), data_dict["province"])
            record_list.append(record)

        # 关闭文件流
        f.close()
        # print(record_list)
        return record_list


if __name__ == '__main__':
    text_file_reader = TextFileReader("D:/2011年1月销售数据.txt")  # 传入形参path
    list_1 = text_file_reader.read_data()

    json_file_reader = JsonFileReader("D:/2011年2月销售数据JSON.txt")
    list_2 = json_file_reader.read_data()

    print(list_1)  # [<data_define.Record object at 0x0000020F03DD32B0>,.....]
    print(list_2)  # 直接打印,显示内存地址

    # 一月数据
    for l in list_1:
        print(l)
    # 二月数据
    for l in list_2:
        print(l)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

合并数据,计算,绘图

# 用面向对象思想实现数据分析
"""
1、设计类,完成数据封装
2、设计抽象类,定义文件读取相关功能,使用子类实现具体功能(由于两份文件格式不同)
3、读取文件,产生数据对象
4、计算每天销售额
5、绘图
"""
from file_define import FileReader, JsonFileReader, TextFileReader
from data_define import Record
from pyecharts.charts import Bar
from pyecharts.options import *
from pyecharts.globals import *

text_file_reader = TextFileReader("D:/2011年1月销售数据.txt")
json_file_reader = JsonFileReader("D:/2011年2月销售数据JSON.txt")

data_1: list[Record] = text_file_reader.read_data()  # 一月数据
data_2: list[Record] = json_file_reader.read_data()  # 二月数据

# 将两个月数据合并
# data_1.extend(data_2)
all_data: list[Record] = data_1 + data_2
# for i in all_data:
#     print(i)

# 计算数据,用字典存储
data_dict = {}
for record in all_data:
    """
    if record.data in data_dict.keys():
        当前日期已经有记录,故更新操作作累加
        data_dict[record.date] += record.money
    else:
        data_dict[record.date] = record.money
    """
    try:
        # 字典更新操作:dict[key] = value
        data_dict[record.date] += record.money
    except:
        # 字典新增操作:dict[key] = value
        data_dict[record.date] = record.money
# print(data_dict)
# print(data_dict.keys())  # 取出所有key
# print(data_dict.values())  # 取出所有value

# 绘图

bar = Bar(
    init_opts=InitOpts(theme=ThemeType.ESSOS)
)
# 注意此处取数据方法
bar.add_xaxis(list(data_dict.keys()))  # 日期,强转为list类型
bar.add_yaxis("销售额", list(data_dict.values()), label_opts=LabelOpts(is_show=False))

bar.set_global_opts(
    title_opts=TitleOpts(title="每日销售额"),
    toolbox_opts=ToolboxOpts(is_show=True)

)

bar.render("销售额.html")

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Python读取骑行fit文件

目录 故事背景安装输出有心率和无心率的数据为NO.fit文件增加心率数据并保存参考文献 故事背景 有一天&#xff0c;我使用wahoo码表骑行记录了一段没有心率带的数据&#xff0c;导出fit文件至电脑。上传至捷安特APP&#xff0c;结果说数据不完整&#xff0c;此时想用代码把心率…

以结果为导向的网络安全需要全面的方法

Positive Technologies 信息安全分析师 Fedor Chunizhekov 谈论了该地区不断变化的网络安全形势&#xff0c;并重点介绍了其 "中东网络安全威胁形势 "报告中影响中东地区的要点。他还强调&#xff0c;为了解决核心安全问题&#xff0c;我们需要采用一种全面的方法来实…

安全性测试的测试点

安全性测试的测试点 1.跨网站脚本攻击 通过脚本语言的缺陷模拟合法用户&#xff0c;控制其账户&#xff0c;盗窃敏感数据 2.注入攻击 通过构造查询对数据库、LDAP和其他系统进行非法查询 3.恶意文件执行 在服务器上执行Shell 命令Execute&#xff0c;获取控制权 4.伪造跨…

企业如何选择通配符SSL证书?

很多企业网站因为业务需要&#xff0c;在同一个主域名下通常会有多个子域名。在这种情况下申请SSL证书就要很慎重&#xff0c;既要考虑到网站安全需要&#xff0c;又要考虑经济实惠。因此 OV 型的通配符证书非常适合这类企业网站。 为什么要选择通配符SSL证书&#xff1f; 通…

(Linux)查看端口占用并关闭进程

端口 查看端口占用 查看端口占用netstat -anp | grep 端口号 → 列出所有端口netstat -tunlp |grep 3306 → 端口号netstat -tunlp |grep mysql → 进程名称netstat -tunlp |grep 29520 → 进程IDnetstat -tunlp | grep 3306-t: 显示 TCP 连接-u: 显示 UDP 连接-n: 显示数字…

(linux) 查看日志文件

工作用常用 服务器查看日志cat opt/service/logs/logfile.log查看 logfile.log 日志文件tail -f -n -500 opt/service/logs/logfile.log动态查看日志vim opt/service/logs/file.logvi opt/service/logs/file.log可以快速查看日志第一行cat opt/service/logs/logfile.log | gre…

idea 自定义类注释模板和方法模板,无警告

背景&#xff1a;idea&#xff1a;IntelliJ IDEA 2023.1.3 (Ultimate Edition) 效果&#xff1a;&#xff08;主要是没无参&#xff0c;不会换行&#xff09; 类&#xff1a; /** * author sss* date ${DATE} on ${TIME}* desc $NAME*/# 完全复制上面的&#xff0c;删除这一行…

grpc --- protoc生成的pb.go文件的位置

目录 一、环境相关版本二、go_package配置为当前目录下三、go_package配置为指定目录四、结论 一、环境相关版本 go v1.20.5 protoc v4.24.0 protoc-gen-go v1.26.0protoc-gen-go版本过高时需要指定包名&#xff0c;即go_package 二、go_package配置为…

JMeter:性能测试和压力测试工具

JMeter简介 JMeter时Apache下基于java的一款性能测试和压力测试工具。它基于Java开发&#xff0c;可对HTTP服务器华人FTP服务器&#xff0c;甚至是数据库进行压力测试。作为一款专业的压测工具&#xff0c;JMeter功能强大&#xff0c;本片文章中仅简单介绍与本次压测相关的内容…

【Ceph集群应用】CephFS文件系统之MDS接口详解

CephFS文件系统之MDS接口详解 1.创建CephFS文件系统MDS接口1.1 创建cephfs1.2 基于内核的客户端挂载1.3 基于fuse工具方式的客户端挂载 接上文基于ceph-deploy部署Ceph集群详解 1.创建CephFS文件系统MDS接口 服务端操作 &#xff08;1&#xff09;在admin管理节点创建mds服务…

【LocalSend】开源跨平台的局域网文件传输工具,支持IOS、Android、Mac、Windows、Linux

工作前提条件&#xff1a;设备使用相同的局域网。 LocalSend is a cross-platform app that enables secure communication between devices using a REST API and HTTPS encryption. Unlike other messaging apps that rely on external servers, LocalSend doesn’t require …

Spring核心和设计思想(1)

1.Spring是什么&#xff1f; 我们通常说的Spring指的是Spring FrameWork&#xff08;Spring 框架&#xff09;&#xff0c;它是一个开源框架&#xff0c;有着活跃而庞大的社区&#xff0c;这就是它长久不衰的原因。Spring支持广泛的应用场景&#xff0c;它让Java企业级的应用程…

SUNSET_DECOY靶机详解

SUNSET_DECOY靶机复盘 这个靶机还是有点难度的&#xff0c;尤其在提权时候&#xff0c;毫无思路。 下载地址&#xff1a;https://download.vulnhub.com/sunset/decoy.ova 首先扫描IP&#xff0c;打开网站&#xff0c;这个靶机我是没有扫描目录的&#xff0c;因为没给我机会扫…

3组6通道DRP通道USB PD3.1控制SOC芯片LDR6020P

前言 2021年5月&#xff0c;USB-IF 协会发布了全新的USB PD3.1规范&#xff0c;该规范将快充功率上限从100 W提升至240 W&#xff0c;充电功率的提升也让USB PD的应用从手机、笔记本电脑&#xff0c;扩展到便携式设备、物联网设备、智能家居、通信和安防设备、汽车和医疗等领域…

小研究 - 面向 Java 的高对抗内存型 Webshell 检测技术(三)

由于 Web 应用程序的复杂性和重要性, 导致其成为网络攻击的主要目标之一。攻击者在入侵一个网站后, 通常会植入一个 Webshell, 来持久化控制网站。但随着攻防双方的博弈, 各种检测技术、终端安全产品被广泛应用, 使得传统的以文件形式驻留的 Webshell 越来越容易被检测到, 内存…

浅谈一下自动化运维优点和缺点,哪款工具好?

面对越来越复杂的业务&#xff0c;以及越来越多样化的用户需求&#xff0c;IT运维的要求也越来越高&#xff0c;IT运维人员工作也越来越繁琐复杂&#xff0c;因此如何又快又安全的保障IT服务是重中之重。这个时候就需要用到自动化运维了。今天我们就来一起简单聊聊什么是自动化…

Linux中的动态库与静态库

文章目录 软链接与硬链接动态库与静态库静态库动态库 动静态库的区别 软链接与硬链接 软链接 当我们不在本地路径下运行时,运行目标二进制文件一般要写明该程序路径. 但是这样运行对于路径较为复杂的程序极为耗费时间,为了简便操作,我们可以将该可执行程序的路径设置为软链接.…

SQL函数和高级语句

目录 一、常用函数 1.聚合函数 2.数学函数 3.字符串函数 二、sql高级语句 1. SELECT&#xff08;显示表格中指定字段或所有记录&#xff09; 2.DISTINCT&#xff08;不显示指定字段数据重复的记录&#xff09; 3.WHERE&#xff08;指定条件查询&#xff09; 4.AND、OR…

(五)「消息队列」之 RabbitMQ 主题(使用 .NET 客户端)

0、引言 先决条件 本教程假设 RabbitMQ 已安装并且正在 本地主机 的标准端口&#xff08;5672&#xff09;上运行。如果您使用了不同的主机、端口或凭证&#xff0c;则要求调整连接设置。 获取帮助 如果您在阅读本教程时遇到问题&#xff0c;可以通过邮件列表或者 RabbitMQ 社区…

【树链+EXGCD】杭电多校第一场 A

1001 Hide-And-Seek Game (hdu.edu.cn) 题意&#xff1a; 给定一棵树和两条路径&#xff0c;每条路径都有起点和终点&#xff0c;起始时起点有人&#xff0c;每隔一秒都会往终点走一步&#xff0c;会从起点走向终点再会起点这样不断地周期性地走&#xff0c;让你求一点&#…