用面向对象思想实现数据分析
1、设计类,完成数据封装
2、设计抽象类,定义文件读取相关功能,使用子类实现具体功能(由于两份文件格式不同)
3、读取文件,产生数据对象
4、计算每天销售额
5、绘图
一、数据封装类设计
"""
数据定义的类
"""
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}"
二、抽象类,子类,获取数据
"""
文件相关的类定义
"""
import json
from data_define import Record
class FileReader:
def read_data(self) -> list[Record]:
# 读文件数据,将读到数据转为Record对象,将其封装到list内返回
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] = [] # 类型注解
# lines = f.readlines()
# print(lines)
for line in f.readlines():
# print(line)
line = line.strip() # 去除首尾空格换行符
data_list = line.split(',')
# print(data_list)
# 将数据转为Record类对象 ['2011-01-01', '4b34218c-9f37-4e66-b33e-327ecd5fb897', '1689', '湖南省']
record = Record(data_list[0], data_list[1], int(data_list[2]), data_list[3])
record_list.append(record)
# 关闭文件流
f.close()
# print(record_list)
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") # 成员变量勿忘self
record_list: list[Record] = list() # 类型注解
# print(f.read())
for line in f:
data_dict = json.loads(line)
# print(data_dict)
# 将数据转为Record类对象
"""
{'date': '2011-02-01',
'order_id': 'caf99222-53d6-427b-925d-3187fc71a86a',
'money': 1805,
'province': '江西省'}
"""
record = Record(data_dict["date"], data_dict["order_id"], int(data_dict["money"]), data_dict["province"])
record_list.append(record)
# 关闭文件流
f.close()
# print(record_list)
return record_list
if __name__ == '__main__':
text_file_reader = TextFileReader("D:/2011年1月销售数据.txt") # 传入形参path
list_1 = text_file_reader.read_data()
json_file_reader = JsonFileReader("D:/2011年2月销售数据JSON.txt")
list_2 = json_file_reader.read_data()
print(list_1) # [<data_define.Record object at 0x0000020F03DD32B0>,.....]
print(list_2) # 直接打印,显示内存地址
# 一月数据
for l in list_1:
print(l)
# 二月数据
for l in list_2:
print(l)
合并数据,计算,绘图
# 用面向对象思想实现数据分析
"""
1、设计类,完成数据封装
2、设计抽象类,定义文件读取相关功能,使用子类实现具体功能(由于两份文件格式不同)
3、读取文件,产生数据对象
4、计算每天销售额
5、绘图
"""
from file_define import FileReader, JsonFileReader, TextFileReader
from data_define import Record
from pyecharts.charts import Bar
from pyecharts.options import *
from pyecharts.globals import *
text_file_reader = TextFileReader("D:/2011年1月销售数据.txt")
json_file_reader = JsonFileReader("D:/2011年2月销售数据JSON.txt")
data_1: list[Record] = text_file_reader.read_data() # 一月数据
data_2: list[Record] = json_file_reader.read_data() # 二月数据
# 将两个月数据合并
# data_1.extend(data_2)
all_data: list[Record] = data_1 + data_2
# for i in all_data:
# print(i)
# 计算数据,用字典存储
data_dict = {}
for record in all_data:
"""
if record.data in data_dict.keys():
当前日期已经有记录,故更新操作作累加
data_dict[record.date] += record.money
else:
data_dict[record.date] = record.money
"""
try:
# 字典更新操作:dict[key] = value
data_dict[record.date] += record.money
except:
# 字典新增操作:dict[key] = value
data_dict[record.date] = record.money
# print(data_dict)
# print(data_dict.keys()) # 取出所有key
# print(data_dict.values()) # 取出所有value
# 绘图
bar = Bar(
init_opts=InitOpts(theme=ThemeType.ESSOS)
)
# 注意此处取数据方法
bar.add_xaxis(list(data_dict.keys())) # 日期,强转为list类型
bar.add_yaxis("销售额", list(data_dict.values()), label_opts=LabelOpts(is_show=False))
bar.set_global_opts(
title_opts=TitleOpts(title="每日销售额"),
toolbox_opts=ToolboxOpts(is_show=True)
)
bar.render("销售额.html")