【数据集划分】oracle数据集划分(总结版)

【数据集划分】假如你有接近百万条oracle数据库数据(成真版)

  • 写在最前面
  • 最终代码
  • 原理:生成随机索引并打乱顺序
    • 示例
    • 作用
    • 应用场景
  • 遇到报错:ORA-01795,通过CTE(Common Table Expressions)和窗口函数解决


请添加图片描述

🌈你好呀!我是 是Yu欸
🌌 2024每日百字篆刻时光,感谢你的陪伴与支持 ~
🚀 欢迎一起踏上探险之旅,挖掘无限可能,共同成长!

写在最前面

前文:【数据集划分】假如你有超百万条oracle数据库数据(成真版)
大模型,何所谓大?先从大数据开始。

假如你有超百万条oracle数据库数据,那么一直使用的代码:train_df, temp_df = train_test_split(df, test_size=0.3, random_state=42),很可能1h还没划分完数据。

最终解决方案:生成一列随机数,然后随机打乱。取前70%的样本划分为训练集,70%到90%之间的样本划分为测试集,剩余的样本划分为验证集。

在这里插入图片描述

最终代码

  1. 连接Oracle数据库:使用jaydebeapi连接Oracle数据库,确保提供正确的JDBC驱动路径和数据库连接信息。
  2. 添加新列:在deal_ct_report表中添加一个新列dataset来保存数据集标签。如果列已经存在,会捕捉到异常并继续执行后续操作。
  3. 获取总行数:查询表的总行数,用于生成随机索引。
  4. 生成随机索引并打乱顺序:生成从1到总行数的索引列表,并打乱顺序。
  5. 计算各数据集的分界点:计算训练集、测试集和验证集的分界点。
  6. 创建临时表:将原表的rowidROWNUM保存到临时表中。
  7. 更新数据集标签列:使用CTE和窗口函数一次性更新所有记录,避免分批次更新的效率问题。
    • 使用dbms_random.value生成随机数进行排序。
    • 使用ROW_NUMBER()窗口函数为每条记录分配一个随机序号。
    • 根据随机序号进行数据集划分并更新dataset列。
  8. 删除临时表:删除临时表以清理临时数据。
  9. 提交事务:将所有更改提交到数据库。
  10. 关闭连接:关闭数据库连接。

通过将参数直接插入到SQL语句中,避免了参数传递中的问题。这种方法可以高效地实现数据集的随机划分和更新操作。

import jaydebeapi
import random

# 连接Oracle数据库
conn = jaydebeapi.connect(
    'oracle.jdbc.driver.OracleDriver',
    'jdbc:oracle:thin:@hostname:port:service_name',
    ['username', 'password'],
    'path/to/ojdbc8.jar'
)
cursor = conn.cursor()

# 添加新列dataset
try:
    cursor.execute("ALTER TABLE deal_ct_report ADD dataset VARCHAR2(10)")
except jaydebeapi.DatabaseError as e:
    print("Column 'dataset' may already exist. Proceeding with data split...")

# 获取表的行数
cursor.execute("SELECT COUNT(*) FROM deal_ct_report")
total_rows = cursor.fetchone()[0]

# 生成随机索引并打乱顺序
indices = list(range(1, total_rows + 1))
random.shuffle(indices)

# 计算各数据集的分界点
train_limit = int(0.7 * total_rows)
test_limit = int(0.9 * total_rows)

# 创建一个临时表来存储带有索引的数据
cursor.execute("CREATE TABLE deal_ct_report_temp AS SELECT rowid AS rid, ROWNUM AS rnum FROM deal_ct_report")

# 更新数据集标签列
update_sql = f"""
    MERGE INTO deal_ct_report d
    USING (
        WITH temp_data AS (
            SELECT rid, rnum,
                   CASE
                       WHEN rnum <= {train_limit} THEN 'train'
                       WHEN rnum <= {test_limit} THEN 'test'
                       ELSE 'validate'
                   END AS dataset
            FROM (
                SELECT rid, ROW_NUMBER() OVER (ORDER BY dbms_random.value) AS rnum
                FROM deal_ct_report_temp
            )
        )
        SELECT rid, dataset
        FROM temp_data
    ) t
    ON (d.rowid = t.rid)
    WHEN MATCHED THEN
    UPDATE SET d.dataset = t.dataset
"""

cursor.execute(update_sql)

# 删除临时表
cursor.execute("DROP TABLE deal_ct_report_temp")

# 提交事务
conn.commit()

# 关闭数据库连接
cursor.close()
conn.close()

原理:生成随机索引并打乱顺序

生成随机索引并打乱顺序的原理是将数据集进行随机化处理,以确保数据集的随机划分,使训练集、测试集和验证集的样本分布尽可能地均匀和独立。这种方法有助于消除因数据顺序带来的偏差,从而使模型训练和评估更加准确。

具体步骤如下:

  1. 生成索引列表:创建一个从1到总行数的索引列表,这些索引表示数据集中每一条记录的序号。
  2. 打乱索引顺序:使用random.shuffle函数将索引列表随机打乱。这样可以确保索引的顺序是随机的,而不是按原始顺序排列。

示例

假设数据集中有10条记录,生成的索引列表为:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]。打乱后可能变为:[3, 8, 1, 6, 7, 2, 5, 9, 4, 10]。

import random

# 获取表的行数
total_rows = 10  # 这里假设总行数为10

# 生成索引列表
indices = list(range(1, total_rows + 1))

# 打乱索引顺序
random.shuffle(indices)

print(indices)

打乱后的索引列表是随机的。例如,输出可能是:[7, 2, 9, 1, 5, 3, 10, 6, 4, 8]。

作用

  1. 随机化数据顺序:确保数据集的样本顺序是随机的,这样可以防止某些样本因顺序而集中在同一个子集。
  2. 均匀分布:在随后的数据集划分中(如7:2:1),可以保证训练集、测试集和验证集中的样本更加均匀和独立。
  3. 减少偏差:通过随机化处理,可以减少因数据顺序带来的潜在偏差,从而提高模型的泛化能力。

应用场景

这种方法特别适用于需要将大数据集随机划分为多个子集的场景,如机器学习中的数据集划分(训练集、测试集、验证集)。在这种情况下,确保每个子集的样本分布尽可能均匀和独立是至关重要的。

通过这种方式,可以在后续的模型训练和评估过程中,尽量避免因数据顺序或分布不均而导致的模型偏差,从而提高模型的性能和可靠性。

遇到报错:ORA-01795,通过CTE(Common Table Expressions)和窗口函数解决

DatabaseError: java.sql.SQLException: ORA-01795: maximum number of expressions in a list is 1000

ORA-01795错误表示Oracle数据库限制了在IN子句中最多只能包含1000个表达式。

为了克服这一限制,我们可以:

  1. (还是很慢,pass)将大的更新分成多个批次,每个批次最多包含1000个表达式。
  2. 可以使用CTE(Common Table Expressions)和窗口函数来一次性更新所有记录,而不是分批次更新。

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

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

相关文章

SQL性能优化 ——OceanBase SQL 性能调优实践分享(3)

相比较之前的两篇《连接调优》和《索引调优》&#xff0c;本篇文章主要是对先前两篇内容的整理与应用&#xff0c;这里不仅归纳了性能优化的策略&#xff0c;也通过具体的案例&#xff0c;详细展示了如何分析并定位性能瓶颈的步骤。 SQL 调优 先给出性能优化方法和分析性能瓶…

除了诺贝尔奖的红利,Pasqal 还有哪些实力?

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨浪味仙 排版丨沛贤 深度好文&#xff1a;3700字丨13分钟阅读 摘要&#xff1a;与超导量子比特相比&#xff0c;中性原子量子技术的投资成本相对较低、中性原子量子比特无需布线、还能将单…

二叉树的顺序结构(堆的实现)

前言 普通的二叉树是不适合用数组来存储的&#xff0c;因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结 构存储。 现实中我们通常把堆 ( 一种二叉树 ) 使用顺序结构的数组来存储&#xff0c;需要注意的是这里的堆和操作系统 虚拟进程地址空间中的堆是两回事&…

less学习笔记

一、什么是less&#xff1f; Less是CSS预处理语言&#xff0c;可以使用变量、嵌套、运算等&#xff0c;便于维护项目CSS样式代码。 二、less安装 使用npm包管理工具&#xff0c;全局安装less包 npm install -g lessless安装好的同时&#xff0c;lessc也安装好了 通过 lessc -…

[office] Excel数据透视表有什么用途?Excel数据透视表怎么做? #学习方法#职场发展

Excel数据透视表有什么用途&#xff1f;Excel数据透视表怎么做&#xff1f; Excel数据透视表是一种数据汇总手段&#xff0c;如果表格内的数据太多&#xff0c;单靠肉眼是很难准确分辨数据的&#xff0c;而使用数据透视表&#xff0c;就可以很方便的筛选各种数据。如果你不知道…

企业获客有哪些好的广告推广拓客渠道?

在这个数字化营销的时代&#xff0c;企业要想在激烈的市场竞争中脱颖而出&#xff0c;选择正确的广告宣传渠道至关重要。随着互联网技术的飞速发展&#xff0c;各类媒体平台如雨后春笋般涌现&#xff0c;为企业提供了广阔的宣传空间。云衔科技通过多元化的媒体渠道&#xff0c;…

C语言.数据结构.单链表

数据结构.单链表 1.链表的概念及结构2.单链表的实现2.1链表的打印2.2节点的申请2.3单链表的尾插2.4单链表的头插2.5单链表的尾删2.6单链表的头删2.7单链表节点的查找2.8在指定位置之前插入数据2.9在指定位置之后插入数据2.10删除pos节点2.11删除pos之后的节点2.12单链表的销毁2…

伽马校正技术在AI绘画中的作用

随着人工智能技术的飞速发展&#xff0c;AI绘画已经成为了艺术创作领域的一股新兴力量。在这个数字化时代&#xff0c;计算机图形学和机器学习的结合为我们带来了前所未有的创作工具。然而&#xff0c;为了实现更加真实和自然的色彩表现&#xff0c;伽马校正技术在其中扮演着至…

NSSCTF-Web题目5

目录 [SWPUCTF 2021 新生赛]error 1、题目 2、知识点 3、思路 [LitCTF 2023]作业管理系统 1、题目 2、知识点 3、思路 [HUBUCTF 2022 新生赛]checkin 1、题目 2、知识点 3、思路 [SWPUCTF 2021 新生赛]error 1、题目 2、知识点 数据库注入、报错注入 3、思路 首先…

极光公布2024年第一季度财报

2024年6月6日&#xff0c;中国深圳——中国领先的客户互动和营销科技服务商极光&#xff08;Aurora Mobile&#xff0c;纳斯达克股票代码&#xff1a;JG&#xff09;&#xff08;以下称“极光”或“公司”&#xff09;公布截至2024年3月31日第一季度未经审计的财报。 2024年第…

UDSonCAN刷写之StayInBOOT和FlashDiver

目录 0 前言 1 StayInBOOT 2 Flash Driver 0 前言 最近在做刷写相关的工作&#xff0c;顺便搞懂了StayInBOOT和FlashDiver&#xff0c;写出来作为分享&#xff0c;如果有哪里不对也请多多指正。 1 StayInBOOT StayInBOOT在整个流程中的位置如下图所示&#xff0c;从图中可…

VCAST创建单元测试工程

1. 设置工作路径 选择工作目录,后面创建的 UT工程 将会生成到这个目录。 2. 新建工程 然后填写 工程名称,选择 编译器,以及设置 基础路径。注意 Base Directory 必须要为代码工程的根目录,否则后面配置环境会失败。 这样工程就创建好了。 把基础路径设置为相对路径。 …

CasaOS玩客云如何部署小雅AList并结合内网穿透远程访问海量资源

文章目录 前言1. 本地部署AList2. AList挂载网盘3. 部署小雅alist3.1 Token获取3.2 部署小雅3.3 挂载小雅alist到AList中 4. Cpolar内网穿透安装5. 创建公网地址6. 配置固定公网地址 前言 本文主要介绍如何在安装了CasaOS的玩客云主机中部署小雅AList&#xff0c;并在AList中挂…

【Python报错】已解决ModuleNotFoundError: No module named ‘timm’

成功解决“ModuleNotFoundError: No module named ‘timm’”错误的全面指南 一、引言 在Python编程中&#xff0c;经常会遇到各种导入模块的错误&#xff0c;其中“ModuleNotFoundError: No module named ‘timm’”就是一个典型的例子。这个错误意味着你的Python环境中没有安…

[数据集][目标检测]攀墙攀越墙壁数据集VOC格式-701张

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;701 标注数量(xml文件个数)&#xff1a;701 标注类别数&#xff1a;1 标注类别名称:["fq"] 每个类别标…

2024华为数通HCIP-datacom最新题库(变题更新③)

请注意&#xff0c;华为HCIP-Datacom考试831已变题 请注意&#xff0c;华为HCIP-Datacom考试831已变题 请注意&#xff0c;华为HCIP-Datacom考试831已变题 近期打算考HCIP的朋友注意了&#xff0c;如果你准备去考试&#xff0c;还是用的之前的题库&#xff0c;切记暂缓。 1、…

pdf处理命令合集

安装weasyprint用于生成pdf 单个文件合成多个pdf linux - Merge / convert multiple PDF files into one PDF - Stack Overflow

优化电梯调度1:实现高效优先级队列算法

概述&#xff1a; 写作原由&#xff1a; 今天早上上班时候&#xff0c;等电梯等了快十分钟&#xff0c;故此猜想这个电梯运行的算法到底是啥&#xff0c;当年面试工作时候&#xff0c;给出笔试题也是有这个电梯算法的&#xff0c;故此需要坐下来慢慢想想。 随着高层建筑的增…

matrix-breakout-2-morpheus vulnhub靶场

端口扫描 80 81 需要用户名密码登录 目录扫描 robots.txt 妹用 找不到利用点&#xff0c;换个扫描器再扫 发现新的文件 graffiti.txt graffiti.php 输入的数据Post后会回显到页面上 抓包看看&#xff0c;居然直接传文件路径 发现我们post的数据被写入了graffiti.…

一种简单的借助微信扫码登录

公司内部登录一些网页、小工具&#xff0c;使用微信登录&#xff0c;可以保证安全又减少了输密码的麻烦。 需要使用两个码 左边的码是固定的&#xff0c;右边的是动态生成的 左边码&#xff1a;小程序后台生成的带参数的小程序码&#xff0c;带了一个自定义的参数fromscan1 流…