从 Pandas 到 Polars 三十八:Polars 的“瘦身”功能

Polars 有一个内置工具来进行 dtype 瘦身。调用 shrink_dtype 表达式,它会根据列中的数据将列转换为需要最少内存量的 dtype。

shrink_dtype 是 Polars 中一个非常有用的函数,它用于优化 DataFrame 中列的数据类型,以减小内存占用并可能提高某些操作的性能。当你有一个 DataFrame,其某些列的数据类型比实际需要的更大(例如,如果一列中所有的整数都可以用一个更小的整数类型来表示)时,shrink_dtype 就可以派上用场。

在 Polars 中,你可以直接在 DataFrame 上调用 shrink_dtype() 方法来减小列的数据类型。这个方法会遍历 DataFrame 中的所有列,并尝试将它们的数据类型缩小到能够安全存储当前数据的最小类型。

import polars as pl(pl.DataFrame({"a": [1, 2, 3],"b": [1, 2, 2 << 32],"c": [-1, 2, 1 << 30],"d": [-112, 2, 112],"e": [-112, 2, 129],"f": ["a", "b", "c"],"g": [0.1, 1.32, 0.12],"h": [True, None, False],}).select(pl.all().shrink_dtype())
)shape: (3, 8)
┌─────┬────────────┬────────────┬──────┬──────┬─────┬──────┬───────┐
│ a   ┆ b          ┆ c          ┆ d    ┆ e    ┆ f   ┆ g    ┆ h     │
│ --- ┆ ---        ┆ ---        ┆ ---  ┆ ---  ┆ --- ┆ ---  ┆ ---   │
│ i8  ┆ i64        ┆ i32        ┆ i8   ┆ i16  ┆ str ┆ f32  ┆ bool  │
╞═════╪════════════╪════════════╪══════╪══════╪═════╪══════╪═══════╡
│ 1   ┆ 1          ┆ -1         ┆ -112 ┆ -112 ┆ a   ┆ 0.1  ┆ true  │
│ 2   ┆ 2          ┆ 2          ┆ 2    ┆ 2    ┆ b   ┆ 1.32 ┆ null  │
│ 3   ┆ 8589934592 ┆ 1073741824 ┆ 112  ┆ 129  ┆ c   ┆ 0.12 ┆ false │
└─────┴────────────┴────────────┴──────┴──────┴─────┴──────┴───────┘

浮点数和整数默认都是64位精度。在上面来自API文档的示例中,Polars发现列“a”可以是8位,列“b”必须是64位,但列“c”可以是32位。

将数值列从64位转换为32位通常是数据科学中最简单的优化手段。内存使用量减半,计算时间也可能减少到64位的一半。

你需要检查精度的损失是否可以接受。我使用的传感器精度为0.01,所以10^-6的变化是可以接受的。

如果你转换为8位或16位,内存使用量会继续按比例下降……

……但计算时间可能不会比32位更好!

大多数现代CPU没有原生支持8位或16位,所以它们必须模拟这些类型。

具有大量重复条目的字符串列也可以有效地转换为分类类型。但这将是另一个故事了。

使用shrink_dtype时需要注意以下几点:

  1. shrink_dtype() 不会改变 DataFrame 中的数据,只会改变数据的存储方式。
  2. 在某些情况下,缩小数据类型可能不会带来显著的内存节省或性能提升,这取决于你的具体数据和操作。
  3. 缩小数据类型后,如果后续操作导致数据超出了新类型的范围,可能会引发错误或数据丢失。因此,在使用 shrink_dtype() 之前,请确保你了解数据的特点和后续的操作需求。

另外,polars会根据你的数据的实际情况调整shrink_dtype的“瘦身”,比如:

import polars as pl# 创建一个示例 DataFrame
df = pl.DataFrame({"small_ints": [0, 1, 127, 255]  # 注意:这里故意包含了 255,稍后会看到效果
})# 查看原始数据类型
print(df.dtypes)# 尝试缩小数据类型
df_shrunk = df.select(pl.all().shrink_dtype())# 查看缩小后的数据类型
print(df_shrunk.dtypes)[Int64]
[Int16]

在这个例子中,你可能会注意到 small_ints 列的数据类型并没有从 Int64 缩小到 Int8,而是缩小到Int16。这是因为当 shrink_dtype() 检查列中的最大值时,它发现有一个 255,这个值超出了 Int8 的范围(Int8 的范围是 -128 到 127)。因此,shrink_dtype() 可能会选择保持列的原始类型不变,或者选择一个能够安全存储当前数据的更小的类型。

  往期热门文章:

从 Pandas 到 Polars 二十六:在Polars中,不要遍历列

从 Pandas 到 Polars 二十三:如果你的数据已经排序,Polars可以为你提供助力

从 Pandas 到 Polars 十八:数据科学 2025,对未来几年内数据科学领域发展的预测或展望

从 Pandas 到 Polars 十三:流式处理的关键参数

从 Pandas 到 Polars 十:“Polars 表达式“是什么?

从 Pandas 到 Polars 六:在 Polars 中流式处理大型数据集

从 Pandas 到 Polars 0:理解Polars嵌套列类型

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

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

相关文章

react子组件向父组件传参

在React中&#xff0c;子组件向父组件传参&#xff08;或称为“通信”&#xff09;通常通过事件回调的方式实现。父组件向子组件传递一个函数作为props&#xff0c;子组件在需要时调用这个函数&#xff0c;并可以通过参数的形式向父组件传递数据。 下面是一个简单的例子来说明…

C++之map和set封装以及哈希(unordered_map和unordered_set)的封装(仅代码)

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 C进阶​ ​​​​算法 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂 目录 一. map和set封装 1.1红黑树 1.2map …

fatal: refusing to merge unrelated histories

出现本地仓库和远程仓库的代码合并不兼容问题&#xff0c;解决方法&#xff1a; 添加--allow-unrelated-histories&#xff0c;让git允许提交不关联的历史代码。 成功提交&#xff1a;

Nuitka,一个超厉害的 Python 库

在众多高级编程语言中,Python 以其简洁的语法和强大的功能深受广大开发者的喜爱。然而,Python 程序的执行速度常常成为其被诟病之处。今天,我们要介绍的 Nuitka,正是一款可以将 Python 代码编译成 C++ 代码的工具,从而大幅提升程序执行效率。那么,Nuitka 究竟是什么呢?它…

python基础知识点(蓝桥杯python科目个人复习计划75)

第一题&#xff1a;ip补充 题目描述&#xff1a; 小蓝的ip地址为192.168.*.21&#xff0c;其中*是一个数字&#xff0c;请问这个数字最大可能是多少&#xff1f; import os import sys# 请在此输入您的代码 print("255") 第二题&#xff1a;出现最多的字符 题目描…

gitee的fork

通过fork操作&#xff0c;可以复制小组队长的库。通过复制出一模一样的库&#xff0c;先在自己的库修改&#xff0c;最后提交给队长&#xff0c;队长审核通过就可以把你做的那一份也添加入库 在这fork复制一份到你自己的仓库&#xff0c;一般和这个项目同名 现在你有了自己的库…

git 学习总结

文章目录 一、 git 基础操作1、工作区2、暂存区3、本地仓库4、远程仓库 二、git 的本质三、分支git 命令总结 作者: baron 一、 git 基础操作 如图所示 git 总共有几个区域 工作区, 暂存区, 本地仓库, 远程仓库. 1、工作区 存放项目代码的地方&#xff0c;他有两种状态 Unm…

Vue3时间选择器datetimerange在数据库存开始时间和结束时间

♥️作者&#xff1a;小宋1021 &#x1f935;‍♂️个人主页&#xff1a;小宋1021主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识&#xff0c;和大家一起努力呀&#xff01;&#xff01;&#xff01; &#x1f388;&#x1f388;加油&#xff01; 加油&#xff01…

什么是埋点?前端如何埋点?

什么是埋点 “埋点” 是一种在应用程序或网站中插入代码的技术&#xff0c;用于收集用户行为数据或特定事件的信息。它是用于分析和监控用户行为、应用性能和其他关键指标的一种常用方法。通过在特定位置插入代码或调用特定的 API&#xff0c;开发人员可以捕获有关用户如何与应…

a,a,a【0】,a【0】,指针解析数组,用作(左值,右值)的区别

a&#xff0c;&a&#xff0c;a【0】&#xff0c;&a【0】&#xff0c;指针解析数组&#xff0c;用作&#xff08;左值&#xff0c;右值&#xff09;的区别

大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

《GPT-4o mini:开启开发与创新的新纪元》

在科技发展的快速进程中&#xff0c;OpenAI 推出的 GPT-4o mini 模型如同一阵春风&#xff0c;给开发者们带来了新的希望和机遇。它以其卓越的性能和极具吸引力的价格&#xff0c;成为了行业内热议的焦点。 当我首次听闻 GPT-4o mini 的消息时&#xff0c;内心充满了好奇与期待…

解锁Conda配置的秘密:conda config --get命令全指南

&#x1f511; 解锁Conda配置的秘密&#xff1a;conda config --get命令全指南 Conda是一个功能强大的包管理器和环境管理器&#xff0c;它允许用户通过配置文件来自定义其行为。有时&#xff0c;了解当前的配置状态对于诊断问题、优化设置或确保环境的一致性至关重要。本文将…

Linux下学习Python包管理器Poetry教程 零基础入门到精通

Poetry [官网 - Poetry] https://python-poetry.org/ 安装 pip install poetry简单使用 初始化 poetry 项目 cd ~ && mkdir demo poetry init管理虚拟环境 poetry 预设了很多自己的虚拟环境配置&#xff0c;这些配置可以通过 poetry config 进行修改 当用户在执…

使用git工具管理泰山派内核源码目录及抽打补丁简易流程

目录 使用git工具管理泰山派内核源码目录及抽打补丁简易流程 一、使用git维护源码 二、git 常用的一些操作 三、抽补丁 四、打补丁 五、补充 使用git工具管理泰山派内核源码目录及抽打补丁简易流程 最近&#xff0c;在做linux开发的过程中入手了一块泰山派RK3566的开发板…

嵌入式初学-C语言-前言

概述 C语言是一种计算机编程语言&#xff0c;我们是利用代码来控制计算机的运行&#xff0c;从而达到某种目的&#xff0c;我们 就很有必要了解计算机的运行原理。 计算机组成 OS 应用程序 计算机硬件 基本组成&#xff1a; 输入设备&#xff1a;输入数据给计算机处理&…

详解Mysql InnoDB引擎 04

文章目录 1. InnoDB 简介2. 逻辑存储结构2.1 表空间 idb文件2.2 段2.3 区 1M2.4 页 16KB2.5 行 3. 架构3.1 内存结构3.1.1 Buffer Pool 缓冲池3.1.2 Change Buffer 更改缓冲区3.1.3 Adaptive Hash Index3.1.4 Log Buffer 3.2 磁盘结构 4. 后台线程5. 事务原理5.1 redo log 重做…

动态数据增强的艺术:Mojo模型的自定义应用

动态数据增强的艺术&#xff1a;Mojo模型的自定义应用 在机器学习和深度学习领域&#xff0c;数据增强是提升模型泛化能力的重要手段。Mojo模型&#xff0c;作为深度学习模型的一种封装形式&#xff0c;通常指的是通过训练得到的模型参数的集合&#xff0c;它能够被用于快速推…

运行python项目出现ModuleNotFoundError: No module named ‘sklearn‘问题

问题1&#xff1a;ModuleNotFoundError: No module named sklearn 1.WindowsR键&#xff0c;输入cmd&#xff0c;进入命令行窗口 2.安装sklearn&#xff0c;使用清华镜像安装&#xff1a; python -m pip install scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple …

算法学习day22

一、函数的独占时间 给你一个进程数量&#xff0c;和运行日志。运行日志log的格式为:进程id:(start/end):运行时间 其中一个进程运行时可以被另一个优先级较高的进程抢占cpu。求每个进程独占cpu的时间。 输入&#xff1a;n 2, logs ["0:start:0","1:start:…