day10_practice

该文展示了如何使用面向对象编程思想来处理数据分析任务。首先定义了一个Record类用于数据封装,接着创建了一个抽象类FileReader,其子类TextFileReader和JsonFileReader分别实现了不同格式文件的读取。然后,通过读取文件生成数据对象,计算每天的销售额,并利用PyEcharts库绘制了每日销售额的柱状图。
摘要由CSDN通过智能技术生成

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

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")

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值