合理利用pandas来简化大量请求数据组装工作

工作场景

本次我们开发了一个新功能,为了验证它是否合理,我们需要从线上导出一批真实的用户数据来进行模拟请求,以此来验证功能的完整性。

例如一个很简单的功能,我们是一个对学生成绩进行数据分析的系统,各学校会将学生成绩作为原始数据导入并保存在我们的后台管理系统。我们新增了一个在导入过程中通过某些学科成绩计算指标的功能(功能不做具体解析)。

导出文件格式

假设我们从后台导出的csv文件格式如下:在这里插入图片描述

studentID;studentName;gender;dateOfBirth;class;subject;score;teacherId;teacherName;enteredBy
1;Alice;F;1999-03-15;10A;数学;88;T001;张老师;刘主任
2;Bob;M;2000-08-20;10B;英语;92;T002;李老师;刘主任
3;Charlie;M;2001-02-05;10A;物理;76;T003;王老师;刘主任
4;David;F;2000-11-10;10C;化学;85;T002;李老师;刘主任
5;Eva;F;1999-07-18;10B;数学;90;T001;张老师;刘主任
6;Frank;M;2001-04-25;10C;英语;82;T003;王老师;刘主任
7;Grace;F;2000-05-30;10A;物理;78;T001;张老师;刘主任
8;Henry;M;2001-10-12;10B;化学;95;T002;李老师;刘主任
9;Isabella;F;2000-01-20;10C;数学;88;T003;王老师;刘主任
10;Jack;M;2001-06-28;10A;英语;94;T001;张老师;刘主任
11;Lily;F;2002-03-05;10D;生物;85;T004;赵老师;钟主任
12;Michael;M;2002-07-15;10E;地理;90;T005;王主任;王主任
13;Olivia;F;2002-11-20;10F;历史;75;T006;赵老师;钟主任
14;Peter;M;2003-02-10;10G;音乐;80;T007;王主任;王主任
15;Quincy;F;2003-05-25;10H;美术;92;T008;赵老师;钟主任
16;Robert;M;2003-09-12;10I;体育;88;T009;王主任;王主任
17;Sophia;F;2004-01-18;10J;计算机;76;T010;赵老师;钟主任
18;Thomas;M;2004-04-25;10K;数学;95;T011;王主任;王主任
19;Uma;F;2004-08-10;10L;物理;82;T012;赵老师;钟主任
20;Vincent;M;2005-01-20;10M;化学;94;T013;王主任;王主任
接口请求格式

假设我们接口的请求格式如下:

{
    "enteredBy": "刘主任",
    "studentScoreDetails":
    [
        {
            "studentID": 1,
            "studentName": "Alice",
            "dateOfBirth": "1999-03-15",
            "score": 88,
            "gender": "F",
            "subject": "数学",
            "class": "10A",
            "teacherName": "张老师"
        }
    ]
}

解决方案

注意我们这里需要大量数据来验证,所以请放弃一个一个自己组装的想法,要合理运用工具

  1. 首先我们先观察我们的csv文件格式,是用;分隔的,且一行有10条数据,所以我们在读取数据时,还需要过滤无效数据
# 读取 CSV 文件
csv_file = 'studentScore.csv'  # 替换为你的文件路径

# 初始化一个空列表来保存有效的数据行
valid_lines = []

# 打开文件,跳过第一行列名读取并处理数据
with open(csv_file, 'r', encoding='utf-8') as file:
    for i, line in enumerate(file):
        if i == 0:  # 跳过第一行,即列名行
            continue
        line = line.strip()
        # 按分号分割行数据
        parts = line.split(';')
        # 如果数据行有 10 个字段,即有效行,保存到列表中
        if len(parts) == 10:
            valid_lines.append(parts)
  1. 导入pandas库,将已经处理好的数据列表(valid_lines)转换为Pandas的DataFrame对象,valid_lines列表中的每个元素(也就是每个列表)都将作为DataFrame的一行。–DataFrame是Pandas库中用于存储和操作表格数据的主要数据结构,它类似于一个二维的、大小可变的、有标签的数据结构,可以容纳许多不同类型的数据。
# 创建 DataFrame
data = pd.DataFrame(valid_lines, columns=['studentID', 'studentName', 'gender', 'dateOfBirth', 'class',
                                          'subject', 'score', 'teacherId', 'teacherName', 'enteredBy'])
  1. 过滤掉我们不需要的列,并处理一部分列,比如teacherId
# 选择所需的列
selected_columns = ['studentID', 'studentName', 'gender', 'dateOfBirth', 'class',
                    'subject', 'score', 'teacherName', 'enteredBy']

data = data[selected_columns]

# 将日期字符串转换为日期对象
data['dateOfBirth'] = pd.to_datetime(data['dateOfBirth'], format='%Y-%m-%d', errors='coerce')
# 将Score转换为数字
data['score'] = pd.to_numeric(data['score'], errors='coerce')
  1. 按照成绩录入人进行分组
# 按照 成绩录入人 进行分组
grouped = data.groupby('enteredBy')

5.组装json文件

# 根据成绩录入人进行遍历,生成 JSON 数据并保存到文件
for enteredBy, group in grouped:
    studentScoreDetails = []
    for index, row in group.iterrows():
        studentScoreDetail = {
            "studentID": row['studentID'],
            "dateOfBirth": row['dateOfBirth'].strftime('%Y-%m-%d') if not pd.isnull(
                row['dateOfBirth']) else None,
            "studentName": row['studentName'],
            "score": float(row['score']),
            "gender": row['gender'],
            "subject": row['subject'],
            "class": row['class'],
            "teacherName": row['teacherName']
        }
        studentScoreDetails.append(studentScoreDetail)

    json_data = {
        "enteredBy": enteredBy,  # 使用处理后的 成绩录入人
        "studentScoreDetails": studentScoreDetails
    }

6.保存结果到文件

# 创建一个目录用户保存数据
    output_dir = 'student'
    folder_path = os.path.join(output_dir, f'{enteredBy}')  # 不同的录入人命名josn文件
    os.makedirs(folder_path, exist_ok=True)  # 创建输出目录和子目录,如果它们已经存在则不会引发错误

    # 保存 JSON 请求数据到对应录入人目录
    output_file = os.path.join(folder_path, f'{enteredBy}.json')
    with open(output_file, 'w', encoding='utf-8') as file:
        json.dump(json_data, file, indent=4, ensure_ascii=False)
        print(f"{enteredBy}录入数据保存成功")
  1. 运行代码,最终我们就能得到按不同录入人进行分组的请求文件数据
    在这里插入图片描述
    在这里插入图片描述

  2. 然后就可以用这些现成的请求数据直接调接口来验证我们的功能啦,是不是节省了我们很多时间,这里只是举了一个例子,处理方法都差不多,只是数据不一样,大家举一反三拿自己的业务练习练习吧,感谢观看。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

视频监控需求八问:视频智能分析/视频汇聚平台EasyCVR有何特性?

最近TSINGSEE青犀视频在与业内伙伴进行项目合作的过程中,针对安防监控可视化视频管理系统EasyCVR视频融合平台在电信运营商项目中的应用,进行了多方面的项目需求沟通。今天我们就该项目沟通为案例,来具体了解一下用户关心度较高的关于视频智能…

django连接本地数据库并执行增删改查

1,首先需要将本地数据库的表同步到django的models.py文件 py manage.py inspectdb tb_books tb_heros > demo001/models.py 2,同步成功后models.py会根据每张表映射出不同的类 models.py文件根据数据库表映射出对应的类 3,然后根据不同…

【鸿蒙系统学习笔记】ArkTS开发语言

一、背景 ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集。 二、基本语法 2.1、基本语法介绍 ArkTS的基本组成,资料来自…

YOLOv8-Openvino和ONNXRuntime推理【CPU】

1 环境: CPU:i5-12500 2 安装Openvino和ONNXRuntime 2.1 Openvino简介 Openvino是由Intel开发的专门用于优化和部署人工智能推理的半开源的工具包,主要用于对深度推理做优化。 Openvino内部集成了Opencv、TensorFlow模块,除此…

爬虫学习笔记-scrapy链接提取器爬取读书网链接写入MySQL数据库

1.终端运行scrapy startproject scrapy_read,创建项目 2.登录读书网,选择国学(随便点一个) 3.复制链接(后面修改为包括其他页) 4.创建爬虫文件,并打开 5.滑倒下方翻页处,右键2,点击检查,查看到a标签网址,复制 6.修改爬虫文件规则allow(正则表达式),\d表示数字,表示多个,\.使…

MySQL数据库进阶第二篇(索引,SQL性能分析,使用规则)

文章目录 一、索引概述二、索引结构三、结构 - B-Tree四、结构 - BTree五、结构 - Hash六、索引分类七、索引语法1.案例代码 八、SQL性能分析1.查看SQl执行频率2.慢查询日志3.PROFILES详情4.EXPLAIN执行计划 九、 索引使用规则十、SQL 提示十一、覆盖索引十二、前缀索引十三、单…

Linux网络编程套接字

目录 前言 一、预备知识 1.1 源IP地址和目的IP地址 1.2 区分端口号和进程ID 1.3 TCP协议和UDP协议 1.4 网络字节序 二、socket编程接口 2.1 socket套接字的概念 2.2 socket常见API ​编辑 2.3 sockaddr结构 三、关于IP和Port的绑定问题 四、编写简单的UDP服务端和…

基于stm32F103的蜂鸣器周期发声实验

蜂鸣器作为一种声音报警器件,应用广泛。本实验基于stm32F103单片机,通过控制蜂鸣器的IO口电平电压,使其周期性地进行电平翻转,从而驱动蜂鸣器发出周期性的鸣叫声。该实验主要运用了stm32的GPIO和定时器TIM的相关功能,不仅可以巩固这些外设的使用,也可以通过改变时间参数,控制蜂…

Kubernetes基础(二十二)-k8s持久化存储详解

1 volume 1.1 介绍 在容器中的磁盘文件是短暂的,当容器崩溃时,Kubelet会重新启动容器,但容器运行时产生的数据文件都将会丢失,之后容器会以最干净的状态启动。另外,当一个Pod运行多个容器时,各个容器可能…

使用阿里云发送短信

使用阿里云短信服务有两种方式 API 发送和 控制台发送&#xff0c;控制台发送到话有太多限制&#xff0c;这里我们使用API 通过 调用服务端代码进行发送。 整体结构如下&#xff1a; 导入依赖 <!--阿里云短信发送--><dependency><groupId>com.aliyun<…

ffmpeg for android编译全过程与遇到的问题

编译前准备 编译环境&#xff1a;Ubuntu16&#xff0c;可自行下载VMWare最新版并百度永久许可证或在服务器上安装Ubuntu ffmpeg源码&#xff1a;ffmpeg4.2.2 NDK下载&#xff1a;Android NDK r21e 有条件的最好还是在Liunx平台下编译吧&#xff0c;Windows平台下编译坑更多…

板块一 Servlet编程:第三节 HttpServletRequest对象全解与请求转发 来自【汤米尼克的JAVAEE全套教程专栏】

板块一 Servlet编程&#xff1a;第三节 HttpServletRequest对象全解与请求转发 一、什么是HttpServletRequest二、接收请求的常用方法三、请求乱码问题四、请求转发&#xff1a;forward五、Request作用域getParameter和getAttribute的区别 在上一节中我们已经学习了完整的Servl…

【JavaEE】_线程的状态与转移

目录 1. 线程的状态 1.1 NEW 1.2 RUNNABLE 1.3 BLOCKED 1.4 WAITING 1.5 TIMED_WAITING 1.6 TERMINATED 2. 线程状态的转移 在多线程Thread类相关一文中已经介绍过进程的状态&#xff1a;就绪状态与阻塞状态&#xff1b; 若需详情请查看原文&#xff0c;链接如下&#…

为项目配置spring boot3+jdk17的开发环境

1&#xff0c;项目【灯灯】 https://gitee.com/dromara/lamp-cloud/tree/3.4.0/ 具体项目介绍开源查看项目简介&#xff0c;克隆下来以后发现项目使用的是spring boot3jdk17编译模式&#xff0c;本地我们一般使用spring boot2jdk8&#xff0c;为了使项目能够运行起来 需要为这…

人工智能|机器学习——基于机器学习的舌苔检测

代码下载&#xff1a; 基于深度学习的舌苔检测毕设留档.zip资源-CSDN文库 1 研究背景 1.1.研究背景与意义 目前随着人们生活水平的不断提高&#xff0c;对于中医主张的理念越来越认可&#xff0c;对中医的需求也越来越多。在诊断中&#xff0c;中医通过观察人的舌头的舌质、苔…

前端|Day3:CSS基础(黑马笔记)

Day3:CSS基础 目录 Day3:CSS基础一、CSS初体验二、CSS引入方式三、选择器1.标签选择器2.类选择器3.id选择器4.通配符选择器 四、盒子尺寸和背景色五、文字控制属性1.字体大小2.字体样式&#xff08;是否倾斜&#xff09;3.行高单行文字垂直居中 4.字体族5.font复合属性6.文本缩…

安装Joplin Server私有化部署(docker)

安装Joplin Server私有化部署(docker) 前言: 老规矩官方文档链接 1. 首先拥有一个自己的云服务器(如果没有外网访问需求的话就随意吧) 安装docker安装方式 这里Joplin是使用PostgreSQL数据库的形式, 如果没有PostgreSQL库的话, Joplin默认使用的是SQLLite数据库 我这里使用的是…

国外高防服务器需要注意哪些方面

随着互联网的快速发展&#xff0c;网络安全问题日益突出&#xff0c;高防服务器逐渐成为企业和个人用户的首选。然而&#xff0c;在选择和使用国外高防服务器时&#xff0c;需要注意以下几个方面&#xff0c;以确保安全和稳定。 一、防御能力 首先&#xff0c;需要考虑国外高防…

Go应用性能分析实战

Go很适合用来开发高性能网络应用&#xff0c;但仍然需要借助有效的工具进行性能分析&#xff0c;优化代码逻辑。本文介绍了如何通过go test benchmark和pprof进行性能分析&#xff0c;从而实现最优的代码效能。原文: Profiling Go Applications in the Right Way with Examples…

哈希+set+map

哈希表 哈希表定义 散列表&#xff08;Hash table&#xff0c;也叫哈希表&#xff09;&#xff0c;是根据关键码值(Key value)而直接进行访问的数据结构 它通过把关键码值映射到表中一个位置来访问记录&#xff0c;以加快查找的速度映射函数叫做散列函数存放记录的数组叫做散…