赞
踩
先有自我,才无枷锁
—— 24.4.10
知识简介
1.使用面向对象思想完成数据读取和处理
2.基于面向对象思想重新认知第三方库的使用(PyEcharts)
数据分析案例
某公司,有2份数据文件,现需要对其进行分析处理,计算每日的销售额并以柱状图表的形式进行展示
1月份数据是普通文本,使用逗号分割数据记录,从前到后依次是(日期、订单ID、销售额、销售省份)
2月份数据是JSON数据,同样包含(日期,订单ID,销售额,销售省份)
需求分析
① 读取数据 设计FileReader类
② 封装数据对象 设计数据封装类
③ 计算数据对象 对对象进行逻辑计算
④ pyecharts绘图 以面向对象思想重新认知pyecharts
实现步骤: 1. 设计一个类,可以完成数据的封装 2. 设计一个抽象类,定义文件读取的相关功能,并使用子类实现具体功能 3. 读取文件,生成数据对象 4. 进行数据需求的逻辑运算(计算每一天的销售额) 5. 通过PyEcharts进行图形绘制
1.data_define
设计一个类可以完成数据的封装
''' 数据定义的类 1. 设计一个类,可以完成数据的封装 ''' class Record: # 使用构造方法定义成员变量 方便在构造类对象的时候直接赋值 def __init__(self,data,order_id,money,province): self.data = data # 订单日期 self.order_id = order_id # 订单ID self.money = money # 订单金额 self.province = province # 销售省份 # 定义一个魔术方法 # 定义一个成员方法,不然直接返回会返回一个内存地址 def __str__(self): return f"{self.data},{self.order_id},{self.money},{self.province}"tips:
① 在设计类的时候使用构造方法定义成员变量,构造类对象的时候可以直接赋值
def __init__(self,data,order_id,money,province): self.data = data # 订单日期 self.order_id = order_id # 订单ID self.money = money # 订单金额 self.province = province # 销售省份② 定义一个魔术方法,规定返回的数据类型
def __str__(self): return f"{self.data},{self.order_id},{self.money},{self.province}"2.file_define
设计一个抽象类定义文件读取的相关功能,并使用子类实现具体功能
''' 和文件相关的类定义在这里 2. 设计一个抽象类,定义文件读取的相关功能,并使用子类实现具体功能 ''' import json # 导包 from data_define import Record # 定义一个抽象类用来做顶层设计,确定类中有哪些功能需要实现 class FileReader: # 顶层设计 pass变为抽象方法 def read_data(self) -> list[Record]: # 返回值是一个Record类的列表List # 读取文件的数据,将读到的每一条数据都转换为我们定义的Record类对象,使用list将record对象封装起来返回即可 pass # 文本数据的文件读取器,继承抽象类 class TextFileReader(FileReader): # 定义一个构造方法 def __init__(self, path): self.path = path # 定义成员变量记录文件的路径 # 复写(实现抽象方法)父类的方法 def read_data(self) -> list[Record]: # 方法内部使用成员变量用self f = open(self.path, "r", encoding="UTF-8") # 类型注解 record_list: list[Record] = [] for line in f.readlines(): # 消除读取到的每一行数据中的\n line = line.strip() # 以逗号用split方法进行切割 data_list = line.split(",") # 金钱数字进行转换int() record = Record(data_list[0], data_list[1], int(data_list[2]), data_list[3]) record_list.append(record) # 关闭文件对象 f.close() # 返回record对象列表 return record_list # JSON文件读取器2,同样继承于FileReader class JsonFileReader(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"], int(data_dict["money"]), data_dict["province"]) # 将record对象放入record_list中,并返回 record_list.append(record) # 关闭文件对象 f.close() return record_list if __name__ == '__main__': text_file_reader = TextFileReader("E:\python.learning\第13章资料/2011年1月销售数据.txt") json_file_reader = JsonFileReader("E:\python.learning\第13章资料/2011年2月销售数据JSON.txt") list1 = text_file_reader.read_data() list2 = json_file_reader.read_data() for l in list1: # 魔术方法 print(l) for l in list2: print(l)tips:
① 抽象类用来做顶层设计,确定类中有哪些功能需要实现
class FileReader: # 顶层设计 pass变为抽象方法 def read_data(self) -> list[Record]: # 返回值是一个Record类的列表List # 读取文件的数据,将读到的每一条数据都转换为我们定义的Record类对象,使用list将record对象封装起来返回即可 pass② 文本数据的文件读取器,继承抽象类
class TextFileReader(FileReader): # 定义一个构造方法 def __init__(self, path): self.path = path # 定义成员变量记录文件的路径 # 复写(实现抽象方法)父类的方法 def read_data(self) -> list[Record]: # 方法内部使用成员变量用self f = open(self.path, "r", encoding="UTF-8") # 类型注解 record_list: list[Record] = [] for line in f.readlines(): # 消除读取到的每一行数据中的\n line = line.strip() # 以逗号用split方法进行切割 data_list = line.split(",") # 金钱数字进行转换int() record = Record(data_list[0], data_list[1], int(data_list[2]), data_list[3]) record_list.append(record) # 关闭文件对象 f.close() # 返回record对象列表 return record_list③ JSON文件读取器2,同样继承于FileReader
class JsonFileReader(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"], int(data_dict["money"]), data_dict["province"]) # 将record对象放入record_list中,并返回 record_list.append(record) # 关闭文件对象 f.close() return record_list④ 魔术方法,在当前类中进行测试
if __name__ == '__main__': text_file_reader = TextFileReader("E:\python.learning\第13章资料/2011年1月销售数据.txt") json_file_reader = JsonFileReader("E:\python.learning\第13章资料/2011年2月销售数据JSON.txt") list1 = text_file_reader.read_data() list2 = json_file_reader.read_data() for l in list1: # 魔术方法 print(l) for l in list2: print(l)⑤ 读取结果
3.数据分析及可视化
# 导包 from file_define import FileReader, TextFileReader, JsonFileReader from data_define import Record # 导入Bar对象绘制柱状图 from pyecharts.charts import Bar # 导入主题的包 from pyecharts.globals import ThemeType # 导入选项的包 from pyecharts.options import * # 读取数据,将读取到的数据保存在变量中 text_file_reader = TextFileReader("E:\python.learning\第13章资料/2011年1月销售数据.txt") json_file_reader = JsonFileReader("E:\python.learning\第13章资料/2011年2月销售数据JSON.txt") # 一月份数据 jan_data: list[Record] = text_file_reader.read_data() # 类型注解 # 二月份数据 feb_data: list[Record] = json_file_reader.read_data() # 类型注解 # 将两个月份的数据合并为1个list来存储,通过加法存储 all_data: list[Record] = jan_data + feb_data # 类型注解 # 开始进行数据计算 # 用字典类型数据结构解决数据计算问题,将字典索引项相同的项的值进行相加,因为字典的key索引是不会重复的 # eg:{“2011-01-01”:1234,"2011-01-02":300,"2011-01-03":650} data_dict = {} # 得到一个个的类对象 for record in all_data: # if语句判断当前日期是否存在字典的索引类型中 if record.data in data_dict.keys(): # 当前日期已经记录了,累加即可 data_dict[record.data] += record.money else: # 说明是新类型的第一条记录 data_dict[record.data] = record.money # 可视化图表开发 pyecharts模块进行开发 Bar是一个类,导入这个包,构建Bar对象 # init_opts传入主题设置 bar = Bar(init_opts=InitOpts(theme=ThemeType.LIGHT)) # 得到全部的key,转化为list # 添加x轴数据 bar.add_xaxis(list(data_dict.keys())) # 添加y轴数据 bar.add_yaxis("销售额", list(data_dict.values()),label_opts=LabelOpts(is_show=False)) # 给当前图表设置小标题 bar.set_global_opts( # 传一个标题对象,构造一个类对象,通过构造方法传参 title_opts=TitleOpts(title="每日销售额") ) # 通过成员方法给柱状图起名 bar.render("每日销售额柱状图.html")tips:
① 读取数据,将读取到的数据保存在变量中
text_file_reader = TextFileReader("E:\python.learning\第13章资料/2011年1月销售数据.txt") json_file_reader = JsonFileReader("E:\python.learning\第13章资料/2011年2月销售数据JSON.txt") # 一月份数据 jan_data: list[Record] = text_file_reader.read_data() # 类型注解 # 二月份数据 feb_data: list[Record] = json_file_reader.read_data() # 类型注解 # 将两个月份的数据合并为1个list来存储,通过加法存储 all_data: list[Record] = jan_data + feb_data # 类型注解② 数据计算
# 用字典类型数据结构解决数据计算问题,将字典索引项相同的项的值进行相加,因为字典的key索引是不会重复的 # eg:{“2011-01-01”:1234,"2011-01-02":300,"2011-01-03":650} data_dict = {} # 得到一个个的类对象 for record in all_data: # if语句判断当前日期是否存在字典的索引类型中 if record.data in data_dict.keys(): # 当前日期已经记录了,累加即可 data_dict[record.data] += record.money else: # 说明是新类型的第一条记录 data_dict[record.data] = record.money③ 可视化图表开发
# 可视化图表开发 pyecharts模块进行开发 Bar是一个类,导入这个包,构建Bar对象 # init_opts传入主题设置 bar = Bar(init_opts=InitOpts(theme=ThemeType.LIGHT)) # 得到全部的key,转化为list # 添加x轴数据 bar.add_xaxis(list(data_dict.keys())) # 添加y轴数据 bar.add_yaxis("销售额", list(data_dict.values()),label_opts=LabelOpts(is_show=False)) # 给当前图表设置小标题 bar.set_global_opts( # 传一个标题对象,构造一个类对象,通过构造方法传参 title_opts=TitleOpts(title="每日销售额") ) # 通过成员方法给柱状图起名 bar.render("每日销售额柱状图.html")可视化图表
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。