某公司有两份数据文件:“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 对象的操作也可称为 “数据反序列化。
实现数据反序列化的基本步骤:
思考:那为什么要将文件中的每一行数据转换为 Python 对象呢?
回答:
③数据计算以及图表绘制
# 导入必要的库和之前定义的类
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
文件并在浏览器中查看创建的柱状图。
程序实现流程:
通过这种结构化的面向对象设计,代码结构分明,可维护性和可扩展性高。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。