面向对象之数据分析

实现步骤:

  1. 设计一个类,可以完成数据的封装

  2. 设计一个抽象类,定义文件读取的相关功能,并使用子类实现具体功能

  3. 读取文件,生产数据对象

  4. 进行数据需求的逻辑计算(计算每一天的销售额)

  5. 通过PyEcharts进行图形绘制

    数据处理(file_define.py)

    • 业务逻辑:传入要处理的文件的路径,然后将读取到的数据都转换为Record对象,最后将其封装成list返回
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
46
47
48
49
50
51
52
53
54
55
56
57
58
"""
和文件相关类的定义
"""
from Class_Exercise_Demo.data_define import Record
import json


# 先定义一个抽象类用来做顶层设计,确定有哪些功能需要实现
class FileReader:

def read_data(self) -> list: # 该函数为读取文件的数据的函数,注释函数的返回值为list类型
pass


record_list = [] # 定义空列表,用来存放读取到的数据


class TextFileReader(FileReader): # 定义txt文件读取子类,继承自FileReader父类

def __init__(self, path):
self.path = path # 定义成员变量记录文件的路径

# 复写(实现抽象方法)父类的方法
def read_data(self):
f = open(self.path, 'r', encoding="utf8")
for line in f.readlines(): # readlines函数读取到文本文件的每一行,line为一行
line.strip() # 消除每一行读取到的数据中的\n
data_list = line.split(',') # 将数据以,进行分割
# 实例化record对象并将函数实参传递到Record函数中
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 JsonFileReader(FileReader): # 定义json文件读取子类,继承自FileReader父类
def __init__(self, path):
self.path = path

def read_data(self): # 复写父类的read_data方法
with open(self.path, 'r', encoding='utf8') as f:
for line in f.readlines():
data_dict = json.loads(line) # 将json格式转化为字典格式,并以键值对存储
record = Record(data_dict['date'], data_dict['order_id'], int(data_dict['money']), data_dict['province'])
record_list.append(record) # 将实例化后的对象放入列表中
return record_list

# 进行测试
if __name__ == "__main__":
my_txt_path = "./2011年1月销售数据.txt"
my_json_path = "./2011年2月销售数据JSON.txt"
text_file = TextFileReader(my_txt_path) # 将处理文本文件的方法实例化,并传入path参数
json_file = JsonFileReader(my_json_path) # 处理json文本数据,并将path参数传入
list1 = text_file.read_data() # 读取数据并将数据写入record_list列表中
list2 = json_file.read_data() # 读取数据并将数据写入
for l in list2:
print(l)

数据定义(data_define.py)

  • 业务逻辑:定义数据的格式,以及通过__str__ 魔术方法将对象按照自定义格式输出

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    """
    数据定义的类
    """
    class Record:

    def __init__(self, date, order_id, money, province):
    """
    使用构造方法完成成员变量的定义,并且在构造类对象的时候便于给成员变量赋值
    :param date: str
    :param order_id: str
    :param money: int
    :param province: str
    """
    self.date = date # 订单日期
    self.order_id = order_id # 订单编号
    self.money = money # 订单金额
    self.province = province # 订单省份

    def __str__(self):
    return f'{self.date}, {self.order_id}, {self.money}, {self.province}'

    数据处理(main.py)

    • 业务逻辑:对从text文件和json文件获得的数据合并成为一个列表对象,并对数据进行计算(统计每天的销售额),将相同的日期合并,如–date: ‘2021.02.10’ money: “28182”–
    • 这里由于Python解释器或者pycharm版本的不对,会导致”from pyecharts.charts import Bar”这句报错。不过我们最初的目的是写面向对象的demo,于是通过pyecharts绘图这部分虽然运行不出来我也没有去具体深究(不求甚解)。
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 Class_Exercise_Demo.data_define import Record
from Class_Exercise_Demo.file_define import *
from pyecharts.charts import Bar
from pyecharts.options import *
from pyecharts.globals import ThemeType

# 下面这两个是实例化的对象
text_file_reader = TextFileReader("./2011年1月销售数据.txt") # 将处理text文本的方法实例化
json_file_reader = JsonFileReader("./2011年2月销售数据JSON.txt") # 将处理json的方法实例化

list1 = text_file_reader.read_data() # 对象调用类中的方法
list2 = json_file_reader.read_data()

all_list = list2 + list1 # 将两个列表合并

# 开始进行数据计算
data_dict = {} # 定义空的字典用于暂时存放数据
for record in all_list:
# 这里record为键值对,是一组字典。里面存放date: '', order_id: '', money: '',
if record.date in data_dict.keys():
# 当前日期已经有记录了,所以和老记录做累加即可
data_dict[record.date] += record.money
else: # 否则将date添加到data_dict
data_dict[record.date] = record.money

print(data_dict) # 测试
# 可视化图表开发
bar = Bar(init_opts=InitOpts(theme=ThemeType.LIGHT)) # 实例化一个柱状图对象

bar.add_xaxis(list(data_dict.keys())) # 添加x轴的数据,data_dict.keys ==> 日期,将日期转为list
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")