Python基础(七)——PyEcharts数据分析(面向对象版)

发布于:2024-09-19 ⋅ 阅读:(12) ⋅ 点赞:(0)

四、使用PyEcharts数据分析案例(面向对象版)

【前言:为了巩固之前的Python基础知识(一)到(五),并为后续使用Python作为数据处理的好帮手,我们一起来用面向对象的思想来理解代码】

1.文件读取与数据处理(面向对象版)
# main.py
"""
文本数据格式如下:
订单编号,下单日期,下单金额,下单账户
json数据格式如下:
{id:编号,data:日期,money:金额,account:账户}
"""
import json
# 设计一个类完成数据封装
class data_record:

    def __init__(self, id, data, money, account):
        self.id = id            # 订单编号
        self.data = data        # 下单日期
        self.money = money      # 下单金额
        self.account = account  # 下单账户

    """
    当类对象需要被转换为字符串之前,会输出内存地址
    需要使用魔术方法__str__控制类转换为字符串的行为
    详情请看到最后
    """
    def __str__(self):
        return f"{self.id}, {self.data}, {self.money}, {self.account}"


# 设计一个抽象类定义文件读取相关功能
class file_reader:

    # 读取文件数据,将读到的每条数据转换成list,返回data_record类
    def read_data(self) -> list[data_record]:
        pass

# 读取文本数据子类
class txt_file_reader(file_reader):

    # 使用构造方法定义文件路径
    def __init__(self, path):
        self.path = path

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

        data_record_list: list[data_record] = []
        for line in f.readlines():
            # 注意此处去除读取到的line中的换行符
            line = line.strip()
            # 注意split方法得到一个列表,要将字符串表示的money转换成int
            data_list = line.split(",")
            data = data_record(data_list[0], data_list[1], int(data_list[2]), data_list[3])
            data_record_list.append(data)

        f.close()
        return data_record_list

# 读取json类型数据子类
class json_file_reader(file_reader):
    # 使用构造方法定义文件路径
    def __init__(self, path):
        self.path = path

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

        data_record_list: list[data_record] = []
        for line in f.readlines():
            # 将读取到的每一行json类型转换成python数据类型——字典类型
            data_dict = json.loads(line)
            data = data_record(
                data_dict["id"],
                data_dict["data"],
                int(data_dict["money"]),
                data_dict["account"])
            data_record_list.append(data)

        f.close()
        return data_record_list

txt_file = txt_file_reader("D:/txt_file.txt")
json_file = json_file_reader("D:/json_file.txt")
txt_list: list[data_record] = txt_file.read_data()
json_list: list[data_record] = json_file.read_data()

"""
运行:
for line in txt_list:
    print(line)

for line in json_list:
    print(line)
当类对象需要被转换为字符串之前,会输出内存地址
故此时仅打印数据的地址
需要使用魔术方法__str__控制类转换为字符串的行为
"""

# 将两个列表数据内容合并
all_list: list[data_record] = txt_list + json_list
# 将同一天的销售金额累加,使用字典存储
data_dict = {}
for record in all_list:
    # 当前日期已经存在,直接累加money即可
    if record.data in data_dict.keys():
        data_dict[record.data] += record.money
    # 当前日期不存在,需要添加该日期且将money存入
    else:
        data_dict[record.data] = record.money
        
print(data_dict)

"""
输出结果:
{'07-01': 5081, '07-02': 5360, '07-03': 2096, '07-04': 5174, '07-05': 5344, '07-06': 3162, '07-07': 2141, '07-08': 1701, '07-09': 3180}

"""
2.可视化开发
# 在main.py中导入包
from pyecharts.charts import Bar
from pyecharts.options import *
from pyecharts.globals import ThemeType

# 在1.文件读取与数据处理(面向对象版)代码基础上添加:

# 得到柱状图类对象
bar = Bar(init_opts=InitOpts(theme=ThemeType.LIGHT))
# 将字典中所有日期作为x轴参数,所有金额作为y轴参数
bar.add_xaxis(list(data_dict.keys()))
bar.add_yaxis("总金额", list(data_dict.values()), label_opts=LabelOpts(is_show=False))

bar.set_global_opts(
    title_opts=TitleOpts(title="每日销售总金额")
)

bar.render("每日销售总金额柱状图.html")

最终效果:

每日销售总金额

记录学习过程的笔记,欢迎大家一起讨论,会持续更新


网站公告

今日签到

点亮在社区的每一天
去签到