当前位置:   article > 正文

Python学习从0到1 day23 第二阶段 面向对象 ⑥ 综合案例

Python学习从0到1 day23 第二阶段 面向对象 ⑥ 综合案例

 先有自我,才无枷锁

                       —— 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. '''
  2. 数据定义的类
  3. 1. 设计一个类,可以完成数据的封装
  4. '''
  5. class Record:
  6. # 使用构造方法定义成员变量 方便在构造类对象的时候直接赋值
  7. def __init__(self,data,order_id,money,province):
  8. self.data = data # 订单日期
  9. self.order_id = order_id # 订单ID
  10. self.money = money # 订单金额
  11. self.province = province # 销售省份
  12. # 定义一个魔术方法
  13. # 定义一个成员方法,不然直接返回会返回一个内存地址
  14. def __str__(self):
  15. return f"{self.data},{self.order_id},{self.money},{self.province}"

tips:

        在设计类的时候使用构造方法定义成员变量,构造类对象的时候可以直接赋值

  1. def __init__(self,data,order_id,money,province):
  2. self.data = data # 订单日期
  3. self.order_id = order_id # 订单ID
  4. self.money = money # 订单金额
  5. self.province = province # 销售省份

        ② 定义一个魔术方法,规定返回的数据类型

  1. def __str__(self):
  2. return f"{self.data},{self.order_id},{self.money},{self.province}"

2.file_define

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

  1. '''
  2. 和文件相关的类定义在这里
  3. 2. 设计一个抽象类,定义文件读取的相关功能,并使用子类实现具体功能
  4. '''
  5. import json
  6. # 导包
  7. from data_define import Record
  8. # 定义一个抽象类用来做顶层设计,确定类中有哪些功能需要实现
  9. class FileReader:
  10. # 顶层设计 pass变为抽象方法
  11. def read_data(self) -> list[Record]: # 返回值是一个Record类的列表List
  12. # 读取文件的数据,将读到的每一条数据都转换为我们定义的Record类对象,使用list将record对象封装起来返回即可
  13. pass
  14. # 文本数据的文件读取器,继承抽象类
  15. class TextFileReader(FileReader):
  16. # 定义一个构造方法
  17. def __init__(self, path):
  18. self.path = path # 定义成员变量记录文件的路径
  19. # 复写(实现抽象方法)父类的方法
  20. def read_data(self) -> list[Record]:
  21. # 方法内部使用成员变量用self
  22. f = open(self.path, "r", encoding="UTF-8")
  23. # 类型注解
  24. record_list: list[Record] = []
  25. for line in f.readlines():
  26. # 消除读取到的每一行数据中的\n
  27. line = line.strip()
  28. # 以逗号用split方法进行切割
  29. data_list = line.split(",")
  30. # 金钱数字进行转换int()
  31. record = Record(data_list[0], data_list[1], int(data_list[2]), data_list[3])
  32. record_list.append(record)
  33. # 关闭文件对象
  34. f.close()
  35. # 返回record对象列表
  36. return record_list
  37. # JSON文件读取器2,同样继承于FileReader
  38. class JsonFileReader(FileReader):
  39. def __init__(self, path):
  40. # 定义成员变量记录文件的路径
  41. self.path = path
  42. def read_data(self) -> list[Record]:
  43. f = open(self.path, "r", encoding="UTF-8")
  44. record_list: list[Record] = []
  45. for line in f.readlines():
  46. data_dict = json.loads(line)
  47. record = Record(data_dict["date"], data_dict["order_id"], int(data_dict["money"]), data_dict["province"])
  48. # 将record对象放入record_list中,并返回
  49. record_list.append(record)
  50. # 关闭文件对象
  51. f.close()
  52. return record_list
  53. if __name__ == '__main__':
  54. text_file_reader = TextFileReader("E:\python.learning\第13章资料/2011年1月销售数据.txt")
  55. json_file_reader = JsonFileReader("E:\python.learning\第13章资料/2011年2月销售数据JSON.txt")
  56. list1 = text_file_reader.read_data()
  57. list2 = json_file_reader.read_data()
  58. for l in list1:
  59. # 魔术方法
  60. print(l)
  61. for l in list2:
  62. print(l)

tips:

         抽象类用来做顶层设计,确定类中有哪些功能需要实现

  1. class FileReader:
  2. # 顶层设计 pass变为抽象方法
  3. def read_data(self) -> list[Record]: # 返回值是一个Record类的列表List
  4. # 读取文件的数据,将读到的每一条数据都转换为我们定义的Record类对象,使用list将record对象封装起来返回即可
  5. pass

        文本数据的文件读取器,继承抽象类

  1. class TextFileReader(FileReader):
  2. # 定义一个构造方法
  3. def __init__(self, path):
  4. self.path = path # 定义成员变量记录文件的路径
  5. # 复写(实现抽象方法)父类的方法
  6. def read_data(self) -> list[Record]:
  7. # 方法内部使用成员变量用self
  8. f = open(self.path, "r", encoding="UTF-8")
  9. # 类型注解
  10. record_list: list[Record] = []
  11. for line in f.readlines():
  12. # 消除读取到的每一行数据中的\n
  13. line = line.strip()
  14. # 以逗号用split方法进行切割
  15. data_list = line.split(",")
  16. # 金钱数字进行转换int()
  17. record = Record(data_list[0], data_list[1], int(data_list[2]), data_list[3])
  18. record_list.append(record)
  19. # 关闭文件对象
  20. f.close()
  21. # 返回record对象列表
  22. return record_list

          JSON文件读取器2,同样继承于FileReader

  1. class JsonFileReader(FileReader):
  2. def __init__(self, path):
  3. # 定义成员变量记录文件的路径
  4. self.path = path
  5. def read_data(self) -> list[Record]:
  6. f = open(self.path, "r", encoding="UTF-8")
  7. record_list: list[Record] = []
  8. for line in f.readlines():
  9. data_dict = json.loads(line)
  10. record = Record(data_dict["date"], data_dict["order_id"], int(data_dict["money"]), data_dict["province"])
  11. # 将record对象放入record_list中,并返回
  12. record_list.append(record)
  13. # 关闭文件对象
  14. f.close()
  15. return record_list

        魔术方法,在当前类中进行测试

  1. if __name__ == '__main__':
  2. text_file_reader = TextFileReader("E:\python.learning\第13章资料/2011年1月销售数据.txt")
  3. json_file_reader = JsonFileReader("E:\python.learning\第13章资料/2011年2月销售数据JSON.txt")
  4. list1 = text_file_reader.read_data()
  5. list2 = json_file_reader.read_data()
  6. for l in list1:
  7. # 魔术方法
  8. print(l)
  9. for l in list2:
  10. print(l)

        读取结果

3.数据分析及可视化

  1. # 导包
  2. from file_define import FileReader, TextFileReader, JsonFileReader
  3. from data_define import Record
  4. # 导入Bar对象绘制柱状图
  5. from pyecharts.charts import Bar
  6. # 导入主题的包
  7. from pyecharts.globals import ThemeType
  8. # 导入选项的包
  9. from pyecharts.options import *
  10. # 读取数据,将读取到的数据保存在变量中
  11. text_file_reader = TextFileReader("E:\python.learning\第13章资料/2011年1月销售数据.txt")
  12. json_file_reader = JsonFileReader("E:\python.learning\第13章资料/2011年2月销售数据JSON.txt")
  13. # 一月份数据
  14. jan_data: list[Record] = text_file_reader.read_data() # 类型注解
  15. # 二月份数据
  16. feb_data: list[Record] = json_file_reader.read_data() # 类型注解
  17. # 将两个月份的数据合并为1个list来存储,通过加法存储
  18. all_data: list[Record] = jan_data + feb_data # 类型注解
  19. # 开始进行数据计算
  20. # 用字典类型数据结构解决数据计算问题,将字典索引项相同的项的值进行相加,因为字典的key索引是不会重复的
  21. # eg:{“2011-01-01”:1234,"2011-01-02":300,"2011-01-03":650}
  22. data_dict = {}
  23. # 得到一个个的类对象
  24. for record in all_data:
  25. # if语句判断当前日期是否存在字典的索引类型中
  26. if record.data in data_dict.keys():
  27. # 当前日期已经记录了,累加即可
  28. data_dict[record.data] += record.money
  29. else:
  30. # 说明是新类型的第一条记录
  31. data_dict[record.data] = record.money
  32. # 可视化图表开发 pyecharts模块进行开发 Bar是一个类,导入这个包,构建Bar对象
  33. # init_opts传入主题设置
  34. bar = Bar(init_opts=InitOpts(theme=ThemeType.LIGHT))
  35. # 得到全部的key,转化为list
  36. # 添加x轴数据
  37. bar.add_xaxis(list(data_dict.keys()))
  38. # 添加y轴数据
  39. bar.add_yaxis("销售额", list(data_dict.values()),label_opts=LabelOpts(is_show=False))
  40. # 给当前图表设置小标题
  41. bar.set_global_opts(
  42. # 传一个标题对象,构造一个类对象,通过构造方法传参
  43. title_opts=TitleOpts(title="每日销售额")
  44. )
  45. # 通过成员方法给柱状图起名
  46. bar.render("每日销售额柱状图.html")

tips:

        读取数据,将读取到的数据保存在变量中

  1. text_file_reader = TextFileReader("E:\python.learning\第13章资料/2011年1月销售数据.txt")
  2. json_file_reader = JsonFileReader("E:\python.learning\第13章资料/2011年2月销售数据JSON.txt")
  3. # 一月份数据
  4. jan_data: list[Record] = text_file_reader.read_data() # 类型注解
  5. # 二月份数据
  6. feb_data: list[Record] = json_file_reader.read_data() # 类型注解
  7. # 将两个月份的数据合并为1个list来存储,通过加法存储
  8. all_data: list[Record] = jan_data + feb_data # 类型注解

        ② 数据计算

  1. # 用字典类型数据结构解决数据计算问题,将字典索引项相同的项的值进行相加,因为字典的key索引是不会重复的
  2. # eg:{“2011-01-01”:1234,"2011-01-02":300,"2011-01-03":650}
  3. data_dict = {}
  4. # 得到一个个的类对象
  5. for record in all_data:
  6. # if语句判断当前日期是否存在字典的索引类型中
  7. if record.data in data_dict.keys():
  8. # 当前日期已经记录了,累加即可
  9. data_dict[record.data] += record.money
  10. else:
  11. # 说明是新类型的第一条记录
  12. data_dict[record.data] = record.money

        ③ 可视化图表开发

  1. # 可视化图表开发 pyecharts模块进行开发 Bar是一个类,导入这个包,构建Bar对象
  2. # init_opts传入主题设置
  3. bar = Bar(init_opts=InitOpts(theme=ThemeType.LIGHT))
  4. # 得到全部的key,转化为list
  5. # 添加x轴数据
  6. bar.add_xaxis(list(data_dict.keys()))
  7. # 添加y轴数据
  8. bar.add_yaxis("销售额", list(data_dict.values()),label_opts=LabelOpts(is_show=False))
  9. # 给当前图表设置小标题
  10. bar.set_global_opts(
  11. # 传一个标题对象,构造一个类对象,通过构造方法传参
  12. title_opts=TitleOpts(title="每日销售额")
  13. )
  14. # 通过成员方法给柱状图起名
  15. bar.render("每日销售额柱状图.html")

可视化图表

             

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/405805
推荐阅读
相关标签
  

闽ICP备14008679号