文章目录
- 数据分析案例
- 目的
- 需求
- 数据准备
- 实践
- 数据记录类
- 文件解析
- 解析csv格式
- 解析json文件
- 进行数据计算
- 读取文件数据
- 按日期累加数据
- 图表展示
- 图标绘制
- 最终效果展示
数据分析案例
目的
- 文件操作实践
- json库使用
- 三方库pyecharts使用
- 面向对象实践
- 数据容器使用
需求
- 给定一个csv内容和json内容文件,展示对应日期的销售额到柱状图
数据准备
-
csv格式数据新建
text_csv.txt
2024-01-01,dvhvhdsvad,123,bj 2024-01-01,dfgdsgds,543,bj 2024-01-01,dfgdy23sgds,553,hb 2024-01-01,dfgdsgdsasads,144,hb 2024-01-02,dv43dsadshvhdsvad,775,bj 2024-01-02,dvhgrsfdvhdsvad,143,bj 2024-01-02,dv43dsadshvhdsvad,643,hb 2024-01-02,dvhgrsfdvhdsvad,532,hb
-
新建
text_json.txt
{"date":"2024-01-03","order_id":"dvhvhdsvad","money":54,"province":"bj"} {"date":"2024-01-03","order_id":"dfgdsgds","money":543,"province":"bj"} {"date":"2024-01-03","order_id":"dfgdy23sgds","money":43,"province":"hb"} {"date":"2024-01-03","order_id":"dfgdsgdsasads","money":32,"province":"hb"} {"date":"2024-01-04","order_id":"dv43dsa4dshvhdsvad","money":456,"province":"bj"} {"date":"2024-01-04","order_id":"dvhgrsfdvhdsvad","money":865,"province":"bj"} {"date":"2024-01-04","order_id":"dv43dsaddshvhdsvad","money":321,"province":"hb"} {"date":"2024-01-04","order_id":"dvhgrsfdvhdsvad","money":23,"province":"hb"}
实践
数据记录类
- 分析给定数据,可以看出两个文件中都是有4列数据,据此定义记录类
- 新建
data_define.py
# *_*coding:utf-8 *_*
# 记录类
class Record:def __init__(self, date, order_id, money, province):self.date = dateself.order_id = order_idself.money = moneyself.province = provincedef __str__(self) -> str:return f'{self.date}, {self.order_id}, {self.money}, {self.province}'
文件解析
- 根据需求可知需要解析的文件格式有两种
- csv格式的数据是字符串使用逗号分隔
- json数据是每一条记录使用标准的json格式定义
- 根据面向对象的思想,我们设计抽象类然后分别使用具体的格式去重写抽象类的方法
- 代码示例:新建
file_define.py
文件
# 抽象文件阅读类
class FileReader:def read_file(self) -> list[Record]:pass
解析csv格式
-
使用继承的方式,继承抽象类
FileReader
,并重写read_file
方法 -
主要逻辑
- 打开文件
- 挨个读取文件的每一行
- 去除每一行的换行符,根据逗号获取每一行的每一个数据
- 调用数据记录构造记录,并将其追加到记录列表中
- 关闭文件,返回记录列表
-
代码示例
class CsvFileReader(FileReader): path = Nonedef __init__(self, path):self.path = pathdef read_file(self) -> list[Record]:f = open(self.path, "r", encoding="UTF-8")list_record: list[Record] = []for line in f.readlines():# 去除换行line = line.strip()line = line.split(",")record = Record(line[0], line[1], line[2], line[3])list_record.append(record)f.close()return list_record
解析json文件
-
使用继承的方式,继承抽象类
FileReader
,并重写read_file
方法 -
主要逻辑
- 打开文件
- 挨个读取文件的每一行
- 去除每一行的换行符
- 调用json.loads方法将当前行字符串转化为字典类型
- 调用数据记录构造记录,并将其追加到记录列表中
- 关闭文件,返回记录列表
-
代码示例
class JsonFileReader(FileReader):path = Nonedef __init__(self, path):self.path = pathdef read_file(self) -> list[Record]:f = open(self.path, "r", encoding="UTF-8")list_record: list[Record] = []for line in f.readlines():# 去除换行line = line.strip()line = json.loads(line)record = Record(line['date'], line['order_id'], line['money'], line['province'])list_record.append(record)f.close()return list_record
进行数据计算
读取文件数据
- 分别读取csv和json格式的数据,并将数据累加到列表中
# 分别获取csv和json文件数据
csv_data = CsvFileReader("./text_csv.txt").read_file()
json_data = JsonFileReader("./text_json.txt").read_file()
all_data: list[Record] = csv_data + json_data
按日期累加数据
-
日期粗在则累加销售额,日期不存在则添加销售额
-
代码示例
# 进行数据计算
data_dict = {}
for record in all_data:if record.date in data_dict.keys():# 存在,累加销售额data_dict[record.date] += int(record.money)else:# 不存在,添加销售额data_dict[record.date] = int(record.money)
图表展示
图标绘制
-
调用
pyecharms
库将数据绘制成图标 -
代码示例
# 图形渲染
bar = Bar()
bar.add_xaxis(list(data_dict.keys()))
bar.add_yaxis("1-4日销售额", list(data_dict.values()), label_opts=LabelOpts(is_show=False))# 渲染
bar.render("销售额数据.html")