本次练习中使用的文件位于:https://pan.baidu.com/s/1xpTMQtKizhUwEGI3mC9NZQ?pwd=cfc5
任务简报
任务要求:
某公司有两份数据文件,现需要对其进行分析处理,计算 每日的销售额 并以柱状图表的形式进行展示。

我们打开两份文件:

- 一月份数据是普通文本,使用逗号分割数据记录,从前到后分别是:日期,订单id,销售额,销售省份

- 二月份数据是JSON数据,同样包含(日期,订单id,销售额,销售省份)
简单分析可得,实现方法就是找到同一天的所有销售金额并且相加,具体需求就是:
- 读取数据 ➡️ 设计FileReader类
- 封装数据对象 ➡️ 设计数据封装类
- 计算数据对象 ➡️ 对对象进行逻辑计算
- pyecharts绘图 ➡️ 以面向对象思想重新认知pyecharts
文件读取
新建一个文件夹作为整个项目的文件夹,此处以数据案例分析为例。
从技术层面上我们有几个步骤:
- 设计一个类,可以完成数据的封装
- 设计一个抽象类(方便处理两种不同形式的文件),定义文件读取的相关功能,并使用子类实现具体功能
- 读取文件,生产数据对象
- 进行数据需求的逻辑计算(计算每一天的销售额)
- 通过PyEcharts进行图形绘制
数据封装
创建data_define.py文件,输入:
1
2
3
4
5
6
7
8
9
|
class Record:
def __init__(self,date,order_id,money,province):
self.date = date # 订单日期
self.order_id = order_id # 订单ID
self.money = money # 订单金额
self.province = province # 销售省份
def __str__(self): # 使用魔术方法规范输出内容方便测试
return f'{self.date} {self.order_id} {self.money} {self.province}'
|
文件读取
接着进行第二部,创建文件file_define.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
import json
from data_define import Record
class FileReader:
def read_data(self) -> list[Record]: # 读取文件的数据,读到的每一条数据都转换为Record对象,将它们都封装到list内返回
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')
record_list:list[Record] = []
for line in f.readlines():
line = line.strip() # 去掉输出内容中的回车换行符\n,方便操作
data_list = line.split(',')
record = Record(data_list[0], data_list[1], int(data_list[2]), data_list[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:list[Record] = []
for line in f.readlines():
data_dict = json.loads(line)
record = Record(data_dict['date'],data_dict['order_id'],data_dict['money'],data_dict['province'])
record_list.append(record)
f.close()
return record_list
if __name__ == '__main__': # 文件内测试
txtreader = TXTReader('T:/2011年1月销售数据.txt')
jsonreader = JsonReader('T:/2011年2月销售数据JSON.txt')
list1 = txtreader.read_data()
list2 = jsonreader.read_data()
for l in list1:
print(l)
for l in list2:
print(l)
|
数据计算
创建main.py主文件,输入下面的核心计算代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
from file_define import FileReader,TXTReader,JsonReader
from data_define import Record
text_file_reader = TXTReader("T:/2011年1月销售数据.txt")
jsonReader = JsonReader("T:/2011年2月销售数据JSON.txt")
jan_data:list[Record] = text_file_reader.read_data()
feb_data:list[Record] = jsonReader.read_data()
# 将两个月的数据合并为1个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)
|
可视化开发
可视化我们依旧使用pyecharts模块,这里我们修改main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
from cProfile import label
from file_define import FileReader,TXTReader,JsonReader
from data_define import Record
"""新增内容:导包"""
from pyecharts.charts import Bar
from pyecharts.options import *
from pyecharts.globals import ThemeType
text_file_reader = TXTReader("T:/2011年1月销售数据.txt")
jsonReader = JsonReader("T:/2011年2月销售数据JSON.txt")
jan_data:list[Record] = text_file_reader.read_data()
feb_data:list[Record] = jsonReader.read_data()
# 将两个月的数据合并为1个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
# 可视化图标开发
bar = Bar(init_opts=InitOpts(theme=ThemeType.LIGHT))
bar.add_xaxis(list(data_dict.keys())) # 添加x轴数据
bar.add_yaxis("销售额",list(data_dict.values()), label_opts=LabelOpts(is_show=False)) # 添加y轴数据和视觉优化
bar.set_global_opts(
title_opts=TitleOpts(title="每日销售额"),
)
bar.render('每日销售额柱状图.html')
|