阅读我们的文章

.

在 Pandas 中使用 ID == ‘string’ 过滤 data 是应该避免的,因为标量_比较运算符会导致性能瓶颈。有很多方法可以绕过它,例如将 Dataframe 分割成一个字典,使用相关 ID 作为键。.

介绍 | pandas 中的字符串过滤器

cloud 解决方案带来的硬件管理简化,促使我们越来越多地转向代码优化问题。.

The simplification of hardware management, brought by cloud solutions, pushes us more and more to turn away from the problems of code optimisation.

但扩大规模和 提高计算能力并不总能解决问题 因为这会导致成本上升,而且计算能力不是无限的。.

我给自己提出了一个挑战,要在一个简单的容器中装上我所有的 data 准备工作、, 优化代码有时就像实例化一个更大的实例一样简单。.

在这篇文章中,我想回头谈谈对代码的一次修改,它让我在倾向模型的开发阶段大幅减少了特征计算所花费的时间。这一改动很常见,可以应用到很多其他情况。.

它的目标并不是成为最优解,而是要成为一种快速的选择,以有效的方式减少计算时间,这也是"...... "的精神所在。 帕累托原则.

背景

在这次任务中,我负责将 data 的准备过程自动化,并对我们的 Data 科学家团队开发的模型进行预测。为了简化 data 流程,每天都要上传事务性的 data,并且必须经过第一次 预处理 步骤,然后是第二步 特点 计算 的最后一步之前 模型预测 使用训练有素的模型。.

The Feature computation phase is the one that took the longest time to execute: indeed many features were computed at the customer level

"(《世界人权宣言》) 特征计算 该阶段是执行时间最长的阶段:实际上,许多特征都是在客户级别计算的,这导致代码中耗时惊人的一行重复执行:

which resulted in the recurrent execution of a surprisingly time-consuming line in the code :

这一行的计时时间为 18 毫秒,这意味着我每天要评估 33717 个客户,每个客户级功能的原始计算时间约为 10 分钟,由于在 8 个可用 CPU 上并行操作,每个功能的计算时间缩短到了 1 分 16 秒。.

由于我们使用的是 B2B data,因此有必要在客户级别计算特征,因为一个客户实际上代表着一家企业,有时一天会有多个订单。.

实验 | pandas 中的字符串过滤器

在使用 %%prun 神奇的命令,我找到了处理瓶颈的源头:"......"。 pandas._libs.ops.scalar_compare 运算符,而在我的 Pandas 版本(1.3.1)中,该运算符未得到充分优化。.

只需将这个“==”运算符,用“伊素”,这不是很直观,因为我比较的是单个字符串,我已经将计算时间除以 2.5 倍,运算时间从 18 毫秒变为 7.95 毫秒。.

我仍然在寻找优化方法,我发现了一个 Stackflow 的职位,推动使用 分类类型 以进一步改进操作。.

这最后一种实现方式使我能够将计算时间划分得比 36次. .不过,我发现这一招有细微的差别,因为 在所有操作过程中,类别类型的行为与经典 str 类型不同 (请参见在 pandas 中使用 .groupby() 时的示例),因此我不得不将其转换回 str。.

假设

这是为什么呢?一个简单的 == 操作所需的时间比在两个字符串之间进行 isin() 比较列表的操作,或 专用 一个?
要回答第一个问题,我们肯定需要挖掘执行 标量比较 的代码进行比较。 isin() 方法。.

幸运的是,第二部分的答案似乎更直观:在比较两个字符串值时,我们是在比较一个 无穷数 而在对两个类别进行比较时,则 选项数量已设定 不同的独特类别。看起来 当我们的选项数量固定时,比较两个实体更容易.

我对优化的渴求仍未得到满足,于是我决定从现有方法中后退一步。我想出了一种新方法: 将我的 Datarame 分割成字典 在计算特征时,我将用它来筛选客户。.
在代码方面,这简单地转化为以下几行:

customers_list = list(df.ID_Customer.unique()) df_dict = {elem: df[df.ID_Customer == elem] for elem in customers_list}

建立字典花费了我 32 秒的计算时间,但使用这个分区的 Data 框架,我现在可以在几纳秒内过滤我的 data。.

结论 | pandas 中的字符串过滤器

在实验阶段花了几个小时后,我对结果很满意:

After spending a couple of hours in the experimentation phase, I was happy with the result :

现在,每个客户过滤的初始计算时间被划分为 348 000 次, 从 18ms 至 51.7ns, 或从 10 分钟至 2.65 毫秒 在我的案例中,考虑到分区所花费的时间,计算出的每个特征所需的时间。.

Immediately, the impact of this small change allowed me to reduce the calculation time of my complete Feature computation phase by 90%, from 40'49" to 7'27".

这一微小变化的影响立即让我 将我的完整特征计算阶段的计算时间减少 90%, 从 40’49” 到 7’27”。使用我将在下一篇文章中详细介绍的二氧化碳当量估算方法,这一修改 至少节约 170$/ 年 + 22kgCO2/ 年 随着客户名单的不断扩大以及该项目在其他国家的推广,可能会有更多的客户。.

中型 Blog by Artefact.

本文最初发表于 Medium.com.
在我们的 Medium Blog 上关注我们!