SQL思维 VS Python思维,孰优孰劣?
多年来,我们使用各种语言和工具来分析数据。事实上,每种工具背后都对应着不同的心理框架去分析解决问题,意识到这些框架 (以及它们所倡导的行为)与掌握新语言或工具的技术特征同样重要。
不了解SQL的所有知识也无妨
在数据分析领域,SQL是一个必要的切入点,其擅长的计数和简单聚合功能通常足以为业务决策提供信息。
不过,SQL是一种使用非常受限的语言。其查询几乎只是同时使用连接,聚合函数,子查询和窗口函数中的任两种或多种。
这就像用一组基本的乐高积木搭建一些东西。你可以创造出惊人、复杂和原创的东西,但你很少开发出从未知道的特别的作品。
相比之下,Python就像一套专门的乐高积木。每个库都有自己定制的积木从而使自己的建造趋于专门化:用于视觉效果的Seaborn,用于分析的pandas,用于机器学习的scikit-learn等等。
这些库的效率也大大提高。以前需要几十行的SQL代码(或根本不可能)现在只需用Python就能完成。使用SQL,如果沿着某条路走下去,你可能会发现一种更好的方法来重整我当下的事。在Python中,在对现有方法进行调整提高的同时,你可以试图寻找一种新方法来解决问题。
用谷歌查询
发布专业作品的“Python社区”是一个庞大而蓬勃发展的群体。“SQL社区”是微软和甲骨文SEO的素材。形成这种群体的原因是其本身要讨论的主题,但效果很明显——在线找到真正支持的Python资源要容易得多。
也许更重要的是,Python的结构有助于其以SQL难以实现的方式寻找答案。因为Python有更多的部分,并且它往往更多地从它正在处理的数据中抽象出来,所以人们可以轻松地共享库和块的脚本。有人分享如何创建箱线图的例子,该例子可以提供代码并说“在这里引用您的数据。”你可以使用飞行数据集来学习如何使用pandas .boxplot()的方法来创建箱形图,随后转而使用用户应用程序数据中的.boxplot()方法。
另一方面,SQL查询与数据密切相关。你必须知道查询的表和列的名称是否有意义,这往往使得分享示例变得更加困难。向某人展示如何使用SQL绘制箱形图必须得共享数据,这可能使人们更不愿意去分享他们的工作。
若给你充足的时间,你可以搞明白SQL查询的现有功能。但在创建或查看Python笔记时,有时你不得不承认:你无法完全了解现有情况。例如,要理解SciPy函数,必须浏览大量文档或几层源代码。实际上,这不会发生。相反,你可以经常找到他们貌似在应用的操作,将这些操作插入,并查看其返回的值是否与你的预期相一致。
这是拥有如此广泛的社区资源和库的缺点。这没有什么不对的(真的,并且它不像任何人,完全理解GROUP BY的真正功能),但是对于Python,特别是当技术文档比代码本身更不容易理解的时候,很多人更倾向于相信结果。
创建分析网络
在SQL中工作时,查询通常会线性发展。本文主要使用SQL来聚合和连接来自大型数据集的数据,如下所示:
1.对一组数据表格进行联接。
2.把表整合成更小的部分。
3.再对表进行联接。
4.再次聚合。
5.依此类推,直到得出一个包含12行数据的巨型查询表。
虽然查询持续时间很长,但它们通常不难在心理上建模——数据通过子查询线性向上移动。数据就像一个正滚下山丘的雪球——它收集和压缩更多的表,直到它变成一个完美的雪球(或产生灾难性的雪崩)。
Python流程更加流畅。不少人经常采用初始数据集并将其分解为许多较小的数据集,并且每个数据集都成为分析的线程。你可以将这些线程组合在一起,并以不同的方式将它们分开。
这需要你在心理上将你的分析建模为网络,这很难做到。你不能再想“我最左边的表格是什么?我要联接什么?”这些问题了。相反,你必须思考:“什么表格最适合分割成许多视图?我该对这些视图进行怎样的整合使其具有意义?”与Python的“碎片”一样,这种“网络”思维方式提供了比SQL更宽松的框架,这种框架使那些习惯于使用更紧密框架的人感到不安。
SQL的线性特性意味着如果想在分析中添加一些最好是在开始的时候引入的视图,必须对查询进行备份,然后将该结果一直传递回来。它很麻烦,即使其操作像通过几层子查询添加一列那样简单。
在其他情况下,一次性追求不同的想法需要一个核心查询进行多次探索。这些独立的查询在以后很难合并在分析中,由于在所有这些探索中都需要进行调整,所以在早期更改内容时会使问题复杂化。
Python基于Web的工作流程的优点是可以更轻松地跳过并更快地迭代。可以在不同的位置添加和删除内容,这样就可以在相同的工作流程中提出问题。由于每个分析探索都可以指向同一个核心,因此在不同的分析点之间移动会更为自然。
而且,通常它的计算速度更快。最令人沮丧的莫过于编写一个长时间运行的SQL查询却发现想在最外层查询中添加的一个额外的列。Python允许我们将此更改直接应用到我的最后一步,而不必每次都重新运行整个操作。