为什么人们更喜欢 Pandas 而不是 SQL?

数据挖掘 Python 熊猫 sql
2021-09-18 19:32:42

自 1996 年以来我一直在使用 SQL,所以我可能有偏见。我广泛使用过 MySQL 和 SQLite 3,但也使用过 Microsoft SQL Server 和 Oracle。

我见过的绝大多数用 Pandas 完成的操作都可以用 SQL 更轻松地完成。这包括过滤数据集、选择要显示的特定列、将函数应用于值等等。

SQL 具有优化器和数据持久性的优势。SQL 也有清晰易懂的错误信息。Pandas 有一个有点神秘的 API ,其中[ stuff ]有时适合使用单个. Pandas 的部分复杂性源于这样一个事实,即发生了如此多的重载。[[ stuff ]].loc

所以我试图理解为什么 Pandas 如此受欢迎。

4个回答

真正的第一个问题是为什么人们使用 DataFrame 抽象比纯 SQL 抽象更有效率。

TLDR;SQL 不适合(人类)开发和调试过程,DataFrames 是。

主要原因是 DataFrame 抽象允许您构造 SQL 语句,同时避免冗长和难以辨认的嵌套。编写嵌套例程,将它们注释掉以检查它们,然后取消注释它们的模式被单行转换所取代。您可以自然地在 repl 中逐行运行(甚至在 Spark 中)并查看结果。

考虑这个例子,将一个新的转换(字符串损坏的列)添加到一个表中,然后按它进行分组并进行一些聚合。SQL 变得非常丑陋。Pandas 可以解决这个问题,但在涉及真正的大数据或特定分区时缺少一些东西(也许最近有所改进)。

DataFrames 应该被视为 SQL 例程的高级 API,即使使用 pandas,它们根本不会呈现给某些 SQL 规划器。


您可能可以围绕此进行许多技术讨论,但我正在考虑下面的用户视角。

您可能会看到更多关于 Pandas 数据操作而不是 SQL 的问题的一个简单原因是,根据定义,使用 SQL 意味着使用数据库,而如今的许多用例非常简单地需要一些数据一次性完成的任务(来自 .csv、web api 等)。在这些情况下,从数据库中加载、存储、操作和提取是不可行的。

但是,考虑到用例可能证明使用 Pandas 或 SQL 的情况,您肯定没有错。如果您想做许多重复的数据操作任务并保留输出,我总是建议您先尝试通过 SQL。从我所见,即使在这些情况下,许多用户也不使用 SQL 的原因有两个。

首先,pandas 相对于 SQL 的主要优势在于它是更广泛的 Python 世界的一部分,这意味着我可以一举加载、清理、操作和可视化我的数据(我什至可以通过 Pandas 执行 SQL……)。另一个很简单,就是太多的用户不知道 SQL 的能力范围。每个初学者都学习 SQL 的“提取语法”(SELECT、FROM、WHERE 等),作为将数据从数据库中获取到下一个位置的一种手段。有些人可能会选择一些更高级的分组和迭代语法。但在那之后,知识往往会出现相当大的鸿沟,直到你接触到专家(DBA、数据工程师等)。

tl;dr:这通常取决于用例、便利性或围绕 SQL 功能范围的知识差距。

尽管这两件事的应用有重叠,但这是将苹果与橙子进行比较。

pandas 是一个用 Python(一种通用编程语言)实现的数据分析工具包。SQL 是一种用于查询关系数据的特定领域语言(通常在关系数据库管理系统中,例如 SQLite、MySQL、Oracle、SQL Server、PostgreSQL 等)。

SQL 暗示

  • 在 RDBMS* 中处理可能适合也可能不适合工作负载的数据,即使它只是一个小型 SQLite 数据库,
  • 数据库领域知识(作为最终用户、开发人员和/或管理员;我经常看到“SQL 更快”的建议是过度简化),以及
  • 克服有效使用 SQL 的重要学习曲线,特别是在数据分析等专业应用程序中(而不是创建简单数据的简单报告)。

* 值得强调的是,SQL 是如此特定于领域,它与使用越来越常见的关系数据库替代品(如NoSQL数据库)的相关性变得越来越小。这代表了数据存储和结构化方式的根本转变,并且确实没有像 SQL 标准化开发那样普遍通用的访问方式。

另一方面,Python(pandas 相当“pythonic”,因此在这里成立)灵活且可供来自不同背景的人使用。它可以用作“脚本语言”、功能语言和功能齐全的 OOP 语言。pandas 中内置了可视化功能和数据源互操作性,但您可以自由地将 Python 可以做的任何事情纳入您的工作流程(这是大多数事情);科学 Python 生态系统已经膨胀,包括Jupyter Notebook等优秀工具和matplotlibnumpy等基本scipy(pandas 建立在这些库上)。pandas 数据分析的重要元素是R-inspired 并且您通常不会发现统计学家在讨论他们是否使用 R(或者可能越来越多的 pandas!)而不是将所有内容放入数据库并用 SQL 编写分析。

我并不是说 pandas 比 SQL 更好,反之亦然,但 SQL 是一个非常特定于领域的工具,而 pandas 是一个庞大、灵活且易于访问的生态系统的一部分。我使用地理空间数据系统,其中关系数据库占很大一部分,而 SQL 是一个强大且必不可少的工具。然而,pandas 是我日常工具包中同样重要的一部分,而且 SQL 通常被归类为获取数据——也许需要一些预处理——所以我可以在 pandas 中使用它。

首先,熊猫并不那么受欢迎。我同时使用熊猫和 SQL。首先我试着理解这个任务——如果它可以在 SQL 中完成,我更喜欢 SQL,因为它比 pandas 更有效。尝试处理大数据 (10,000,000 x 50)。尝试在 SQL 和 pandas 中执行一些groupby操作。你会明白的。

我在派上用场的地方使用 pandas——比如将列值拆分为一个数组并在其上做一些事情(比如只从该数组中选择一些值)。现在这种任务在 SQL 中相对难以编码,但 pandas 会减轻您的任务。

即使我知道我的 SQL,我也是在任何情况下都会使用(就我而言)R 的 dplyr(语言,不一定是工具)的人之一。

我在 Pandas/dplyr/data.table 管道中看到的主要好处是操作是原子的,可以从上到下读取。

在 SQL 中,您需要解析整个脚本,跳来跳去(正在汇总什么,正在加入什么以及如何 - 左?内部?对吗?,是否应用了任何过滤器?)以完全掌握正在发生的事情。

在 Pandas 等人中,管道的每个步骤都是自包含的,它对输入数据做一些事情并返回输出数据,这个顺序过程使得推理发生的事情变得更容易,因为每个操作都有一个明确定义的状态,而不仅仅是 on查询级别。

是的,您可以执行WITH语句等,但它需要更多的代码,并且与管道相比,使用的对象不清楚。