S1.10 练习:数据分析案例

本次练习中使用的文件位于:https://pan.baidu.com/s/1xpTMQtKizhUwEGI3mC9NZQ?pwd=cfc5

任务简报

任务要求:

某公司有两份数据文件,现需要对其进行分析处理,计算 每日的销售额 并以柱状图表的形式进行展示。

我们打开两份文件:

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

  • 二月份数据是JSON数据,同样包含(日期,订单id,销售额,销售省份)

简单分析可得,实现方法就是找到同一天的所有销售金额并且相加,具体需求就是:

  1. 读取数据 ➡️ 设计FileReader类
  2. 封装数据对象 ➡️ 设计数据封装类
  3. 计算数据对象 ➡️ 对对象进行逻辑计算
  4. pyecharts绘图 ➡️ 以面向对象思想重新认知pyecharts

文件读取

新建一个文件夹作为整个项目的文件夹,此处以数据案例分析为例。

从技术层面上我们有几个步骤:

  1. 设计一个类,可以完成数据的封装
  2. 设计一个抽象类(方便处理两种不同形式的文件),定义文件读取的相关功能,并使用子类实现具体功能
  3. 读取文件,生产数据对象
  4. 进行数据需求的逻辑计算(计算每一天的销售额)
  5. 通过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')
Licensed under CC BY-NC-SA 4.0
已存在于互联网
发表了126篇文章 · 总计210.25k字
萌ICP备20267077号
Powered by ctOS