首页 > 其他分享 >Chapter 31 面向对象数据分析案例

Chapter 31 面向对象数据分析案例

时间:2024-08-10 22:57:39浏览次数:14  
标签:Chapter Record 数据 31 list 面向对象 data self record

欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能!


本篇文章参考:黑马程序员


【面向对象数据分析案例】
某公司有两份数据文件:“2011年1月销售数据.txt”和“2011年2月销售数据JSON.txt”。前者是普通文本文件,使用逗号分隔数据记录,内容依次为日期、订单编号、销售额和销售省份;后者则是JSON格式的数据,内容依次为日期、订单编号、销售额和销售省份。现在需要对这两份数据进行分析和处理,要求是使用面向对象的编程思想来读取和处理数据,计算每日的销售额,并利用Pyecharts库以柱状图的形式展示结果。
文件部分数据如下:
在这里插入图片描述

【需求分析】
在这里插入图片描述

①数据定义类

"""
数据定义类
Record类用于封装销售数据中每一条记录
"""
class Record:
    # 该构造方法接受日期、订单编号、销售额和省份,并将它们存储为类的实例变量
    def __init__(self,date,order_id,money,province):
        self.date = date            # 订单日期
        self.order_id = order_id    # 订单编号
        self.money = money          # 订单金额
        self.province = province    # 销售省份
    # 字符串表示法,方便打印Record对象的内容,返回一个格式化的字符串
    def __str__(self):
        return f"{self.date},{self.order_id},{self.money},{self.province}"

【分析】
Record 类的主要作用是将销售数据的每一条记录封装为一个对象,提供了一个清晰的结构来存储和访问这些数据。通过该类,可以方便地创建多个销售记录对象,并在需要时以易读的格式输出它们。在整个分析和可视化过程中,Record 类将被用于读取和存储来自两个数据文件的销售记录,之后便可通过遍历这些对象来计算每日的销售额,并利用 Pyecharts 库生成柱状图展示结果。

②文件读取类

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

# 导入 json 模块,用于处理JSON文件
import json
# 导入 Record 类,以便在其他类中创建记录对象
from data_define import Record

# 定义一个抽象类,用于顶层设计,定义了文件读取的接口
class FileReader:
    # 抽象方法,强制子类实现相应的读取方法,并返回一个包含Record对象的列表
    def read_data(self)->list[Record]:
        pass

# 子类TextFileReader继承父类FileReader,用于从文本文件中读取数据
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来存储Record对象
        record_list:list[Record]=[]
        # 循环读取每一行数据
        for line in f.readlines():
            line=line.strip()   # 消除读取到的每一行数据中的 \n
            data_list=line.split(",")
            # print(data_list)
            # 输出内容:['2011-01-01', '4b34218c-9f37-4e66-b33e-327ecd5fb897', '1689', '湖南省']……
            record=Record(data_list[0],data_list[1],int(data_list[2]),data_list[3])
            # print(record)
            # 输出内容:2011-01-01,4b34218c-9f37-4e66-b33e-327ecd5fb897,1689,湖南省
            record_list.append(record)

        f.close()
        return record_list


# 子类JsonFileReader继承自父类FileReader,用于从JSON文件中读取数据
class JsonFileReader(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] = []
        for line in f.readlines():
            # 将json数据转换为Python字典
            data_dict=json.loads(line)
            # 从字典中提取相应的字段
            record=Record(data_dict["date"],data_dict["order_id"],data_dict["money"],data_dict["province"])
            print(record)
            record_list.append(record)

        f.close()
        return record_list

【分析】
这段代码实现了一个简单的文本文件读取器,用于读取不同格式的文件(文本和 JSON),并将文件中的每一行数据转换为 Python 对象,便于在后续程序中管理和操作这些数据。

在本案例中,将文本文件中的每一行数据转换为 Python 对象的操作也可称为 “数据反序列化

  • 数据序列化:
    将数据结构或对象状态转换为可存储或传输的格式的过程。这一过程使得数据能够被有效地保存到文件中或通过网络进行传输。在序列化过程中,数据被转换为一种特定格式,例如文本格式(如 JSON、XML)、二进制格式等,以便于存储和恢复。
  • 数据反序列化:
    将已序列化的数据转换回其原始数据结构或对象状态的过程。反序列化是序列化的逆过程,使得应用程序能够再次使用以前存储或传输的数据信息。

实现数据反序列化的基本步骤

  1. 定义对象类
  2. 读取数据源:
    使用 Python 的内置 open() 函数打开文件并读取内容
  3. 解析数据:
    a. 文本文件:通常需要按行读取,使用字符串操作进行拆分
    b. JSON文件:使用json模块解析为Python字典
  4. 创建对象
  5. 处理错误

思考:那为什么要将文件中的每一行数据转换为 Python 对象呢?
回答:

  1. 封装性:
    对象可以将相关数据和方法封装在一起,使得数据结构更加清晰。例如,Record 对象可以包含日期、订单号、金额和省份等属性,所有相关信息集中到一起,便于管理。
  2. 易于操作:
    对象可以包含操作其数据的方法,方便对数据进行处理(如排序、筛选、计算等),灵活性高。
  3. 可扩展性:
    通过面向对象的设计,可以更容易地实现继承和多态,创建复杂数据结构和业务逻辑。如果未来需要追加新的属性或行为(例如添加方法计算订单的税费),可直接在 Record 类中进行扩展,而不必去修改数据读取的逻辑。
  4. 提高可读性和可维护性:
    使用对象后,开发者可以通过方法名和属性名一目了然地理解程序的意图。除此之外,对象可以独立于其使用环境进行测试,简化了调试和维护流程。
  5. 模拟现实世界:
    通过对象,可以更准确地模拟现实世界中的事物。例如,订单不仅仅包含数据,还可以有与之相关的行为和状态,使代码更贴近实际应用。

③数据计算以及图表绘制

# 导入必要的库和之前定义的类
from file_define import FileReader,TextFileReader,JsonFileReader
from data_define import Record
from pyecharts.charts import Bar
from pyecharts.options import *
from pyecharts.globals import ThemeType

# 创建TextFileReader和JsonFileReader的实例,读取数据到列表中
text_file_reader=TextFileReader("D:/2011年1月销售数据.txt")
jan_data:list[Record]=text_file_reader.read_data()

json_file_reader=JsonFileReader("D:/2011年2月销售数据JSON.txt")
feb_data:list[Record]=json_file_reader.read_data()

# 将两个月份的数据合并为一个list来存储
all_data:list[Record]=jan_data+feb_data

# 计算每日销售额
data_dict={}
# 遍历所有记录,将相同日期的销售额进行累加
for record in all_data:
    if record.date in data_dict.keys():
        # 当前日期已经有记录了,所以和老记录累加记录
        data_dict[record.date]+=record.money
    else:
        data_dict[record.date]=record.money

print(data_dict)

# 可视化图表开发
bar=Bar(init_opts=InitOpts(theme=ThemeType.LIGHT))
# 添加x轴数据,显示日期
bar.add_xaxis(list(data_dict.keys()))
# 添加y轴数据,显示销售额
bar.add_yaxis("销售额",list(data_dict.values()),label_opts=LabelOpts(is_show=False))
bar.set_global_opts(
    title_opts=TitleOpts(title="每日销售额")
)
bar.render()

【分析】
这段代码读取了两个不同格式的销售数据文件(一个文本文件和一个JSON文件),合并了数据,计算了每日的销售额,并使用Pyecharts库进行了可视化。

运行后打开render.html文件并在浏览器中查看创建的柱状图。

在这里插入图片描述
在这里插入图片描述
程序实现流程:

  1. 定义数据类 Record 封装每条销售记录
  2. 设计抽象类 FileReader 定义文件读取接口,并实现两个子类 TextFileReader 和 JsonFileReader ,分别处理文本文件和 JSON 文件的读取逻辑
  3. 进行数据需求的逻辑计算(计算每日销售额)
  4. 利用 Pyecharts 绘制柱状图展示销售数据

通过这种结构化的面向对象设计,代码结构分明,可维护性和可扩展性高。

标签:Chapter,Record,数据,31,list,面向对象,data,self,record
From: https://blog.csdn.net/2302_80253507/article/details/141004455

相关文章

  • C--面向对象编程入门指南-全-
    C#面向对象编程入门指南(全)原文:BeginningC#object-orientedprogramming协议:CCBY-NC-SA4.0零、简介作为一名.NET培训师和首席程序员,我的经验是,大多数人在掌握C#语言的语法方面没有问题。困扰和挫败许多人的是面向对象编程方法和设计的更高层次的概念。更糟糕的是,大......
  • 【C++面向对象】重载
    重载简述重载是C++面向对象编程领域的重要概念。C++允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。对于重载函数而言,有一个基本原则:重载的函数两两之间的参数列表互不相同。参数列表不同是指参数的数量不同,或者参数的类型不同,但C++并......
  • 面向对象编程(OOP: Object Oriented Programming ):类、对象、构造方法、封装
    目录一、类1、定义(1)属性(2)方法2、类的定义方法二、对象1、定义2、对象的定义方法三、类和对象的关系1、现实世界都是由很多对象组成的,基于对象的共同特征抽象出类。2、对象:真实存在的对象3、类是对象的模板,对象是类的具体实例。4、一个类可以创建多个对象,同一个......
  • 洛谷 P2731 骑马修栅栏 Riding the Fences之欧拉路径板子
    洛谷P2731题解传送锚点摸鱼环节[USACO3.3]骑马修栅栏RidingtheFences题目背景FarmerJohn每年有很多栅栏要修理。他总是骑着马穿过每一个栅栏并修复它破损的地方。题目描述John是一个与其他农民一样懒的人。他讨厌骑马,因此从来不两次经过一个栅栏。John的农场上......
  • chapter9------中断
    中断是什么中断就是打断处理器当前的执行流程,去执行另外一些和当前工作不相干的指令,执行完之后,还可以返回到原来的程序流程继续执行为什么会有中断机制中断这种机制能够让处理器可以在不同任务之间快速切换,实现多任务处理的功能。试想一下没有中断机制,一次只能执行一个任务,那我......
  • Chapter 30 多态
    欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能!文章目录前言一、基本概念二、抽象类前言多态(Polymorphism)是面向对象编程中的核心概念,本章将详细讲解Python中多态的实现方式以及如何应用多态提高代码的可维护性。本篇文章参考:黑马程序员......
  • (day31)leecode热题——多数元素
    描述给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊n/2⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入:nums=[3,2,3]输出:3示例 2:输入:nums=[2,2,1,1,1,2,2]输出:2提示:n==......
  • sky-take-out chapter 1
    开发环境搭建一、前端环境搭建二、后端环境搭建2.1项目结构(1)sky-take-out:maven父工程,统一管理依赖版本,聚合其他掌控子模块(2)sky-common:子模块,存放公共类,例如:工具类、常量类、异常类等constant常量类context与项目上下文有关enumeration枚举类exception异常类......
  • SSM酒店后台管理系统 ---附源码13123
    目 录摘要Abstract1绪论1.1课题目的及意义1.2研究背景1.3研究方法1.4论文结构与章节安排2 酒店后台管理系统系统分析2.1可行性分析2.2系统功能分析2.2.1功能性分析2.3.2非功能性分析2.4 系统用例分析2.5本章小结3酒店后台管理系统......
  • Kotlin 面向对象编程 (OOP) 基础:类、对象与继承详解
    什么是面向对象编程(OOP)?OOP代表面向对象编程。过程式编程是编写执行数据操作的过程或方法,而面向对象编程则是创建包含数据和方法的对象。与过程式编程相比,面向对象编程具有以下几个优势:OOP更快且更易于执行OOP为程序提供了清晰的结构OOP有助于保持Kotlin代码的DRY......