极速数据处理:Polars揭秘
文章平均质量分 70
“极速数据处理:Polars揭秘“专栏,深入解析Polars高性能数据处理库的奥秘。我们将带您领略Polars在大数据处理中的卓越性能,探讨其技术特点与应用场景。无论您是数据分析师还是数据科学家,这里都有您想要的Polars知识,助您轻松驾驭数据处理挑战,开启极速数据时代的新篇章。
sosogod
这个作者很懒,什么都没留下…
展开
-
从 Pandas 到 Polars 四十六:使用Polars读取和写入S3数据
在OutputSerialization参数中,我们传递了一个包含一些参数的字典,以告诉它如何序列化返回的数据——在这种情况下是CSV文件。不幸的是,在编写本文时,唯一的输出序列化选项是CSV和JSON,因此即使您输入的是Parquet文件,您也不能返回Parquet文件。在InputSerialization参数中,我们传递了一个包含一些参数的字典,以告诉它如何读取我们的CSV文件。例如,我们告诉它文件有一个标题行,并且没有压缩。对于Parquet文件,我们可以在S3上扫描文件,并且只读取我们需要的行。原创 2024-08-08 08:59:59 · 704 阅读 · 0 评论 -
从 Pandas 到 Polars 四十五:Polars、Altair 和 Vegafusion
在传统的Altair图表中,您将数据行提供给Altair,然后Altair(通过Vega-lite库)将这些数据传递给您的浏览器,浏览器使用Vega-lite将数据转换为可以渲染的HTML对象。但那些日子已经过去了。在这篇文章中,我们将探讨随着Altair 5的发布,我们如何可以使用Altair和Polars,以及VegaFusion如何帮助Altair扩展到更大的数据集。然而,对于像Polars这样的基于Arrow的库来说,Altair还处于早期阶段,您可能仍然会遇到一些奇怪的bug。原创 2024-08-07 08:27:43 · 606 阅读 · 0 评论 -
从 Pandas 到 Polars 四十四:Polars 和 数据可视化库Seaborn
为了避免不必要的复制,我建议使用select函数只复制你的图表所需的列的子集,例如df.select(["Age","Fare","Pclass"]).to_pandas()。然而,Seaborn的新界面给我留下了深刻印象,并且我很高兴地发现,Seaborn将直接接受Polars的DataFrame来进行许多图表绘制。在这篇文章中,我将探讨如何将Polars的DataFrame传递给Seaborn以进行一些高级图表的绘制,并分享一些使用Seaborn可视化Polars DataFrame的其他技巧。原创 2024-08-07 08:22:24 · 719 阅读 · 0 评论 -
从 Pandas 到 Polars 四十三:处理大于内存限制的Parquet文件
sink_parquet的一个很好的用例是将一个或多个大型CSV文件转换为Parquet格式,这样处理数据会更快。现在,Polars具有sink_parquet方法,这意味着您可以将流式查询的输出写入Parquet文件。在这个例子中,我们以惰性模式处理一个大型Parquet文件,并使用sink_parquet将输出写入另一个Parquet文件。需要注意的是,Polars的流式处理并非适用于所有操作,因此如果您的查询不支持流式处理,您可能会遇到内存溢出异常。path: (str) 输出文件的路径。原创 2024-08-01 09:39:13 · 480 阅读 · 0 评论 -
从 Pandas 到 Polars 四十二:在 AWS Lambda 环境中使用 Polars 来处理数据II:PyArrow
在最近的一篇文章中,我展示了如何使用smart_open库在AWS Lambda中使用Polars。在这个例子中,我们使用了PyArrow的dataset模块。在这一步中,PyArrow会在S3中找到Parquet文件并获取一些关键信息。在这个例子中,优化体现在仅从文件中读取id1和v1列。在以下示例中,我们对S3中的Parquet文件进行分组。有了这个模式,我们就可以在Polars的惰性模式下工作,并应用一些查询优化。在第二步中,我们会在Parquet文件上进行分组聚合操作。原创 2024-07-31 07:56:37 · 362 阅读 · 0 评论 -
从 Pandas 到 Polars 四十一:检查Polars的查询
方法是一个非常有用的工具,它允许你在执行一系列操作的过程中插入一个检查点,以查看 DataFrame 的状态。我们在下面的示例中可以看到这一点,我们在进行分组之前先进行了过滤。通过在过滤和分组之间添加inspect,我们可以在查询的该点处打印输出。在这种情况下,我们可以在查询中添加一个.inspect()的调用。通过在操作链中插入检查点,你可以观察 DataFrame 在各个阶段的状态,这在调试复杂查询时非常有用!都会打印当前 DataFrame 的状态,这有助于理解数据在每个阶段的状态。原创 2024-07-30 09:30:42 · 347 阅读 · 0 评论 -
从 Pandas 到 Polars 四十:使用Polars进行机器学习预处理(二)
我认为在未来一年里,我们会看到一个围绕Polars开发的优秀的机器学习预处理库。with_context的优势在于我们仍然保持在Polars中强大的惰性模式下,因此我们仍然可以利用诸如查询优化之类的功能。在机器学习预处理中,一个常见的步骤是将训练集的数据与测试集共享。例如,我们可能想用训练集中的值来填充测试集中的空值。实际上,我们总是在惰性模式下使用with_context,因为这就是Polars将查询的不同部分组合在一起的方式。在下面的示例中,我们在“Age”列中有一些空值。原创 2024-07-30 09:03:43 · 312 阅读 · 0 评论 -
从 Pandas 到 Polars 三十九:Polars 和 Matplotlib
退一步说,如果你只习惯使用pandas的数据进行绘图,那也可以使用polars的df.to_pandas()方法将数据转为pandas的格式,只不过在转换为 Pandas DataFrame 时,可能会有一些性能损失,特别是对于大型数据集。在下面的第一个示例中,我们可以看到北大西洋中爱尔兰波浪浮标测得的最大波浪高度(这只是一个片段,用于向您展示它的工作方式)。在第二个示例中,我们使用快速的 groupby_dynamic 方法对每个站点的波浪高度取3小时的平均值。我们是否也可以进行一些风暴追踪呢?原创 2024-07-29 11:41:40 · 259 阅读 · 0 评论 -
从 Pandas 到 Polars 三十八:Polars 的“瘦身”功能
因此,shrink_dtype() 可能会选择保持列的原始类型不变,或者选择一个能够安全存储当前数据的更小的类型。当你有一个 DataFrame,其某些列的数据类型比实际需要的更大(例如,如果一列中所有的整数都可以用一个更小的整数类型来表示)时,shrink_dtype 就可以派上用场。调用 shrink_dtype 表达式,它会根据列中的数据将列转换为需要最少内存量的 dtype。在上面来自API文档的示例中,Polars发现列“a”可以是8位,列“b”必须是64位,但列“c”可以是32位。原创 2024-07-27 20:34:24 · 358 阅读 · 0 评论 -
从 Pandas 到 Polars 三十七:在 AWS Lambda 环境中使用 Polars 来处理数据
因为Polars现在内置了对在eager模式和lazy模式下从云存储(如AWS S3)读取和写入的支持,我们通常可以在处理程序函数中编写标准的Polars语法。在Docker中进行这种操作的一个好处是,你可以在将Lambda函数部署到AWS之前,在本地对它们进行测试。我在我的研讨会上提到了这一点,并且我也会在未来的博客文章中讨论它。在这个示例的shell脚本中,当运行容器时,我将我的.aws文件夹挂载到容器中的.aws文件夹。我将在下面详细解释这一点。在实际的生产查询中,我强烈建议你锁定你的依赖项的版本。原创 2024-07-27 09:00:28 · 971 阅读 · 0 评论 -
从 Pandas 到 Polars 三十六:直接从Polars适配Scikit-learn和XGBoost模型
在这篇文章中,我们将看到如何直接从Polars DataFrame适配XGBoost和一些scikit-learn模型。Polars DataFrame中的数据是以Apache Arrow表的形式存储的,而不是Numpy数组。请注意,scikit-learn 目前在内部从 Polars 复制到 Numpy,但有了这种支持,我们朝着全面原生支持 Arrow 数据迈进了一步。让我们创建一个带有一些随机数据的Polars DataFrame,看看我们是否可以直接从中适配一个XGBoost模型。原创 2024-07-26 15:51:17 · 421 阅读 · 0 评论 -
从 Pandas 到 Polars 三十五:使用Polars从数据库中加载数据
然而,当你从大型数据集中选择小部分数据时,数据库方法非常强大。在你的SQL语句中添加一个where子句来选择你的子集。然后,在你想要定义子集的列上创建一个索引。然后,你使用Polars和connectorx——这是Python中从数据库读取数据的最快方式。在某些项目中,挑战在于你拥有庞大的数据集,但在任何给定时刻只想查看数据集中定义明确的子集。在这种情况下,我们只在乘客编号列上创建索引,但你可以在多个列上创建更高级的索引。解决这一问题的强大方法是利用数据库和它们选择子数据的能力。原创 2024-07-26 08:27:13 · 412 阅读 · 0 评论 -
从 Pandas 到 Polars 三十四:在Polars中,Lazy模式的隐藏时间节省器
问题在于我们的数据转换是无效的:'values' 列的数据类型是整数(integer dtype),但 'round' 表达式只能对具有浮点数据类型(floating point dtype)的列进行调用。Polars中的Lazy模式不仅提供查询优化并允许您处理超出内存限制的数据集,它还提供了一定的类型安全性,可以在您开始处理大量数据之前发现管道中的错误。下面我们通过一个简单的流程来说明这个想法,其中我们从一些数据中创建一个DataFrame,并在即时模式下对其进行转换。原创 2024-07-25 15:20:04 · 470 阅读 · 0 评论 -
从 Pandas 到 Polars 三十三:在Polars中启用流式模式
如果我们比较使用streaming=True和streaming=False(默认)的查询,我发现流式模式的平均时间为75毫秒,而非流式模式为120毫秒。不过,我不能保证流式模式总是至少与非流式模式一样快,因为Polars中的流式技术仍在开发中,肯定存在流式模式会显著变慢的使用场景。这意味着,如果你正在处理较大的数据集,特别是如果你正在构建希望未来能够处理更大数据集的管道时,保持流式模式的开启是值得的。对于许多查询,流式模式可能是一个很好的默认选择——而不是只有在遇到内存问题时才应该使用的应急按钮。原创 2024-07-25 11:52:20 · 261 阅读 · 0 评论 -
从 Pandas 到 Polars 三十二:对Polars查询进行性能剖析
在图表中,我们看到读取CSV文件是瓶颈所在。因此,我们应该将精力集中在这一步骤上,采用诸如指定数据类型(dtypes)或更好的做法,将其转换为Parquet或Arrow格式等策略。你可以通过在任何延迟查询上调用 .profile 来获取这些数据。更好的是,我们还可以得到一个图表来可视化每一步所花费的时间。现在,DataPolars 提供了一个性能分析工具来展示它的工作情况。在这个例子中,我们从 CSV 文件中读取数据,进行分组,然后排序。如果你不知道瓶颈在哪里,你就无法优化你的代码。原创 2024-07-24 08:56:38 · 199 阅读 · 0 评论 -
从 Pandas 到 Polars 三十一:Polars 没有内置索引,但如果你想要一个或多个索引呢?
为了实现这一点,我们将 groupby._groups DataFrame 转换为字典,然后我们可以快速访问我们的子DataFrame。在 partition_by 映射中的DataFrame都是副本,因此如果你想要以多种方式进行分区,这将非常消耗内存。使用 groupby 的一个优势是在内存使用上很高效——基本上相当于增加一个额外的32位整数列来存储每个映射的行索引。我们告诉它我们想要根据哪些列进行分区,然后Polars会创建一个字典,将唯一值映射到包含相应行的DataFrame。原创 2024-07-23 22:02:12 · 429 阅读 · 0 评论 -
从 Pandas 到 Polars 三十:将具有不同架构的数据进行合并
对角合并会将你的新记录及其新列追加到旧记录之后,并在旧记录的新列中添加空值(null),以表示数据缺失。你得到了一个新文件,并发现从现在开始将会有一些有用的额外列。你打算如何将这个文件与旧数据结合起来呢?这时就是Polars中的对角合并(diagonal concatenation)发挥作用的时候了。垂直合并(vertical concatenation)不适用,因为它不喜欢模式变化。你的项目中有一堆数据文件,它们都遵循一致的数据模式。原创 2024-07-22 22:22:13 · 228 阅读 · 0 评论 -
从 Pandas 到 Polars 二十九:在Polars中进行机器学习预处理(一)
例如,我们可以创建一个类来用scikit-learn的API包装Polars代码。然后,在转换为numpy以用于机器学习模型之前,我们可以尽可能长时间地保持在快速且内存高效的Polars和ApacheArrow组合中。让我们看看在Polars中进行一些这样的预处理是否值得。简单示例:我们有一个包含100,000行和100列的数据框,并希望对每个列进行最小-最大缩放。在最近的时间里,我将探索在Polars中进行机器学习(ML)可以走到多远。所以在这个比较中,Polars的速度是原来的两倍。原创 2024-07-20 15:53:03 · 458 阅读 · 0 评论 -
从 Pandas 到 Polars 二十八:利用 setattr 函数在 Polars 中设置属性的快捷方式
是一个允许你以动态的方式修改对象的属性的强大工具,但你可以在polars中用setattr来设置一些你常用的函数的别名,用作快捷键。详细的代码对于生产环境来说非常棒,但在ipython或jupyter中进行快速数据探索时,你确实希望代码能够更快速。在编写代码时,存在一个权衡点,即如何在编写清晰详细的代码与编写快速且易于输入的代码之间找到平衡。同时,去掉下划线也是一个好主意——这些需要按两次的字符在重复时会给你的手指带来很大的压力!为了解决这个问题,你可以使用setattr为你的函数设置一个别名。原创 2024-07-20 15:48:52 · 162 阅读 · 0 评论 -
从 Pandas 到 Polars 二十七:Polars中灵活的时间序列聚合
在最近的一个项目中,我拥有来自遥测的10年每两分钟的数据,并需要计算每小时的平均值——大约250万行数据乘以100列。在Polars中,我使用了groupby_dynamic,发现它比Pandas快10倍,这让客户们感到满意!这不是问题——你可以指定间隔周期来获取所需的滚动平均值,而无需付出性能成本。为了处理高频变化性,我也需要在3小时滚动窗口内执行此操作。Polars中的时间序列聚合既快速又灵活。原创 2024-07-19 15:14:39 · 204 阅读 · 0 评论 -
从 Pandas 到 Polars 二十六:在Polars中,不要遍历列
在 Polars 中,避免使用显式循环遍历列是非常推荐的做法,因为显式循环会破坏并行化,在大规模数据集上效率低下。map方法示例:假设我们有一个DataFrame,其中包含人员的姓名和出生日期,我们想创建一个新的列,该列包含每个人的年龄。方法有时可能涉及一些形式的循环,但它是在列级别而非行级别上应用函数,通常比逐行应用更高效。假设我们有两个 DataFrame,一个包含员工信息,另一个包含部门信息。相反,首先应使用表达式,然后Polars将为您并行处理列循环。最后,如果需要合并 DataFrame,可以。原创 2024-07-19 08:57:21 · 560 阅读 · 0 评论 -
从 Pandas 到 Polars 二十五:在Polars中,关于IPC文件
(说明:IPC文件通常指的是用于进程间通信的文件格式,特别是Apache Arrow的IPC格式。使用IPC文件,Polars可以在多个进程之间快速、高效地传输和共享数据,而无需将数据转换为其他格式或进行昂贵的序列化和反序列化操作。我认为 IPC 格式的使用并不普遍,尤其是当你需要从本地文件系统或快速云连接中读取大文件时——想象一下,你可以在具有 10ms 延迟的 Streamlit 应用程序中做什么!首先,IPC格式是什么?然而,在许多情况下,为了更快的查询而增加存储空间是一个很好的权衡。原创 2024-07-18 15:10:38 · 249 阅读 · 0 评论 -
从 Pandas 到 Polars 二十四:在Polars中使用Spacy- 第三方库如何与Polars协同工作?
pandas的列是一个可迭代对象,但元组、列表或polars数据框的列也是可迭代对象。Polars 本身不包含绘图功能,但可以轻松地与如 Matplotlib 和 Seaborn 等库集成。人们向我咨询从Pandas切换到Polars时,经常问到的问题是如何与第三方库一起工作。Dask 允许你在单机或多节点集群上进行并行计算。Polars 可以与 Dask 集成,使用 Dask 的分布式计算能力。在这里,Spacy以与处理Pandas数据框中的列相同的方式从Polars数据框中获取列。原创 2024-07-18 09:03:18 · 166 阅读 · 0 评论 -
从 Pandas 到 Polars 二十三:如果你的数据已经排序,Polars可以为你提供助力
set_sorted也适用于其他操作——在我的一些工作流程中,对Polars知道已排序的列进行大型数据集的groupby操作,速度提高了40%。前,请确保数据实际上已按你声明的方式排序。这将告诉 Polars 这些列的排序状态,从而使其在执行查询时能够选择更有效的算法。在下面这个简单的例子中,当我们告诉Polars序列已排序时,我们找到中位数的速度提高了1500倍。不会对数据进行排序,它只是一种声明,告知 Polars 数据是已排序的。等),如果数据已排序,Polars 可以避免不必要的排序步骤。原创 2024-07-17 23:29:09 · 544 阅读 · 0 评论 -
从 Pandas 到 Polars 二十二:使用Polars求最大值
总的来说,top_k的时间复杂度是O(n * log(k)),而对整个列表进行排序的时间复杂度是O(n * log(n))。然而,这并不是最好的方法。因为对于sort操作,你需要比较所有值,而你实际上只需要比较一小部分顶部的值。因此,当你想要获取的元素数量与总元素数量之间的差异越大时,使用top_k的效率差异就越大。它的输出与.sort.head相同,但速度更快,因为它只关心与最大(或最小)值的比较。在这个简单的例子中,top_k比.sort.head快2倍。Polars中的解决方案是使用top_k方法。原创 2024-07-17 10:42:14 · 217 阅读 · 0 评论 -
从 Pandas 到 Polars 二十一:用Polars打破你的坏习惯
其返回一个新的表达式或列,该表达式或列可以包含在更大的数据帧操作中。在实际应用中,你可以使用多个。在Pandas中,我曾经相当频繁地使用.apply,但在Polars中,我唯一一次使用.apply是在写文档时,告诉人们不要使用.apply!关于Polars的讨论中,我们收到的一个评论是Polars的语法鼓励人们改掉在Pandas中养成的坏习惯。在Polars中使用标准的pl.when方法比Pandas中的apply方法快100倍。在下面这个例子中,我们想要将所有列中的正值映射为1,负值映射为-1。原创 2024-07-16 15:42:48 · 162 阅读 · 0 评论 -
从 Pandas 到 Polars 二十:使用另一个数据框(DataFrame)的数据来过滤一个数据框(DataFrame)
这篇文章是从我的《使用Polars上手与进阶》课程中摘录的——在这里了解更多或查看前几章的预览。我们在Polars的社区上最常遇到的问题之一是如何根据另一个数据框中的值来过滤一个数据框的行。我认为人们没有意识到这基本上是一个连接操作,因为他们不想要另一个数据框中的任何列。对于一家租车公司,我们有一个包含我们拥有的汽车及其唯一ID的cars数据框……半连接(semi join),如果你想保留也在另一个数据框中找到的行;反连接(anti join),如果你想移除也在另一个数据框中找到的行。原创 2024-07-16 15:14:59 · 173 阅读 · 0 评论 -
从 Pandas 到 Polars 十九:Polars 中的布尔过滤器
但是,在处理一千万行数据集时,布尔掩码和.filter查询给出了类似的结果(而且两者都比Pandas快得多)。如果你正在尝试使用Polars但没有使用这些方法,那么不妨试一试并比较你现有代码的执行时间——我想你会有惊喜的!然而,阅读Polars的文档时,你会发现它们建议你不要使用这种方法。而在 Polars 的延迟模式下,你可以将过滤器构建到完整的查询中——包括从 CSV 中读取哪些数据。总的来说,Polars推荐使用.filter而不是布尔掩码,因为它有助于将更多内容推送到查询优化器中。原创 2024-07-15 08:52:37 · 357 阅读 · 0 评论 -
从 Pandas 到 Polars 十八:数据科学 2025,对未来几年内数据科学领域发展的预测或展望
Rust 在数据科学家中的普及将受到 Polars 的推动,用户会发现从使用 Python 切换到 Rust API 的门槛相对较低——比从 Pandas 切换到 C 的门槛要低得多!在数据科学蓬勃发展的十年里,我所在领域的日常工作主要由像 Python 这样的动态语言或像 R 和 Julia 这样使用即时编译的语言主导。尽管这两个库的功能有很多重叠,但有些人会想要一个像 DuckDB 这样的工具,它拥有更多关系型数据库的陷阱,而有些人则不会。然而,一位受访者正确地指出,基于GPU的库(如cuDF)更快。原创 2024-07-15 08:38:29 · 1736 阅读 · 0 评论 -
从 Pandas 到 Polars 十七:Polars 中的嵌套数据类型:pl.List 数据类型
通过使用 arr.mean,我们利用了 arr 命名空间中针对 pl.List 数据类型的数组表达式。在下面的示例中,我们有一个 doc_id 列来标识每一行来自哪个文档,一个 text 列显示每个文档的文本块,以及一个 embeddings 列,其中包含该文本的嵌入。关于 pl.List 数据类型需要理解的关键点是,每一行在底层都是一个 pl.Series。在这个例子中,我们创建了一个包含整数、浮点数和字符串 pl.List 列的 DataFrame。在这个例子中,我们对每个数组内的元素进行排名。原创 2024-07-14 17:12:49 · 342 阅读 · 0 评论 -
从 Pandas 到 Polars 十六:不要害怕pl.List数据类型
在pl.Object数据类型的每一行中,实际上只是一个Python列表。在这里,我们创建了一个包含两个列表列的数据框(DataFrame):整数、浮点数。List数据类型的优点在于,你可以很容易地对每一行上的序列(Series)执行相同的分析。这是一个简单的例子,但你可以根据需要让它变得复杂(如果你想要的话,它可以并行处理)。尽管我们使用Python列表创建了它们,但它们实际上是快速的序列(Series)。在Python中进行数据分析时,你首先会学到的一件事是处理列表是缓慢的。原创 2024-07-14 16:53:33 · 231 阅读 · 0 评论 -
从 Pandas 到 Polars 十五:对于特征工程,Polars的透视表(pivot)功能表现非常强大
现在,是时候转换text列了,以便我们为每个不同的单词都有一个列,并为每篇文章都有一个行。我们通过调用pivot来实现这一点,使用元数据列(publication和title)作为每行的索引,text列来确定列名,并使用placeholder值作为值。在之前的文章中,我展示了 pl.List 类型如何允许快速操作,因为每行在底层都是一个 Polars Series,而不是缓慢的 Python 列表。首先,我们需要做的是将文本转换为小写,并将每篇文章拆分成单独的单词。这些1将稍后填充到我们的特征矩阵中。原创 2024-07-13 15:15:25 · 359 阅读 · 0 评论 -
从 Pandas 到 Polars 十四:在Polars中拟合线性模型
为了使这个流程更加顺畅,我们可以采用经典的Scikit-learn方法,即具有fit和transform方法(尽管你也可以将其称为predict方法)。它们易于理解且拟合速度快。有了这个出色的新Polars插件,你现在可以直接在Polars中拟合线性模型,包括Lasso回归和Ridge回归。之后,我们就可以访问该命名空间中的表达式,在这个例子中,这个命名空间被称为least_squares。回到我们最初的普通最小二乘模型,我们可以通过在ols方法中设置mode="coefficients"来获取系数。原创 2024-07-13 14:44:10 · 962 阅读 · 0 评论 -
从 Pandas 到 Polars 十三:流式处理的关键参数
在我有 12 个线程的情况下,thread_factor 是 1,所以分块大小就是 50,000 除以 LazyFrame 中的列数。我对此的实验结果并不明确——在某些情况下,我发现增加线程数可以提高性能,而在其他情况下,它几乎没有效果或者会降低性能。如果你正在处理大型数据集,建议你尝试不同的分块大小,以找到适用于你的数据和硬件的最优值——这可能会对性能产生重大影响。我们将在下面看到如何修改数据块大小,但首先我们将查看 Polars 如何为每个查询计算默认的数据块大小。原创 2024-07-12 09:03:22 · 1141 阅读 · 0 评论 -
从 Pandas 到 Polars 十二:在延迟模式下填充时间序列的缺失值
这里的例子相对简单但可以推广。例如,在我构建的机器学习时间序列预测管道中,我通常会在DataFrame中有多个时间序列,并使用一个id列来区分它们。在这种情况下,我会在与有缺失数据的时间序列进行左连接之前,对时间步长和ID进行额外的交叉连接。正如我在之前的帖子中所提到的,如果我们调用explain(streaming=True)并且存在一个由PIPELINE限定的代码块,我们可以检查一个惰性查询是否会使用流式引擎。在这里,我们看到我们可以在流式模式下进行连接操作,但无法在流式模式下进行插值。原创 2024-07-12 08:43:26 · 348 阅读 · 0 评论 -
从 Pandas 到 Polars 十一:在Polars环境中,Matplotlib与Plotly的比较
然而,如果你只需要标准的图表类型,那么它可能超出了你的需求。经过几周的实验后,我停止使用Matplotlib,因为Altair似乎能以更少的努力制作出更漂亮的图表。散点图的x轴表示乘客的(对数)年龄,y轴表示乘客支付的(对数)票价。需要注意的一点是,我们需要将颜色Pclass列转换为字符串数据类型(pl.Utf8),以便 Plotly 知道这些数据是分类数据而不是数值数据。在本文中,我将展示一种在Matplotlib中制作具有不同颜色的图表的策略,并比较我们如何使用Plotly来制作这个图表。原创 2024-07-11 20:01:55 · 852 阅读 · 0 评论 -
从 Pandas 到 Polars 十:“Polars 表达式“是什么?
在Polars中,"上下文"的概念可能不是直接指一个特定的编程结构或对象,但我们可以从数据处理的视角来理解它。在Polars中,当你对一个DataFrame进行操作时,你实际上是在一个特定的数据处理环境中工作,这个环境可以理解为一种"上下文"。总的来说,在Polars中,"上下文"可以理解为你在其上执行操作的数据集(如DataFrame)及其当前状态。,其中所有元素都具有相同的数据类型(例如,整数、字符串等),Series可以被视为数据的列,类似于pandas 的column,它代表了数据表中的一列。原创 2024-07-11 12:02:46 · 1203 阅读 · 0 评论 -
从 Pandas 到 Polars 九:排序数据优化2-按组聚合
在这种情况下,快速排序算法在逐元素搜索之前仍在尝试跳过列中的元素,因此当基数较高时,排序方法甚至可能更慢。在这个例子中,我们创建了一个包含ID列的DataFrame,并且我们知道这个列是已排序的。如果我们创建一个新的DataFrame,基数设为100_000,我们发现标准算法需要90毫秒,而快速排序算法需要60毫秒。考虑到这一点,这仍然是一个强大的优化方法,如果你知道你的数据已排序且基数不太高,就可以应用它。在上面的例子中,我们设置了基数为10,因此在1000万行中只有10个不同的组ID。原创 2024-07-10 16:38:06 · 300 阅读 · 0 评论 -
从 Pandas 到 Polars 八:排序数据优化1—统计功能
Polars 的一个不太为人所知的优点是,它拥有快速算法,能够利用排序后的数据实现这一点。例如,如果我们想要中位数,标准算法首先需要对数组进行排序,然后提取中间的一些值(取决于使用的确切插值方法)。为了测试这些缩放是否成立,我们比较了在Polars中获取最大值所需的时间长度——Polars对排序后的数据有快速算法——以及Pandas,后者则没有这样的算法。因此,无论N的大小如何,Polars所需的时间都是20微秒,但对于Pandas来说,这个时间会随N线性增长。获取最大值是最简单的快速算法示例。原创 2024-07-10 16:18:35 · 554 阅读 · 0 评论 -
从 Pandas 到 Polars 七:在Polars中哪些操作支持流式模式
要找出哪些操作支持流式处理的一个方法是,首先定义一个包含两个浮点数列的简单DataFrame,然后将其转换为LazyFrame(请参见文末的代码)。相比之下,cumsum(累加和)操作在按批次执行时就比较困难,因为我们需要知道前一行的值才能计算当前行的值。这并不是一个全面测试哪些操作有效哪些无效的方法,但应该有助于你直观了解哪些操作支持流式模式。然而,流式处理仍然是Polars正在开发的一部分,并非所有操作都支持流式处理。请注意,map_elements 尚未包含在我的列表中,但它也应该在流式模式下工作。原创 2024-07-09 21:30:21 · 704 阅读 · 0 评论