自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(71)
  • 收藏
  • 关注

原创 Polars简明基础教程六:什么是Polars的“DataFrame(数据框)_下”

我们可以将Polars DataFrame视为一个轻量级对象,它指向轻量级的Arrow表,该表又指向重量级的Arrow数组(重量级是因为它们持有实际数据)。在这个示例中,我们更改了第一行中的第一个值,我们可以看到对新的DataFrame的更改不会影响旧的DataFrame。Arrow的设计优化了对一维列的操作,而Numpy的设计优化了对多维数组的操作。这有助于减少数据传输过程中的开销。尽管新的和旧的DataFrame最初指向相同的Arrow表,但我们不需要担心对其中一个所做的更改会影响另一个。

2024-08-10 17:29:55 265

原创 Polars简明基础教程五:什么是Polars的“DataFrame(数据框)_上”

pl.Int32 与 pl.Float32 -> pl.Float64(遵循Numpy的约定,整数和浮点数组合时,转换为浮点数类型,并尽量扩展至更大的位宽)是 Polars 中的一种抽象类型,它能够表示一个 Series 中可能存在的多种具体类型。- 任何dtype 与 pl.Utf8 -> pl.Utf8(任何数据类型都可以转换为字符串类型,因此任何列都可以被转换为Utf8类型)- pl.Int64 与 pl.Boolean -> pl.Boolean(整数与布尔值的组合通常导致布尔值类型)

2024-08-10 16:34:13 382

原创 Polars简明基础教程四:懒惰模式 2:评估查询

在这篇博客文章中,我建议对于许多用例,打开流式模式可能是一个好的默认设置(这就是我在我的机器学习管道中所做的)默认情况下,当我们评估一个 “LazyFrame ”时,Polars 会将整个 “DataFrame ”加载到内存中。我们可能希望保存查询中的中间值。因此,我们在转换回惰性模式之前触发评估以创建一个可以保存的 DataFrame。在某些情况下,我们有一个 DataFrame 并希望将其转换为 LazyFrame。当我们触发评估时,我们将 LazyFrame 转换为 DataFrame。

2024-08-09 08:44:37 588

原创 Polars简明基础教程三:懒惰模式 1:引入懒惰模式(续)

在上面的SELECT块中,我们看到这些表达式是以__POLARS_CSER_X的形式调用的,其中均值表达式有一个代码,标准差表达式也有一个代码。我们可以看到,Polars已经识别出这些是在SELECT块中的三个表达式中相同的子表达式。在这里,我们会看到公共子表达式消除优化是如何工作的。通过公共子表达式消除,Polars识别出哪些相同的表达式被计算了多次,因此Polars会缓存第一次的输出以便重用。如果用户知道优化的存在、记得实现优化并且正确地实现了优化,大多数优化都可以通过用户在精心编写的查询中实现。

2024-08-09 08:03:44 453

原创 Polars简明基础教程二:懒惰模式 1:引入懒惰模式

Polars的开发人员所说的“昂贵”实际上是指到达架构需要一些计算,并且随着查询计划的增长,这种计算所需的时间也会增长。然而,当我们尝试获取LazyFrame的架构时,会得到一个警告,指出这可能是一个昂贵的操作,因为Polars需要遍历查询计划的逻辑来确定最终的列和数据类型会是什么。我们通过在一个LazyFrame上调用collect方法将LazyFrame转换为一个DataFrame——这会根据查询计划处理你的数据。LazyFrame实际上是一个查询计划——一个关于Polars如何转换你的数据的计划。

2024-08-08 09:21:51 681

原创 从 Pandas 到 Polars 四十六:使用Polars读取和写入S3数据

在OutputSerialization参数中,我们传递了一个包含一些参数的字典,以告诉它如何序列化返回的数据——在这种情况下是CSV文件。不幸的是,在编写本文时,唯一的输出序列化选项是CSV和JSON,因此即使您输入的是Parquet文件,您也不能返回Parquet文件。在InputSerialization参数中,我们传递了一个包含一些参数的字典,以告诉它如何读取我们的CSV文件。例如,我们告诉它文件有一个标题行,并且没有压缩。对于Parquet文件,我们可以在S3上扫描文件,并且只读取我们需要的行。

2024-08-08 08:59:59 704

原创 从 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

原创 从 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

原创 PEP 8 – Python 代码风格指南中文版(九)

虽然变量注解的语法(由PEP 526提出)在Python 3.6及以后的版本中得到了官方的支持,但是不论你使用的是哪个版本的Python,当你编写存根文件时,都应该优先使用这种变量注解的语法。这意味着,即使你的代码中包含了类型注解,Python解释器在运行代码时也不会因为这些注解而发出任何警告或错误消息,也不会因为注解而改变代码的执行方式。在PEP 484被接受之前,Python社区对于函数注解的风格可能并没有一个统一的规范,因为那时的注解主要是用来存放任意元数据的,而不仅仅是类型信息。

2024-08-06 12:01:33 745

原创 PEP 8 – Python 代码风格指南中文版(八)

在Python中,try...finally语句用于执行一段代码,无论是否发生异常,finally子句中的代码都会被执行。如果在finally子句中使用了return、break或continue语句,并且这些语句会导致控制流跳出finally子句(例如,return会使函数返回,break会跳出最近的循环,continue会跳过当前循环的剩余部分并继续下一次迭代),那么任何在try块中抛出但尚未被捕获的异常,或者在try块和finally子句之间抛出的异常,都会被隐式地取消(即不会被传播到调用者)。

2024-08-06 08:34:01 1024

原创 PEP 8 – Python 代码风格指南中文版(七)

自定义Python异常时,推荐从Exception类继承而非BaseException,后者常用于不应被捕获的异常。设计异常层次结构时,应基于问题性质而非抛出位置,以便捕获异常的代码能准确理解并响应。命名异常类时,错误类应加“Error”后缀,非错误类则无需。同时,避免使用裸露的except子句,以提升代码清晰度和健壮性。此外,适当使用异常链,保留原始异常信息,有助于调试和记录复杂错误情况。

2024-08-05 15:15:10 1143

原创 PEP 8 – Python 代码风格指南中文版(六)

然而,当你将 lambda 表达式的结果(即函数对象)赋值给一个变量时,虽然这个变量现在引用了这个函数对象,但函数对象本身仍然保持匿名(在内部表示中,它可能仍然显示为 '')。虽然 lambda 表达式允许你将函数定义嵌入到更大的表达式中,但如果你只是将 lambda 表达式的结果赋值给一个变量(如 f = lambda x: x + 1),那么你就失去了 lambda 表达式的这一主要优势,因为此时你已经通过变量名 f 显式地引用了这个函数。这在回溯和一般的字符串表示中更为有用。

2024-08-05 09:37:58 780

原创 PEP 8 – Python 代码风格指南中文版(五)

在设计这样的类时,请小心明确决定哪些属性是公开的,哪些属性是子类API的一部分,以及哪些属性确实仅应由你的基类使用。除非它们是包含模块的API中明确记录的一部分(如os.path或包的__init__模块,该模块公开了来自子模块的功能),否则其他模块不得依赖对这些导入名称的间接访问。设计为通过from M import *使用的模块应使用__all__机制来防止导出全局变量,或者使用较旧的约定,即在全局变量名前加上下划线(你可能希望这样做来表示这些全局变量是“模块非公开的”)。模块名称应该简短,全部小写。

2024-08-03 16:30:43 1321

原创 PEP 8 – Python 代码风格指南中文版(四)

当尾随逗号是多余的时候,在使用版本控制系统时,或者当预期值列表、参数或导入项会随着时间的推移而扩展时,它们通常很有帮助。这种模式的做法是将每个值(等)放在一行上,并始终添加一个尾随逗号,然后在下一行添加闭合的括号/方括号/花括号。在Python中,这种风格通常被认为是不必要的,因为属性和方法名称都以对象作为前缀,而函数名称则以模块名称作为前缀。尾随逗号通常是可选的,但在创建一个只有一个元素的元组时是必须的。如果行内注释陈述的是显而易见的内容,那么它们是不必要的,并且实际上会分散注意力。

2024-08-03 10:06:37 839

原创 PEP 8 – Python 代码风格指南中文版(三)

对于模块级别的特殊变量,如__all__(用于指定当使用from module import *时应该导入哪些名称)、__author__(用于指定模块的作者)、__version__(用于指定模块的版本号)等,PEP 8建议将它们放置在模块文档字符串之后。因此,当你编写Python模块时,你应该首先放置文档字符串,然后是__future__导入(如果有的话),接着是模块级别的双下划线名称(如__all__、__author__、__version__等),最后是其他的导入语句和模块代码。

2024-08-02 22:15:08 647

原创 PEP 8 – Python 代码风格指南中文版(二)

通配符导入有一个例外的用例,那就是作为公共API的一部分重新发布内部接口(例如,用来自可选加速器模块的定义覆盖接口的纯Python实现,并且具体哪些定义将被覆盖是事先不知道的)。几十年来,推荐的风格是在二元运算符之后换行。推荐使用绝对导入,因为它们通常更容易阅读,并且在导入系统配置不正确(例如,当包内的一个目录意外地出现在sys.path中时)时,它们往往表现更好(或者至少能给出更好的错误信息)。然而,明确的相对导入是绝对导入的一个可接受的替代方案,尤其是在处理复杂的包布局时,使用绝对导入会过于冗长。

2024-08-02 08:47:43 482

原创 PEP 8 – Python 代码风格指南中文版(一)

续行应使用Python在括号、方括号和大括号内的隐式行连接,将包装的元素垂直对齐,或使用悬挂缩进[1]。这里提供的指南旨在提高代码的可读性,并使Python代码在广泛范围内保持一致。请参阅配套的信息性PEP,该PEP描述了Python C实现中C代码的风格指南。本文档和PEP 257(Docstring约定)改编自Guido最初的Python风格指南文章,并添加了Barry风格指南[2]中的一些内容。),加上一个空格,再加上一个左括号组成的组合,为随后多行条件语句的每一行创建了一个自然的4个空格缩进。

2024-08-01 23:20:24 418 1

原创 从 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

原创 在Polars中,pl.selectors和df.select方法在使用上有什么区别?

它们提供了一种更灵活的方式来选择满足特定条件的列,特别是在处理大量列或者需要根据某些条件选择列的情况下。在 Polars 中,selectors 和 df.select 方法都有助于选择 DataFrame 中的列,但它们的使用方式和目的略有不同。如果你需要选择满足特定条件的列,或者在列名未知的情况下选择列,方法用于选择 DataFrame 中的特定列,通常通过提供列名列表来指定需要选择的列。适用于选择满足特定条件的列,特别是在列名未知或列的数量很大时。来选择所有以 "price" 开头的列,并使用。

2024-07-31 11:58:31 693

原创 从 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

原创 从 Pandas 到 Polars 四十一:检查Polars的查询

方法是一个非常有用的工具,它允许你在执行一系列操作的过程中插入一个检查点,以查看 DataFrame 的状态。我们在下面的示例中可以看到这一点,我们在进行分组之前先进行了过滤。通过在过滤和分组之间添加inspect,我们可以在查询的该点处打印输出。在这种情况下,我们可以在查询中添加一个.inspect()的调用。通过在操作链中插入检查点,你可以观察 DataFrame 在各个阶段的状态,这在调试复杂查询时非常有用!都会打印当前 DataFrame 的状态,这有助于理解数据在每个阶段的状态。

2024-07-30 09:30:42 347

原创 从 Pandas 到 Polars 四十:使用Polars进行机器学习预处理(二)

我认为在未来一年里,我们会看到一个围绕Polars开发的优秀的机器学习预处理库。with_context的优势在于我们仍然保持在Polars中强大的惰性模式下,因此我们仍然可以利用诸如查询优化之类的功能。在机器学习预处理中,一个常见的步骤是将训练集的数据与测试集共享。例如,我们可能想用训练集中的值来填充测试集中的空值。实际上,我们总是在惰性模式下使用with_context,因为这就是Polars将查询的不同部分组合在一起的方式。在下面的示例中,我们在“Age”列中有一些空值。

2024-07-30 09:03:43 312

原创 从 Pandas 到 Polars 三十九:Polars 和 Matplotlib

退一步说,如果你只习惯使用pandas的数据进行绘图,那也可以使用polars的df.to_pandas()方法将数据转为pandas的格式,只不过在转换为 Pandas DataFrame 时,可能会有一些性能损失,特别是对于大型数据集。在下面的第一个示例中,我们可以看到北大西洋中爱尔兰波浪浮标测得的最大波浪高度(这只是一个片段,用于向您展示它的工作方式)。在第二个示例中,我们使用快速的 groupby_dynamic 方法对每个站点的波浪高度取3小时的平均值。我们是否也可以进行一些风暴追踪呢?

2024-07-29 11:41:40 259

原创 Polars简明基础教程一:Polars快速入门

在这个例子中,我们将添加一个列,其中包含每个舱位中乘客的最大年龄。在Python中(而不是特指Polars),当我们将代码包裹在括号中时,我们可以在新行上调用一个新方法——在这种情况下是select。在这里,我们看到一个使用表达式API的简单示例,其中我们在select语句中选择Pclass、Name和Age列(我们将在第3节中深入了解select语句)。表达式是一个函数,它接受一个Series(或DataFrame中的列)作为输入,并返回一个Series(或DataFrame中的列)。

2024-07-29 09:16:29 1080

原创 从 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

原创 从 Pandas 到 Polars 三十七:在 AWS Lambda 环境中使用 Polars 来处理数据

因为Polars现在内置了对在eager模式和lazy模式下从云存储(如AWS S3)读取和写入的支持,我们通常可以在处理程序函数中编写标准的Polars语法。在Docker中进行这种操作的一个好处是,你可以在将Lambda函数部署到AWS之前,在本地对它们进行测试。我在我的研讨会上提到了这一点,并且我也会在未来的博客文章中讨论它。在这个示例的shell脚本中,当运行容器时,我将我的.aws文件夹挂载到容器中的.aws文件夹。我将在下面详细解释这一点。在实际的生产查询中,我强烈建议你锁定你的依赖项的版本。

2024-07-27 09:00:28 971

原创 从 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

原创 从 Pandas 到 Polars 三十五:使用Polars从数据库中加载数据

然而,当你从大型数据集中选择小部分数据时,数据库方法非常强大。在你的SQL语句中添加一个where子句来选择你的子集。然后,在你想要定义子集的列上创建一个索引。然后,你使用Polars和connectorx——这是Python中从数据库读取数据的最快方式。在某些项目中,挑战在于你拥有庞大的数据集,但在任何给定时刻只想查看数据集中定义明确的子集。在这种情况下,我们只在乘客编号列上创建索引,但你可以在多个列上创建更高级的索引。解决这一问题的强大方法是利用数据库和它们选择子数据的能力。

2024-07-26 08:27:13 412

原创 从 Pandas 到 Polars 三十四:在Polars中,Lazy模式的隐藏时间节省器

问题在于我们的数据转换是无效的:'values' 列的数据类型是整数(integer dtype),但 'round' 表达式只能对具有浮点数据类型(floating point dtype)的列进行调用。Polars中的Lazy模式不仅提供查询优化并允许您处理超出内存限制的数据集,它还提供了一定的类型安全性,可以在您开始处理大量数据之前发现管道中的错误。下面我们通过一个简单的流程来说明这个想法,其中我们从一些数据中创建一个DataFrame,并在即时模式下对其进行转换。

2024-07-25 15:20:04 470

原创 从 Pandas 到 Polars 三十三:在Polars中启用流式模式

如果我们比较使用streaming=True和streaming=False(默认)的查询,我发现流式模式的平均时间为75毫秒,而非流式模式为120毫秒。不过,我不能保证流式模式总是至少与非流式模式一样快,因为Polars中的流式技术仍在开发中,肯定存在流式模式会显著变慢的使用场景。这意味着,如果你正在处理较大的数据集,特别是如果你正在构建希望未来能够处理更大数据集的管道时,保持流式模式的开启是值得的。对于许多查询,流式模式可能是一个很好的默认选择——而不是只有在遇到内存问题时才应该使用的应急按钮。

2024-07-25 11:52:20 261

原创 从 Pandas 到 Polars 三十二:对Polars查询进行性能剖析

在图表中,我们看到读取CSV文件是瓶颈所在。因此,我们应该将精力集中在这一步骤上,采用诸如指定数据类型(dtypes)或更好的做法,将其转换为Parquet或Arrow格式等策略。你可以通过在任何延迟查询上调用 .profile 来获取这些数据。更好的是,我们还可以得到一个图表来可视化每一步所花费的时间。现在,DataPolars 提供了一个性能分析工具来展示它的工作情况。在这个例子中,我们从 CSV 文件中读取数据,进行分组,然后排序。如果你不知道瓶颈在哪里,你就无法优化你的代码。

2024-07-24 08:56:38 199

原创 数据科学测试 3:使用Pandas进行测试

该剖面在接近表面的区域有一个相对均匀的温度区域,这个区域被称为混合层。这个函数接受一个一维的温度值数组和一个浮点数来设置温度差异阈值。它会在整个温度剖面中进行简单的循环,直到找到第一个温度差异超过阈值的索引。Numpy的测试模块还允许您使用np.testing.assert_array_almost_equal来测试两个数组在指定的容差范围内是否几乎相等。相反,我们使用Numpy的内置测试模块np.testing。我们通过修改我们的混合层深度索引函数来展示这一点,使其能够处理二维数组而不是一维数组。

2024-07-24 08:52:59 297

原创 从 Pandas 到 Polars 三十一:Polars 没有内置索引,但如果你想要一个或多个索引呢?

为了实现这一点,我们将 groupby._groups DataFrame 转换为字典,然后我们可以快速访问我们的子DataFrame。在 partition_by 映射中的DataFrame都是副本,因此如果你想要以多种方式进行分区,这将非常消耗内存。使用 groupby 的一个优势是在内存使用上很高效——基本上相当于增加一个额外的32位整数列来存储每个映射的行索引。我们告诉它我们想要根据哪些列进行分区,然后Polars会创建一个字典,将唯一值映射到包含相应行的DataFrame。

2024-07-23 22:02:12 429

原创 数据科学测试 2:测试的基本原则

对于许多数据科学对象的测试,如DataFrame,仅使用标准的Python断言语句就足够了。在pytest框架中,我们通过添加一个新函数来进行测试,该函数以test_开头,或者在这个例子中为test_loadAndCleanCSV,这样我们就知道它针对的是哪个函数。一旦我在src目录中的某个地方将测试写入自己的脚本中,我就可以使用pytest来运行它们。pytest 具有更高级的功能,例如通过参数化测试遍历一系列数据组合,或使用 fixtures 为多个测试设置相同的数据。

2024-07-23 09:20:53 434

原创 从 Pandas 到 Polars 三十:将具有不同架构的数据进行合并

对角合并会将你的新记录及其新列追加到旧记录之后,并在旧记录的新列中添加空值(null),以表示数据缺失。你得到了一个新文件,并发现从现在开始将会有一些有用的额外列。你打算如何将这个文件与旧数据结合起来呢?这时就是Polars中的对角合并(diagonal concatenation)发挥作用的时候了。垂直合并(vertical concatenation)不适用,因为它不喜欢模式变化。你的项目中有一堆数据文件,它们都遵循一致的数据模式。

2024-07-22 22:22:13 228

原创 数据科学测试 1:为什么要测试?

我称之为“中间低谷”。在纯粹的测试驱动开发(TDD)方法中,目标是实现100%的测试覆盖率——也就是说,你要为你的每个函数都编写测试。你的测试也必须在这些不同的规模上进行:一些测试将测试单个函数的输出,而其他测试将测试许多函数串联在一起的输出。对于大多数人来说,从0%到10%的测试覆盖率就能产生最大的价值,特别是当你首先针对你的流程中最容易出现故障的部分进行测试时。用于描述测试的术语并不总是一致的,但通常,针对单个函数的细粒度测试被称为单元测试,而针对管道的粗粒度测试被称为功能测试、端到端测试或集成测试。

2024-07-22 17:36:58 1008

原创 从 Pandas 到 Polars 二十九:在Polars中进行机器学习预处理(一)

例如,我们可以创建一个类来用scikit-learn的API包装Polars代码。然后,在转换为numpy以用于机器学习模型之前,我们可以尽可能长时间地保持在快速且内存高效的Polars和ApacheArrow组合中。让我们看看在Polars中进行一些这样的预处理是否值得。简单示例:我们有一个包含100,000行和100列的数据框,并希望对每个列进行最小-最大缩放。在最近的时间里,我将探索在Polars中进行机器学习(ML)可以走到多远。所以在这个比较中,Polars的速度是原来的两倍。

2024-07-20 15:53:03 458

原创 从 Pandas 到 Polars 二十八:利用 setattr 函数在 Polars 中设置属性的快捷方式

是一个允许你以动态的方式修改对象的属性的强大工具,但你可以在polars中用setattr来设置一些你常用的函数的别名,用作快捷键。详细的代码对于生产环境来说非常棒,但在ipython或jupyter中进行快速数据探索时,你确实希望代码能够更快速。在编写代码时,存在一个权衡点,即如何在编写清晰详细的代码与编写快速且易于输入的代码之间找到平衡。同时,去掉下划线也是一个好主意——这些需要按两次的字符在重复时会给你的手指带来很大的压力!为了解决这个问题,你可以使用setattr为你的函数设置一个别名。

2024-07-20 15:48:52 162

原创 从 Pandas 到 Polars 二十七:Polars中灵活的时间序列聚合

在最近的一个项目中,我拥有来自遥测的10年每两分钟的数据,并需要计算每小时的平均值——大约250万行数据乘以100列。在Polars中,我使用了groupby_dynamic,发现它比Pandas快10倍,这让客户们感到满意!这不是问题——你可以指定间隔周期来获取所需的滚动平均值,而无需付出性能成本。为了处理高频变化性,我也需要在3小时滚动窗口内执行此操作。Polars中的时间序列聚合既快速又灵活。

2024-07-19 15:14:39 204

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

在 Polars 中,避免使用显式循环遍历列是非常推荐的做法,因为显式循环会破坏并行化,在大规模数据集上效率低下。map方法示例:假设我们有一个DataFrame,其中包含人员的姓名和出生日期,我们想创建一个新的列,该列包含每个人的年龄。方法有时可能涉及一些形式的循环,但它是在列级别而非行级别上应用函数,通常比逐行应用更高效。假设我们有两个 DataFrame,一个包含员工信息,另一个包含部门信息。相反,首先应使用表达式,然后Polars将为您并行处理列循环。最后,如果需要合并 DataFrame,可以。

2024-07-19 08:57:21 560

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除