在 Pandas 中使用 ID == ‘string’ 过滤 data 是应该避免的,因为标量_比较运算符会导致性能瓶颈。有很多方法可以绕过它,例如将 Dataframe 分割成一个字典,使用相关 ID 作为键。.
介绍 | pandas 中的字符串过滤器
cloud 解决方案带来的硬件管理简化,促使我们越来越多地转向代码优化问题。.

但扩大规模和 提高计算能力并不总能解决问题 因为这会导致成本上升,而且计算能力不是无限的。.
我给自己提出了一个挑战,要在一个简单的容器中装上我所有的 data 准备工作、, 优化代码有时就像实例化一个更大的实例一样简单。.
在这篇文章中,我想回头谈谈对代码的一次修改,它让我在倾向模型的开发阶段大幅减少了特征计算所花费的时间。这一改动很常见,可以应用到很多其他情况。.

它的目标并不是成为最优解,而是要成为一种快速的选择,以有效的方式减少计算时间,这也是"...... "的精神所在。 帕累托原则.
背景
在这次任务中,我负责将 data 的准备过程自动化,并对我们的 Data 科学家团队开发的模型进行预测。为了简化 data 流程,每天都要上传事务性的 data,并且必须经过第一次 预处理 步骤,然后是第二步 特点 计算 的最后一步之前 模型预测 使用训练有素的模型。.

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

这一行的计时时间为 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 毫秒。.


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

假设
这是为什么呢?一个简单的 == 操作所需的时间比在两个字符串之间进行 isin() 比较列表的操作,或 专用 一个?
要回答第一个问题,我们肯定需要挖掘执行 标量比较 的代码进行比较。 isin() 方法。.
幸运的是,第二部分的答案似乎更直观:在比较两个字符串值时,我们是在比较一个 无穷数 而在对两个类别进行比较时,则 选项数量已设定 不同的独特类别。看起来 当我们的选项数量固定时,比较两个实体更容易.
我对优化的渴求仍未得到满足,于是我决定从现有方法中后退一步。我想出了一种新方法: 将我的 Datarame 分割成字典 在计算特征时,我将用它来筛选客户。.
在代码方面,这简单地转化为以下几行:
建立字典花费了我 32 秒的计算时间,但使用这个分区的 Data 框架,我现在可以在几纳秒内过滤我的 data。.

结论 | pandas 中的字符串过滤器
在实验阶段花了几个小时后,我对结果很满意:

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

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

博客







