SQL vs Pandas vs AI Agents: Which Solves Analytics Problems Best?
TL;DR · AI 摘要
SQL vs Pandas vs AI Agents: Which Solves Analytics Problems Best? - KDnuggets publ: 7-Jul, 2026 - Blog Top Posts About -...
核心要点
- 主题聚焦:SQL vs Pandas vs AI Agents: Which Solves Analyti
- 来源:KDnuggets,建议结合原文判断细节。
- AI 分析暂不可用,本条为保底评分与摘要。
SQL vs Pandas vs AI Agents: 哪种工具最擅长解决分析问题? - KDnuggets
publ: 2026年7月7日
- 博客热门文章
- 主题 AI 职业建议 计算机视觉 数据工程 数据科学 语言模型 机器学习 MLOps NLP 编程 Python SQL
- 数据集
- 活动
- 资源 快速参考指南 推荐 技术简报
- 广告
订阅电子报
#header end
/ad_wrapper
SQL vs Pandas vs AI Agents: 哪种工具最擅长解决分析问题?
相同的三个分析问题,三种工具,八个维度,通过实际执行时间和真实代理提示进行测量。
作者:
Nate Rosidi
,KDnuggets 市场趋势与SQL内容专家,2026年7月7日发布于
数据科学
<div class="addthis_native_toolbox"></div>
# 引言
我们将StrataScratch的三个相同面试题分别交给SQL、Pandas和Claude代理进行处理。所有代码均在相同数据集上执行,所有时间数据均为500次运行的中位数。代理的回答完全来自于Claude对明确提示的响应,而非假设性示例。
该比较涵盖八个维度:速度、准确性、可解释性、调试能力、可扩展性、灵活性、幻觉风险和生产就绪性。三个问题分别对应简单、中等和困难难度级别。问题难度越高,SQL、Pandas和代理之间的差异越明显。
# 我们如何进行这项比较
这三个问题来自StrataScratch面试题库,涵盖简单、中等和困难难度级别。SQL在SQLite内存数据库中运行,经过500次运行计时,取中位数。Pandas在Python 3.12的相同数据集上运行,同样经过500次运行。代理使用Anthropic API调用的Claude的claude-sonnet-4-6模型。
每个问题都有独立的基于模式的用户提示,包含表名、列名和少量示例行。以下系统提示对三次调用保持一致。代理响应时间从请求发送到首次接收令牌的时间进行测量。
# 简单检索:三方达成一致
来自Meta的第一个面试题要求找出执行过至少一次scroll_up操作的所有用户,并返回唯一的用户ID。数据存储在名为facebook_web_log的单个表中。
#### // 数据
这是facebook_web_log表的结构。
user_id
timestamp
action
0
2019-04-25 13:30:15
page_load
2019-04-25 13:30:18
2019-04-25 13:30:40
scroll_down
2019-04-25 13:30:45
scroll_up
…
page_exit
#### // SQL代码解决方案(0.002毫秒)
SELECT DISTINCT user_id
FROM facebook_web_log
WHERE action = 'scroll_up';#### // Pandas代码解决方案(0.40毫秒)
import pandas as pd
result = (
facebook_web_log[facebook_web_log['action'] == 'scroll_up']
.drop_duplicates(subset='user_id')[['user_id']]
)#### // 代理提示
表: facebook_web_log (user_id INTEGER, action TEXT, timestamp TEXT)
示例行:
(1, 'scroll_up', '2019-01-01 00:00:00')
(2, 'scroll_down', '2019-01-01 00:01:00')
(3, 'like', '2019-01-01 00:03:00')
(2, 'scroll_up', '2019-01-01 00:04:00')
问题: 找出执行过至少一次scroll_up操作的所有用户。
返回唯一的用户ID。#### // 代理输出(2秒)
输出: 三方均返回用户1和2。
2
1
在单过滤器问题中,代理能够精确匹配SQL语句。在此难度下,唯一真正的风险是列名命名。如果提示中没有模式信息,操作可能会返回event_type或event_name,这将导致无结果返回且不报错。
# 多步骤聚合:模式对齐最关键的部分
第二个问题涉及产品功能完成度计算。某款应用会跟踪每个用户完成产品功能集的进度,其中每个功能都有固定步数。
任务是计算所有用户中每个功能的平均完成百分比,用户的完成度等于其达到的最大步数除以该功能的总步数,再乘以100。从未开始某个功能的用户会被计为0%完成度。
该任务涉及两个表:facebook_product_features:
feature_id
n_steps
5
7
3
和facebook_product_features_realizations:
step_reached
2019-03-11 17:15:00
2019-03-11 17:22:00
2019-03-11 17:25:00
4
2019-03-11 17:27:00
...
2019-04-05 13:00:07
#### // SQL编码解决方案(0.007 ms)
WITH max_step AS (
SELECT
feature_id,
user_id,
MAX(step_reached) AS max_step_reached
FROM facebook_product_features_realizations
GROUP BY feature_id, user_id
),
calc_per_feature AS (
SELECT
feats.feature_id,
n_steps,
max_step_reached,
COALESCE(max_step_reached, 0) * 1.0 / n_steps AS share_of_completion
FROM facebook_product_features feats
LEFT OUTER JOIN max_step
ON feats.feature_id = max_step.feature_id
)
SELECT
feature_id,
AVG(share_of_completion) * 100 AS avg_share_of_completion
FROM calc_per_feature
GROUP BY feature_id;#### // Pandas编码解决方案(2.05 ms)
import pandas as pd
# 每个用户每个功能的最大步数
max_step = (
facebook_product_features_realizations
.groupby(['feature_id', 'user_id'])['step_reached']
.max()
.reset_index()
)
# 与功能表连接,为从未开始的用户填充0
df = pd.merge(
facebook_product_features,
max_step,
how='outer',
on='feature_id'
).fillna(0)
# 每个用户-功能行的完成百分比
df['share_of_completion'] = (df['step_reached'] / df['n_steps']) * 100
# 每个功能的平均值
result = (
df.groupby('feature_id')['share_of_completion']
.mean()
.to_frame('avg_share_of_completion')
.reset_index()
)表结构:
- facebook_product_features (feature_id INTEGER, n_steps INTEGER)
- facebook_product_features_realizations
(feature_id INTEGER, user_id INTEGER, step_reached INTEGER, timestamp TEXT)
问题:为每个功能计算所有用户的平均完成百分比
用户完成度 = max(step_reached) / n_steps * 100
从未开始的用户计为0%完成度
返回:feature_id, avg_share_of_completion.#### // 代理输出(3秒)
WITH user_max_steps AS (
SELECT feature_id, user_id, MAX(step_reached) AS max_step
FROM facebook_product_features_realizations
GROUP BY feature_id, user_id
)
SELECT
f.feature_id,
ROUND(AVG(COALESCE(ums.max_step, 0) * 100.0 / f.n_steps), 2) AS avg_share_of_completion
FROM facebook_product_features f
LEFT JOIN user_max_steps ums ON f.feature_id = ums.feature_id
GROUP BY f.feature_id
ORDER BY f.feature_id;输出结果:三种方法返回的数值完全一致。
avg_share_of_completion
80
76.19
代理在这里理解正确,是因为提示中明确说明:“从未开始的用户计为0%完成。”这句话至关重要。如果没有这句话,代理会编写内连接语句——这会过滤掉未开始的用户——导致所有平均值都会上升。这种失败是静默的。返回的数字看似正常,但实际上是错误的。要发现这个错误,必须知道预期的输出结果。
# 多张表与窗口逻辑:三个都正确,但有一个慢很多
第三个问题涉及Meta在三个地区数据中心的能源消耗情况。每个地区都有自己的表格:fb_eu_energy、fb_na_energy和fb_asia_energy。
任务是将它们合并,按日期汇总消耗量,并生成两列衍生数据:累计运行总量以及该总量占总总量的百分比(四舍五入为整数)。
每个区域表的结构相同。
fb_eu_energy :
记录日期 | 能耗 ---|--- 2020-01-01 | 400 2020-01-02 | 350 2020-01-03 | 500 2020-01-04 | 2020-01-07 | 600
fb_na_energy :
250 375 2020-01-06
fb_asia_energy :
675 2020-01-05 1200 750
#### // SQL编码解决方案(0.010 ms)
WITH total_energy AS (
SELECT recorded_date, consumption FROM fb_eu_energy
UNION ALL
SELECT recorded_date, consumption FROM fb_asia_energy
UNION ALL
SELECT recorded_date, consumption FROM fb_na_energy
),
energy_by_date AS (
SELECT
recorded_date,
SUM(consumption) AS total_energy
FROM total_energy
GROUP BY recorded_date
ORDER BY recorded_date ASC
)
SELECT
recorded_date,
SUM(total_energy) OVER (
ORDER BY recorded_date ASC
) AS cumulative_total_energy,
ROUND(
SUM(total_energy) OVER (ORDER BY recorded_date ASC) * 100.0
/ (SELECT SUM(total_energy) FROM energy_by_date),
0
) AS percentage_of_total_energy
FROM energy_by_date;#### // Pandas编码解决方案(1.84 ms)
import pandas as pd
merged_df = pd.concat([fb_eu_energy, fb_asia_energy, fb_na_energy])
energy_by_date = (
merged_df.groupby('recorded_date', as_index=False)['consumption']
.sum()
.sort_values('recorded_date')
)
energy_by_date['cumulative_total_energy'] = energy_by_date['consumption'].cumsum()
energy_by_date['percentage_of_total_energy'] = round(
energy_by_date['cumulative_total_energy'] * 100 / energy_by_date['consumption'].sum()
)
energy_by_date['recorded_date'] = pd.to_datetime(
energy_by_date['recorded_date']
).dt.strftime('%Y-%m-%d')
result = energy_by_date[
['recorded_date', 'cumulative_total_energy', 'percentage_of_total_energy']
]表:
- fb_eu_energy (recorded_date TEXT, consumption INTEGER)
- fb_na_energy (recorded_date TEXT, consumption INTEGER)
- fb_asia_energy (recorded_date TEXT, consumption INTEGER)
问题:合并所有三张表。按日期汇总能耗。输出:
- recorded_date
- cumulative_total_energy (按日期排序的累计总能耗)
- percentage_of_total_energy (累计总量/总总量*100,四舍五入到最近的整数)#### // 代理输出(4秒)
WITH all_energy AS (
SELECT recorded_date, consumption FROM fb_eu_energy
UNION ALL
SELECT recorded_date, consumption FROM fb_na_energy
UNION ALL
SELECT recorded_date, consumption FROM fb_asia_energy
),
daily_totals AS (
SELECT recorded_date, SUM(consumption) AS daily_total
FROM all_energy
GROUP BY recorded_date
)
SELECT
recorded_date,
SUM(daily_total) OVER (ORDER BY recorded_date) AS cumulative_total_energy,
ROUND(
SUM(daily_total) OVER (ORDER BY recorded_date) * 100.0
/ SUM(daily_total) OVER (),
0
) AS percentage_of_total_energy
FROM daily_totals
ORDER BY recorded_date;输出:所有三种方法返回相同的表格。
累计总能耗 | 占总能耗百分比 --- | --- 1050 | 13 2175 | 27 3275 | 40 4450 | 55 5650 | 69 6900 | 85 8150 | 100
代理使用了 SUM(daily_total) OVER ()(无 ORDER BY 的窗口函数)作为分母,而不是参考解决方案中的标量子查询。两种方法都有效。输出结果完全一致。
# 三者对比
#### // 速度
在当前数据规模下,SQL 的执行时间为 0.002-0.010 毫秒,Pandas 为 0.4-2.1 毫秒。代理在任何 SQL 执行之前增加了 2-4 秒的大语言模型(LLM)推理时间。
代理首先生成代码;该生成时间是每个查询周期的端到端延迟。在仓库规模下,一旦生成代码,差距缩小到接近零;SQL 因在数据库引擎内部运行而进一步加速;Pandas 在约 1000 万行时遇到内存限制,需要 Apache Spark 或 Polars 来处理更大规模数据。
#### // 准确性与幻觉风险
SQL 和 Pandas 具有确定性。相同代码在相同数据上每次执行结果都一致。使用模式约束的提示时,Claude 三个问题都回答正确,但每次调用生成的 SQL 不同(CTE 名称不同、列别名不同、但等效的实现方式不同)。没有模式时,幻觉风险会迅速上升。
#### // 可解释性与调试
SQL 查询可以一次性阅读。错误的连接条件在文本中直接可见。Pandas 需要 Python 语言能力,但可以在每个步骤检查 DataFrame。代理用英语解释推理过程,然后生成代码(可能展示也可能不展示)。如果生成的 SQL 错误,需要追踪模型推理链中的错误,而不是检查自己编写的查询。
#### // 灵活性与生产就绪性
Pandas 是自定义转换、字符串解析和迭代特征工程最清晰的选择。SQL 能干净处理集合逻辑,但处理过程性工作时会变得冗长。代理在回答普通英文请求时表现良好,但当模式复杂或模糊时一致性最差。在生产环境中,SQL 是最经过验证的分析选项;Pandas 通过测试可靠;代理在低风险查询或输出执行前经过审查时也可靠。
# 代理结果实际展示的内容
使用模式约束提示时,Claude 正确回答了所有三个问题:简单、中等和困难。代理针对困难问题的 SQL 使用了与参考解决方案不同的窗口函数模式,但仍返回了正确的表格。
两个因素限制了这一发现。首先,可重复性:对于相同的问题,每次API调用可能返回不同的SQL语句。虽然逻辑是等价的,但团队在审查代理生成的查询时,需要验证输出结果,而不能依赖今天正确的执行结果与明天保持一致。其次,模式依赖性:上述提示信息包含了表名、列名以及示例行。如果移除了这些信息,代理将只能进行猜测。
在简单难度下,错误的猜测会产生空结果。在困难难度下,错误的猜测会产生看似合理但错误的结果且不会报错。
实际应用中的模式是:提供完整的模式定义,要求生成SQL语句,然后在结果流向下游之前运行并验证输出。
# 结论
当正确使用时,SQL、Pandas和Claude在三个分析问题上都给出了相同的正确答案。它们的差异体现在速度(0.01毫秒 vs 4秒)、可重复性,以及在减少上下文时的表现。
SQL适用于结构化检索和基于集合的逻辑,具有毫秒级执行速度和确定性输出。Pandas适用于自定义转换和逐步的笔记本工作流程,可处理约1000万行数据。代理适用于初步查询和即兴探索,其提示信息中包含完整模式定义,且需要人工审核输出结果。
代理通过使用SUM() OVER()而非标量子查询正确回答了困难问题,这是一种有效的解决方案,而SQL的参考方案并未采用这种方法。这是本次比较的诚实版本:代理可以生成正确且富有创造性的SQL语句。它只是增加了延迟,不同运行结果可能不同,并且完全依赖于提示信息中的内容。
Nate Rosidi是数据科学家兼产品战略专家。他还是分析学的兼职教授,同时也是StrataScratch平台的创始人,该平台帮助数据科学家通过顶尖公司的真题准备面试。Nate撰写有关职业市场最新趋势的文章,提供面试建议,分享数据科学项目,并涵盖所有与SQL相关的内容。
更多相关内容
- 超越基础的SQL窗口函数:解决实际业务问题
- RAG vs 微调:哪个是增强LLM应用的最佳工具?
- Kaggle竞赛对实际问题有帮助吗?
- LangChain正在评估的LLM六大问题
- 使用基础与现代方法解决计算机科学问题
- Python问题调试基础
<hr class="grey-line"><br> <div><h3>我们推荐的五大免费课程</h3><br> </div>
Mailchimp for WordPress v4.13.1 - https://wordpress.org/plugins/mailchimp-for-wp/
/ Mailchimp for WordPress插件
您可以从这里开始编辑。
如果评论已关闭。
<= 上一篇文章
#content end
<script type="text/javascript">kda_sid_write(kda_sid_n);</script>
最新文章
- SQL vs Pandas vs AI代理:谁最擅长解决分析问题?零样本本地文档解析与Gemma 4:将PDF作为图像处理 机器学习的10个概率概念简单解释 数据科学家正在成为AI经理,而非模型构建者 与Hugging Face ML实习:你的第一个ML代理 5种让小型语言模型推动下一代代理的方案
热门文章
- 2026年你应该了解的10个智能代理AI框架
- 2026年你可以构建的7个真实世界Python项目(附指南)
- Python中使用Claude API入门
- 构建本地AI系统:Qwen3.6 + MCPs
- 5个为开发者提供最佳价值的AI编码订阅计划
- 你的 RAG 流水线可能毫无用处。这里有一个更好的替代方案
- 5 个 AI 编程平台,无需头疼即可构建应用
- 2026 年可在本地运行的 7 模型
- 数据科学家正在成为 AI 管理者,而非模型构建者
- 5 个智能代理工作流,用于自动化你的数据科学流水线
#content_wrapper end
© 2026
Guiding Tech Media
|
关于
联系方式
广告合作
隐私政策
服务条款
2026 年 7 月 7 日由 Nate Rosidi 发布
blank
不,谢谢!
/.main_wrapper
<script defer type="text/javascript" src="https://s7.addthis.com/js/300/addthis_widget.js#pubid=gpsaddthis"></script>
noptimize
/noptimize