四、使用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转换成intdata_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_listtxt_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.moneyprint(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")
最终效果:
【记录学习过程的笔记,欢迎大家一起讨论,会持续更新】