目录
1、需求描述
根据提供的txt文件和json文件进行数据处理并实现柱状图的可视化
2、需求实现
读取数据->封装数据对象->计算数据对象->pyecharts绘图
3、代码实现
自定义包:data_define.py
class record:
def __init__(self,date,order_id,money,privince):
self.date=date
self.order_id=order_id
self.money=money
self.province=privince
def __str__(self):
return f'销售日期为{self.date},销售金额为{self.money}元'
自定义包:file_difine.py
import json
from data_define import record
class filereader:
def read_data(self)->list[record]:
pass
class txtreader(filereader):
def __init__(self,path):
self.path=path
def read_data(self) ->list[record]:
f=open(self.path,'r',encoding='UTF-8')
lines=f.readlines()
record_list=[]
for line in lines:
line=line.strip('\n') # 去除换行回车符(\n)
#或者可以直接用 line=line.strip() 也可以去掉换行符
Record=record(
line.split(',')[0],
line.split(',')[1],
int(line.split(',')[2]),
line.split(',')[3],)
record_list.append(Record)
f.close()
return record_list
class jsonreader(filereader):
def __init__(self,path):
self.path=path
def read_data(self) ->list[record]:
f=open(self.path,'r',encoding='UTF-8')
record_list=[]
lines = f.readlines()
for line in lines:
data_dict=json.loads(line)
Record = record(
data_dict['date'],
data_dict['order_id'],
int(data_dict['money']),
data_dict['province'], )
record_list.append(Record)
f.close()
return record_list
if __name__ == '__main__':
txt_file_reader_test=txtreader(r'C:/Users\Administrator\Desktop\txt\2011年1月销售数据.txt')
l1=txt_file_reader_test.read_data()
json_file_reader_test=jsonreader(r'C:/Users\Administrator\Desktop\txt\2011年2月销售数据JSON.txt')
l2=json_file_reader_test.read_data()
for l in l1:
print(l)
for l in l2:
print(l)
自定义包测试效果
主函数
from data_define import record
from file_difine import filereader,txtreader,jsonreader
from pyecharts.charts import Bar
from pyecharts.options import *
from pyecharts.globals import ThemeType
txt=txtreader(r'C:/Users\Administrator\Desktop\txt\2011年1月销售数据.txt')
jso=jsonreader(r'C:/Users\Administrator\Desktop\txt\2011年2月销售数据JSON.txt')
jan=txt.read_data()
feb=jso.read_data()
all_data=jan+feb
datadict={}
for record in all_data:
if record.date in datadict.keys():
datadict[record.date]+=record.money
else:
datadict[record.date]=record.money
bar=Bar(init_opts=InitOpts(theme=ThemeType.LIGHT))
bar.add_xaxis(list(datadict.keys()))
bar.add_yaxis('销售数额',list(datadict.values()),label_opts=LabelOpts(is_show=False))
bar.set_global_opts(
title_opts=TitleOpts(title='每日销售额')
)
bar.render('每日销售额柱状图.html')
主函数测试效果:
4、代码手撕解析:
-
data_define.py包逐步手撕:
定义一个类,用于对读取的数据进行临时的存储以便存入后续数据处理所需的列表中,并通过__str__方式重写print的输出格式
-
file_difine.py包逐步手撕:
定义一个父类,通过继承得到两个子类以便对两种不同的文件格式进行数据的读取和存储
class txtreader: 打开文件读取获得一个存储每行数据的列表,创建一个新的列表用于后续暂存数据,通过遍历先除去文本中的换行符,通过split将逗号分割得到四个不同的数据,将每行的四个数据封装到record类中,再将得到的record分别存进上面创建的心列表中,得到一个存储record元素的列表,关闭文件并返回该列表。
class jsonreader: 打开文件读取获得一个存储每行数据的列表,创建一个新的列表用于后续暂存数据,通过遍历将json格式转化为字典格式,遍历的每行为一个单独的字典,将每行字典内的数据封装到record类中,再将得到的record分别存进上面创建的心列表中,得到一个存储record元素的列表,关闭文件并返回该列表。
-
main.py逐步手撕:
创建两个对象,传入文件的地址,通过成员函数得到两个处理好的列表,把两个列表合并,创建一个空字典用于对列表的元素数据(record类)进行筛选存储(取出类的日期作为key,类的金额作为value),通过遍历,首先判断recor记录的日期是否在字典内,若是字典内已经有了该日期,则对该日期对应的值进行相加,否则用新日期创建一个新的key,将该日期对应的金额作为value,遍历完成得到一个完整的字典。创建一个柱状图对象bar,设置主题为“LIGHT”,x轴导入列表化后的字典key值,y轴导入列表化后的value值,并设置不显示具体数值在柱状图上,设置好柱状图标题,完成绘制。