【案例】
某公司有2份数据文件,现在需要对其进行数据分析,计算每日的销售额并以柱状图表的形式进行展现。
数据如下:
一月份数据:
二月份数据:
需求分析
根据题目要求我们要得到每日销售额,分析文本数据可以知道,我们只需要将对应的相同的时间提取出来,并找到相应的销售额相加得到结果即可,然后使用pyecharts画图即可。
使用面向对象思想来实现,思路图如下:
订单
设计一个订单的类类中要包含订单的基本信息。
""" 数据定义的类 """ class Record: def __init__(self,data,order_id,money,province): self.data = data # 订单日期 self.order_id = order_id # 订单id self.money = money # 订单金额 self.province = province # 销售省份 def __str__(self): return f"{self.data},{self.order_id},{self.money},{self.province}"
数据处理
我们手中的文本数据有两种,一个是基本的txt文件,一个是JSON类型的txt文件,因此我们设计一个读取文件的操作方法,并且这个方法要是抽象的方法,用子类来实现不同文件的数据读取。
""" 和文件相关的定义 """ from data_define import * import json # 先定义一个抽象类用来做顶层设计,确定有那些需要实现的功能 class FileReader: def read_data(self) -> list[Record]: """ 读取文件的数据,读到的每一条数据都转换为Order对象,将他们封装到list内返回即可 :return: """ 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] = [] for line in f.readlines(): # readlines()一次性读取文件的每一行内容返回的是列表 line = line.strip() # 消除读取到的每一行的换行符 data_list = line.split(",") record = Record(data_list[0],data_list[1],int(data_list[2]),data_list[3]) # 构建为Order对象 record_list.append(record) f.close() 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") record_list:list[Record] = [] for line in f.readlines(): # readlines()一次性读取文件的每一行内容返回的是列表 data_dict = json.loads(line) record = Record(data_dict['date'],data_dict['order_id'],data_dict['money'],data_dict['province'],) # 构建为Order对象 record_list.append(record) f.close() return record_list if __name__ == '__main__': text_file_reader = TextFileReader("D:/网盘下载的文件/2011年1月销售数据.txt") jison_file_reader = JsonFileReader("D:/网盘下载的文件/2011年2月销售数据JSON.txt") list1 = text_file_reader.read_data() list2 = jison_file_reader.read_data() for l1 in list1: print(l1) for l2 in list2: print(l2)
计算数据
通过上述的处理我们设置好了处理数据的方法。接下来,我们通过打开文件获取数据,将对应的日期的金额加起来即可。
# 创建文件对象获取文件 text_file_reader = TextFileReader("D:/网盘下载的文件/2011年1月销售数据.txt") jison_file_reader = JsonFileReader("D:/网盘下载的文件/2011年2月销售数据JSON.txt") jen_data:list[Record] = text_file_reader.read_data() # 一月份的数据 feb_data:list[Record] = jison_file_reader.read_data() # 二月份的数据 # 将两个月份的数据合并 all_data:list[Record] = jen_data+feb_data # 开始进行数据计算 data_dict = {} for record in all_data: if record.data in data_dict.keys(): # 如果当前的日期在字典中累加起来即可 data_dict[record.data] += record.money else: data_dict[record.data] = record.money
我们可以运用字典将每天的时间与金额形成key与value对应的关系。
绘制图像
使用Pyecharts提供的方法来绘制柱状图。
# 可视化图表开发 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("每日销售额.html")
【全部代码】
data_define.py
"""
数据定义的类
"""
class Record:
def __init__(self,data,order_id,money,province):
self.data = data # 订单日期
self.order_id = order_id # 订单id
self.money = money # 订单金额
self.province = province # 销售省份
def __str__(self):
return f"{self.data},{self.order_id},{self.money},{self.province}"
file_define.py
"""
和文件相关的定义
"""
from data_define import *
import json
# 先定义一个抽象类用来做顶层设计,确定有那些需要实现的功能
class FileReader:
def read_data(self) -> list[Record]:
"""
读取文件的数据,读到的每一条数据都转换为Order对象,将他们封装到list内返回即可
:return:
"""
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] = []
for line in f.readlines(): # readlines()一次性读取文件的每一行内容返回的是列表
line = line.strip() # 消除读取到的每一行的换行符
data_list = line.split(",")
record = Record(data_list[0],data_list[1],int(data_list[2]),data_list[3]) # 构建为Order对象
record_list.append(record)
f.close()
return record_list
class JsonFileReader(FileReader): # 用来读取JSON文件数据的方法
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(): # readlines()一次性读取文件的每一行内容返回的是列表
data_dict = json.loads(line)
record = Record(data_dict['date'],data_dict['order_id'],data_dict['money'],data_dict['province'],) # 构建为Order对象
record_list.append(record)
f.close()
return record_list
if __name__ == '__main__':
text_file_reader = TextFileReader("D:/网盘下载的文件/2011年1月销售数据.txt")
jison_file_reader = JsonFileReader("D:/网盘下载的文件/2011年2月销售数据JSON.txt")
list1 = text_file_reader.read_data()
list2 = jison_file_reader.read_data()
for l1 in list1:
print(l1)
for l2 in list2:
print(l2)
main.py
"""
1.设计一个类,可以完成数据封装
2.设计一个抽象类,定义文件读取的相关功能,并使用子类实现具体功能
3.读取文件,生产数据对象
4.进行数据需求的逻辑计算(计算每一天的销售额)
5.通过PyEcharts进行绘图
"""
# 导包
from file_define import *
from data_define import *
from pyecharts.charts import *
from pyecharts.options import *
from pyecharts.globals import *
# 创建文件对象获取文件
text_file_reader = TextFileReader("D:/网盘下载的文件/2011年1月销售数据.txt")
jison_file_reader = JsonFileReader("D:/网盘下载的文件/2011年2月销售数据JSON.txt")
jen_data:list[Record] = text_file_reader.read_data() # 一月份的数据
feb_data:list[Record] = jison_file_reader.read_data() # 二月份的数据
# 将两个月份的数据合并
all_data:list[Record] = jen_data+feb_data
# 开始进行数据计算
data_dict = {}
for record in all_data:
if record.data in data_dict.keys():
# 如果当前的日期在字典中累加起来即可
data_dict[record.data] += record.money
else:
data_dict[record.data] = record.money
# 可视化图表开发
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("每日销售额.html")
【运行效果】