【黑马程序员】Python综合案例

文章目录

  • 数据分析案例
    • 目的
    • 需求
    • 数据准备
    • 实践
      • 数据记录类
    • 文件解析
      • 解析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")

最终效果展示

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/544133.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jmeter监听器大家都会用,但我这个妙招能让你提早一小时下班!

使用过 jmeter 的同学,应该都会使用监听器,在每个监听器中,都会有一个“所有数据写入一个文件”的功能,那这个功能应该怎么用呢?今天,我们就来讲讲这个功能的使用。 几乎所有的监听器都有这样一个功能。 那…

解压即用,2024最简单好用AI开源换脸应用,整合包已备好

软件整合包:点击下载 关键词:#AI换脸 #开源应用 #可视化界面 #实时换脸 #高清修复 #多个模型 #人脸遮挡处理 #模糊修复 #性能优化 #操作简单 总结:本软件是一款2024年最强大、最易用的AI换脸开源应用。该应用界面经过汉化,操作简…

find_package 总结

本文参考:“轻松搞定CMake”系列之find_package用法详解 原理 find_package 即在指定目录CMAKE_MODULE_PATH 或 CMAKE_PREFIX_PATH查找对应的cmake文件。 find 模式 Module模式(默认):查询Findxxx.cmake配置文件, 在CMAKE_MODULE_PATH 目录Config模式…

LCD屏的应用

一、LCD屏应用 Linux下一切皆文件,我们的LCD屏再系统中也是一个文件,设备文件:/dev/fb0。 如果要在LCD屏显示数据,那我们就可以把数据写入LCD屏的设备文件。 1.显示颜色块 LCD屏分辨:800*480 像素 32位:说明一个像…

算法打卡day19|二叉树篇08|Leetcode 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

算法题 Leetcode 235. 二叉搜索树的最近公共祖先 题目链接:235. 二叉搜索树的最近公共祖先 大佬视频讲解:二叉搜索树的最近公共祖先视频讲解 个人思路 昨天做过一道二叉树的最近公共祖先,而这道是二叉搜索树,那就要好好利用这个有序的特点…

Vue 全家桶

第 1 章:Vue 核心 第 2 章:vue 组件化编码 第 3 章:vue-ajax 第 4 章:vue UI组件 第 5 章:vue-router 第 6 章:vuex 第 7 章:vue源码分析

Internet协议的安全性

Internet协议的安全性 文章目录 Internet协议的安全性1. 网络层1. IP*62. ARP*33. ICMP * 3 2. 传输层协议1. TCP1. * SYN-Flood攻击攻击检测* 防御 2. TCP序号攻击攻击 3. 拥塞机制攻击 2. UDP 3. 应用层协议1. DNS攻击*3防范*3: 2. FTP3. TELNET: 改用ssh4. 电子邮件1. 攻击2…

python二级备考(3)-综合应用

1 《命运》是著名科幻作家倪匡的作品。这里给出《命运》的一个网络版本文件,文件名为“命运. txt”。 问题1 (5分) :在PY301-1. py文件中修改代码,对“命运. txt”文件进行字符频次统计,输出频次最高的中文字符(不包含标点符号)及其频次&…

Java学习笔记------常用API(五)

爬虫 从网站中获取 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.util.regex.Matcher; import java.util.reg…

MySQL语法分类 DQL(4)聚合函数

为了更好的学习这里给出基本表数据用于查询操作 create table student (id int, name varchar(20), age int, sex varchar(5),address varchar(100),math int,english int );insert into student (id,name,age,sex,address,math,english) values (1,马云,55,男,杭州,66,78),…

php中 0 == ‘’(0等于任意字符串) 判断是否成立 返回true

php中不同类型变量之间比较大小 一、背景二、探究0是为什么?三、探究 0all是为什么?四、程序中如何判断0是否等于指定字符串 一、背景 最近在项目实际开发中,我需要判断前端传来的参数值是否等于一个字符串;然后发现当参数值是0时…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Tabs)

通过页签进行内容视图切换的容器组件,每个页签对应一个内容视图。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 该组件从API Version 11开始默认支持安全区避让特性(默认值为&#x…