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

news2024/10/4 14:56:06

工作场景

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

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

导出文件格式

假设我们从后台导出的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.coloradmin.cn/o/1457112.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

prometheus+mysql_exporter监控mysql

prometheus+mysql_exporter监控mysql 一.安装mysql 1.下载:wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 2.安装客户端:yum -y install mysql57-community-release-el7-10.noarch.rpm 3.安装服务端:yum -y install mysql-community-se…

mysql 2-1

添加数据 方式二 更新数据 删除数据 小结 计算列 数据类型 可选属性 适用场景 如何选择 浮点类型 存在精度问题 定点数介绍 BIT类型 日期与时间类型 YEAR类型 DATA类型 TIME类型 DATATIME TIMESTAMP 文本字符串类型 适用场景 TEXT类型

JavaWeb-JDBC-练习

一、环境准备 1、数据库表 tb_brand 2、实体类 Brand 最后注意使用get、set方法和toString 二、实现功能 1、查询所有数据 2、添加数据 3、根据id修改 4、根据id删除

【类与对象 -2】学习类的6个默认成员函数中的构造函数与析构函数

目录 1.类的6个默认成员函数 2.构造函数 2.1概念 2.2特性 3.析构函数 3.1析构函数的概念 3.2特性 1.类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,…

红队学习笔记Day6 --->干货分享

今天看到这样的一个东西,好好好,有点恐怖😓😓😱😱😱😱 我就想网安是不是也有这种东西? 我来试试 icmp,RDP,arp,dhcp,nat&a…

C语言系列-带有副作用的宏参数#和##命名约定宏替换的规则

🌈个人主页: 会编辑的果子君 💫个人格言:“成为自己未来的主人~” 目录 带有副作用的宏参数 宏替换的规则 宏函数的对比 #和## #运算符 ##运算符 命名约定 #undef 带有副作用的宏参数 当宏参数在宏的定义中出现超过一次的时候,如果…

2024/2/19

作业1&#xff1a;使用fread和fwrite完成两个图片文件的拷贝 代码&#xff1a; #include <myhead.h>int main(int argc, const char *argv[]) {FILE *fpNULL;//以只读的形式打开文件if(( fpfopen("./dashuai.bmp","r")) NULL){perror("fopen…

【lesson62】网络通信UdpSocket版

文章目录 UdpSocketUdpServer.hppUdpServer类成员变量解释成员函数解释 UdpServer的实现ServerIinit的实现socketbindhtonsinet_addr具体实现 ServerStart的实现recvfromsendtontohsinet_ntoa具体实现 ~UdpServer函数实现UdpServer.hpp整体完整代码 UdpServer.ccUdpClient.ccTh…

Java学习--黑马SpringBoot3课程个人总结-2024-02-12

1.环境准备 出现报错 Vue 引入路径正确的&#xff0c;但一直报错&#xff1a; Already included file name ‘‘ differs from file name ‘‘ only in casing. 解决方案来自此链接 2.注册界面的搭建 代码如下 <script setup> import { User, Lock } from element-plus/…

【C语言】通讯录(静态版本+动态版本)思路解析+完整源代码

通讯录 由于代码比较长&#xff0c;为了增加可读性&#xff0c;分成了contact.h&#xff0c;contact.c&#xff0c;test.c&#xff0c;分别用来声明函数或者类型&#xff0c;实现函数功能&#xff0c;测试代码 contact.h 我们希望通讯录具有增加联系人&#xff0c;删除联系人…

防火墙之firewalld基础

一、firewalld的简介 firewalld防火墙是Centos7系统默认的防火墙管理工具&#xff0c;取代了之前的iptables防火墙&#xff0c;也是工作在网络层&#xff0c;属于包过滤防火墙。 firewalld和iptables都是用来管理防火墙的工具&#xff08;属于用户态&#xff09;来定义防火墙的…

css pointer-events 多层鼠标点击事件

threejs 无法滑动视角&#xff0c;菜单界面覆盖threejs操作事件。 pointer-events /* Keyword values */ pointer-events: auto; pointer-events: none; pointer-events: visiblePainted; /* SVG only */ pointer-events: visibleFill; /* SVG only */ pointer-events: visib…

web基础及http协议 (二) apache

一、httpd 安装组成 http 服务基于 C/S 结构 1 .常见http 服务器程序 httpd apache&#xff0c;存在C10K&#xff08;10K connections&#xff09;问题 nginx 解决C10K问题lighttpd IIS .asp 应用程序服务器 tomcat .jsp 应用程序服务器 jetty 开源的servlet容器&#xf…

Linux 驱动开发基础知识——LED 模板驱动程序的改造:设备树(十一)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;Vir2021GKBS &#x1f43c;本文由…

探索线性回归中的梯度下降法

目录 前言1 梯度下降的基本思想2 梯度下降的公式3 梯度下降的步骤3.1 初始化参数3.2 计算梯度3.3 更新参数3.4 迭代更新 4 学习率的控制4.1 过大学习率的问题4.2 过小学习率的问题4.3 学习率的调整 5 批量梯度下降方法5.1 批量梯度下降&#xff08;Batch Gradient Descent&…

代码随想录算法训练营DAY20 | 二叉树(7) (续)

一、LeetCode 236 二叉树的最近公共祖先 题目链接&#xff1a;236.二叉树的最近公共祖先https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/description/ 思路&#xff1a;利用后序遍历是天然回溯过程、方便实现自底向上查找的原理&#xff0c;递归寻找公…

基于SpringBoot的高校竞赛管理系统

基于SpringBoot的高校竞赛管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 个人中心 管理员界面 老师界面 摘要 高校竞赛管理系统是为了有效管理学校…

书生开源大模型-第2讲-笔记

1.环境准备 1.1环境 先克隆我们的环境 bash /root/share/install_conda_env_internlm_base.sh internlm-demo1.2 模型参数 下载或者复制下来&#xff0c;开发机中已经有一份参数了 mkdir -p /root/model/Shanghai_AI_Laboratory cp -r /root/share/temp/model_repos/inter…

分库分表浅析

简介 对于任何系统而言&#xff0c;都会设计到数据库随着时间增长而累积越来越多的数据&#xff0c;系统也因为越来越多的需求变迁导致原有的设计不再满足现状&#xff0c;为了解决这些问题&#xff0c;分库分表就会走进视野&#xff0c;带着几个问题走入分库分表。 什么是分…

嵌入式学习第十八天(目录IO)

目录IO: 1. mkdir int mkdir(const char *pathname, mode_t mode); 功能&#xff1a;创建目录文件 参数&#xff1a; pathname&#xff1a;文件路径 mode&#xff1a;文件的权限 rwx rwx rwx 111 111 111 0 7 7 7 r&#xff1a;目录中是否能够查看文件 w&#xff1a;目…