Python基础(七)——PyEcharts数据分析(面向对象版)
四、使用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")
最终效果:
【记录学习过程的笔记,欢迎大家一起讨论,会持续更新】