pandas和sql各自擅长的领域

版主: hci

头像
TheMatrix楼主
论坛支柱
论坛支柱
2024年度优秀版主
TheMatrix 的博客
帖子互动: 283
帖子: 13768
注册时间: 2022年 7月 26日 00:35

#1 pandas和sql各自擅长的领域

帖子 TheMatrix楼主 »

知乎这篇讲pandas和sql各自擅长的领域。pandas我不是特别熟,不过我看就下面这段pandas代码,完全用sql也是很容易的。

https://www.zhihu.com/question/40269042 ... 1877217409

代码: 全选

import pandas as pd
from sqlalchemy import create_engine

# 假设你已经配置好了数据库连接
db_connection_str = 'mysql+pymysql://user:password@host/dbname'
db_connection = create_engine(db_connection_str)

# 读取SQL查询的结果到DataFrame
# 注意,这里是读取查询结果,不是全表!
sql_query = """
SELECT
    product_id,
    product_name,
    quantity,
    price,
    order_time
FROM
    orders
WHERE
    order_time >= '2023-10-01' AND order_time < '2023-11-01'
    AND category = 'A';
"""
df = pd.read_sql(sql_query, con=db_connection)

# --- 现在进入Pandas的主场 ---

# 1. 数据清洗(假设有缺失值)
df.dropna(inplace=True)

# 2. 计算每个订单的销售额
df['sales'] = df['quantity'] * df['price']

# 3. 按产品ID分组,计算总销售额和总销量,找出爆款
product_summary = df.groupby('product_id').agg(
    total_sales=('sales', 'sum'),
    total_quantity=('quantity', 'sum'),
    product_name=('product_name', 'first') # 顺便把名字带出来
).sort_values(by='total_sales', ascending=False)

print("--- 销售额 Top 10 爆款 ---")
print(product_summary.head(10))

# 4. 分析周内销售趋势,看看周末是不是卖得好
df['order_time'] = pd.to_datetime(df['order_time'])
df['weekday'] = df['order_time'].dt.dayofweek # 0=周一, 6=周日
weekday_sales = df.groupby('weekday')['sales'].sum()

print("\n--- 周内销售分布 ---")
print(weekday_sales)

# 5. 接下来你还可以做可视化、跑关联规则、做价格敏感度分析……
# 这些复杂的、探索性的操作,用SQL写会非常非常痛苦,但在Pandas里就是几行代码的事。

+1.00 积分 [版主 hci 发放的奖励]
头像
hci(海螺子)
论坛支柱
论坛支柱
帖子互动: 534
帖子: 10413
注册时间: 2022年 7月 22日 15:29

#2 Re: pandas和sql各自擅长的领域

帖子 hci(海螺子) »

pandas其实更高层,可以用sql来实现pandas的函数。

TheMatrix 写了: 2025年 10月 18日 10:40

知乎这篇讲pandas和sql各自擅长的领域。pandas我不是特别熟,不过我看就下面这段pandas代码,完全用sql也是很容易的。

https://www.zhihu.com/question/40269042 ... 1877217409

代码: 全选

import pandas as pd
from sqlalchemy import create_engine

# 假设你已经配置好了数据库连接
db_connection_str = 'mysql+pymysql://user:password@host/dbname'
db_connection = create_engine(db_connection_str)

# 读取SQL查询的结果到DataFrame
# 注意,这里是读取查询结果,不是全表!
sql_query = """
SELECT
    product_id,
    product_name,
    quantity,
    price,
    order_time
FROM
    orders
WHERE
    order_time >= '2023-10-01' AND order_time < '2023-11-01'
    AND category = 'A';
"""
df = pd.read_sql(sql_query, con=db_connection)

# --- 现在进入Pandas的主场 ---

# 1. 数据清洗(假设有缺失值)
df.dropna(inplace=True)

# 2. 计算每个订单的销售额
df['sales'] = df['quantity'] * df['price']

# 3. 按产品ID分组,计算总销售额和总销量,找出爆款
product_summary = df.groupby('product_id').agg(
    total_sales=('sales', 'sum'),
    total_quantity=('quantity', 'sum'),
    product_name=('product_name', 'first') # 顺便把名字带出来
).sort_values(by='total_sales', ascending=False)

print("--- 销售额 Top 10 爆款 ---")
print(product_summary.head(10))

# 4. 分析周内销售趋势,看看周末是不是卖得好
df['order_time'] = pd.to_datetime(df['order_time'])
df['weekday'] = df['order_time'].dt.dayofweek # 0=周一, 6=周日
weekday_sales = df.groupby('weekday')['sales'].sum()

print("\n--- 周内销售分布 ---")
print(weekday_sales)

# 5. 接下来你还可以做可视化、跑关联规则、做价格敏感度分析……
# 这些复杂的、探索性的操作,用SQL写会非常非常痛苦,但在Pandas里就是几行代码的事。
nemo1936(卡西莫多)
职业作家
职业作家
帖子互动: 190
帖子: 538
注册时间: 2023年 10月 18日 11:21

#3 Re: pandas和sql各自擅长的领域

帖子 nemo1936(卡西莫多) »

其实就是rdms和大数据hadoop生态的区别

sql可以算是语言,但panda是框架framework,两者不是一类东西

各自可容纳的scale完全不同,数据管理机制也不同,

代码和语法可以比较但还有更深层的区别

LightFast
见习点评
见习点评
帖子互动: 90
帖子: 1362
注册时间: 2022年 7月 21日 09:24

#4 Re: pandas和sql各自擅长的领域

帖子 LightFast »

nemo1936 写了: 2025年 10月 18日 16:43

其实就是rdms和大数据hadoop生态的区别

sql可以算是语言,但panda是框架framework,两者不是一类东西

各自可容纳的scale完全不同,数据管理机制也不同,

代码和语法可以比较但还有更深层的区别

Pandas是python的函数库,可以一步一步进行,调试编程方便。sql要实现复杂的功能编程调试debug就很不方便了。

wildthing
著名点评
著名点评
帖子互动: 281
帖子: 4565
注册时间: 2022年 7月 22日 14:25

#5 Re: pandas和sql各自擅长的领域

帖子 wildthing »

TheMatrix 写了: 2025年 10月 18日 10:40

知乎这篇讲pandas和sql各自擅长的领域。pandas我不是特别熟,不过我看就下面这段pandas代码,完全用sql也是很容易的。

https://www.zhihu.com/question/40269042 ... 1877217409

代码: 全选

import pandas as pd
from sqlalchemy import create_engine

# 假设你已经配置好了数据库连接
db_connection_str = 'mysql+pymysql://user:password@host/dbname'
db_connection = create_engine(db_connection_str)

# 读取SQL查询的结果到DataFrame
# 注意,这里是读取查询结果,不是全表!
sql_query = """
SELECT
    product_id,
    product_name,
    quantity,
    price,
    order_time
FROM
    orders
WHERE
    order_time >= '2023-10-01' AND order_time < '2023-11-01'
    AND category = 'A';
"""
df = pd.read_sql(sql_query, con=db_connection)

# --- 现在进入Pandas的主场 ---

# 1. 数据清洗(假设有缺失值)
df.dropna(inplace=True)

# 2. 计算每个订单的销售额
df['sales'] = df['quantity'] * df['price']

# 3. 按产品ID分组,计算总销售额和总销量,找出爆款
product_summary = df.groupby('product_id').agg(
    total_sales=('sales', 'sum'),
    total_quantity=('quantity', 'sum'),
    product_name=('product_name', 'first') # 顺便把名字带出来
).sort_values(by='total_sales', ascending=False)

print("--- 销售额 Top 10 爆款 ---")
print(product_summary.head(10))

# 4. 分析周内销售趋势,看看周末是不是卖得好
df['order_time'] = pd.to_datetime(df['order_time'])
df['weekday'] = df['order_time'].dt.dayofweek # 0=周一, 6=周日
weekday_sales = df.groupby('weekday')['sales'].sum()

print("\n--- 周内销售分布 ---")
print(weekday_sales)

# 5. 接下来你还可以做可视化、跑关联规则、做价格敏感度分析……
# 这些复杂的、探索性的操作,用SQL写会非常非常痛苦,但在Pandas里就是几行代码的事。

完全不是一个类型的东西。

Pandas是个in memory的tabular data library

SQL是个domain specific query language.

如果是说SQL DB可能更恰当一点。SQL DB是一种persistent data storage system. 和pandas最大的区别是它是client/server architecture and persistent.

这两者唯一的共同点是都是实现relational algebra

x1 图片
司马光在《资治通鉴》中说日本人:'知小礼而无大义,拘小节而无大德。重末节而无廉耻,畏威而不怀德。强必盗寇,弱必卑伏'。
康熙皇帝在《康熙朝起居注》中这样评论日本人:“倭子国,最是反复无常之国。其人,甚卑贱,不知世上有恩谊,只一味慑于武威……故尔,不得对其有稍许好颜色。”

图片
cernivtsi
知名作家
知名作家
帖子互动: 81
帖子: 825
注册时间: 2025年 1月 5日 03:03

#6 Re: pandas和sql各自擅长的领域

帖子 cernivtsi »

有了DuckDB,不用再Pandas了

cernivtsi
知名作家
知名作家
帖子互动: 81
帖子: 825
注册时间: 2025年 1月 5日 03:03

#7 Re: pandas和sql各自擅长的领域

帖子 cernivtsi »

Client/Server SQL DB 已死 (for OLAP)

wildthing 写了: 2025年 10月 18日 16:56

完全不是一个类型的东西。

Pandas是个in memory的tabular data library

SQL是个domain specific query language.

如果是说SQL DB可能更恰当一点。SQL DB是一种persistent data storage system. 和pandas最大的区别是它是client/server architecture and persistent.

这两者唯一的共同点是都是实现relational algebra

头像
hci(海螺子)
论坛支柱
论坛支柱
帖子互动: 534
帖子: 10413
注册时间: 2022年 7月 22日 15:29

#8 Re: pandas和sql各自擅长的领域

帖子 hci(海螺子) »

为啥?

cernivtsi 写了: 2025年 10月 18日 16:59

Client/Server SQL DB 已死 (for OLAP)

SunnyA
论坛点评
论坛点评
帖子互动: 61
帖子: 2045
注册时间: 2022年 8月 3日 19:47

#9 Re: pandas和sql各自擅长的领域

帖子 SunnyA »

TheMatrix 写了: 2025年 10月 18日 10:40

知乎这篇讲pandas和sql各自擅长的领域。pandas我不是特别熟,不过我看就下面这段pandas代码,完全用sql也是很容易的。

https://www.zhihu.com/question/40269042 ... 1877217409

代码: 全选

import pandas as pd
from sqlalchemy import create_engine

# 假设你已经配置好了数据库连接
db_connection_str = 'mysql+pymysql://user:password@host/dbname'
db_connection = create_engine(db_connection_str)

# 读取SQL查询的结果到DataFrame
# 注意,这里是读取查询结果,不是全表!
sql_query = """
SELECT
    product_id,
    product_name,
    quantity,
    price,
    order_time
FROM
    orders
WHERE
    order_time >= '2023-10-01' AND order_time < '2023-11-01'
    AND category = 'A';
"""
df = pd.read_sql(sql_query, con=db_connection)

# --- 现在进入Pandas的主场 ---

# 1. 数据清洗(假设有缺失值)
df.dropna(inplace=True)

# 2. 计算每个订单的销售额
df['sales'] = df['quantity'] * df['price']

# 3. 按产品ID分组,计算总销售额和总销量,找出爆款
product_summary = df.groupby('product_id').agg(
    total_sales=('sales', 'sum'),
    total_quantity=('quantity', 'sum'),
    product_name=('product_name', 'first') # 顺便把名字带出来
).sort_values(by='total_sales', ascending=False)

print("--- 销售额 Top 10 爆款 ---")
print(product_summary.head(10))

# 4. 分析周内销售趋势,看看周末是不是卖得好
df['order_time'] = pd.to_datetime(df['order_time'])
df['weekday'] = df['order_time'].dt.dayofweek # 0=周一, 6=周日
weekday_sales = df.groupby('weekday')['sales'].sum()

print("\n--- 周内销售分布 ---")
print(weekday_sales)

# 5. 接下来你还可以做可视化、跑关联规则、做价格敏感度分析……
# 这些复杂的、探索性的操作,用SQL写会非常非常痛苦,但在Pandas里就是几行代码的事。

这么简单的问题,怎么还值得讨论呢?我都不是干这行的都觉得太简单。

头像
TheMatrix楼主
论坛支柱
论坛支柱
2024年度优秀版主
TheMatrix 的博客
帖子互动: 283
帖子: 13768
注册时间: 2022年 7月 26日 00:35

#10 Re: pandas和sql各自擅长的领域

帖子 TheMatrix楼主 »

SunnyA 写了: 2025年 10月 18日 21:40

这么简单的问题,怎么还值得讨论呢?我都不是干这行的都觉得太简单。

讨论的是用pandas和用sql哪个更好。

SunnyA
论坛点评
论坛点评
帖子互动: 61
帖子: 2045
注册时间: 2022年 8月 3日 19:47

#11 Re: pandas和sql各自擅长的领域

帖子 SunnyA »

TheMatrix 写了: 2025年 10月 18日 21:42

讨论的是用pandas和用sql哪个更好。

这显然是个很简单问题。读取raw data用sql, 处理用pd. 完全不值得讨论啊。原帖主说的百万数据也不算大啊。

x1 图片
头像
TheMatrix楼主
论坛支柱
论坛支柱
2024年度优秀版主
TheMatrix 的博客
帖子互动: 283
帖子: 13768
注册时间: 2022年 7月 26日 00:35

#12 Re: pandas和sql各自擅长的领域

帖子 TheMatrix楼主 »

SunnyA 写了: 2025年 10月 18日 21:46

这显然是个很简单问题。读取raw data用sql, 处理用pd. 完全不值得讨论啊。原帖主说的百万数据也不算大啊。

哦。可以啊。

pandas我不是很熟。但是这个问题直接完全用sql也很容易。也就是说pandas的优势到底在哪?

cernivtsi
知名作家
知名作家
帖子互动: 81
帖子: 825
注册时间: 2025年 1月 5日 03:03

#13 Re: pandas和sql各自擅长的领域

帖子 cernivtsi »

hci 写了: 2025年 10月 18日 21:33

为啥?

单条 512GB DDR5 量产,内存涨到TB级别,直接内嵌式DB,省掉了networking,page scan ...

wildthing
著名点评
著名点评
帖子互动: 281
帖子: 4565
注册时间: 2022年 7月 22日 14:25

#14 Re: pandas和sql各自擅长的领域

帖子 wildthing »

TheMatrix 写了: 2025年 10月 18日 21:48

哦。可以啊。

pandas我不是很熟。但是这个问题直接完全用sql也很容易。也就是说pandas的优势到底在哪?

sql 如果出错,麻烦的很。不是在程序内部调试是个很痛苦的事情
所以微软有搞linq
pandas不过是继承R的dataframe搞得内存内部的数据库。
现在内存足够大,很多原来数据库装的东西可以调到内存直接处理。

搞统计分析的好多是程序盲。你让他们从数据库调东西会要他们的命。

司马光在《资治通鉴》中说日本人:'知小礼而无大义,拘小节而无大德。重末节而无廉耻,畏威而不怀德。强必盗寇,弱必卑伏'。
康熙皇帝在《康熙朝起居注》中这样评论日本人:“倭子国,最是反复无常之国。其人,甚卑贱,不知世上有恩谊,只一味慑于武威……故尔,不得对其有稍许好颜色。”

图片
wildthing
著名点评
著名点评
帖子互动: 281
帖子: 4565
注册时间: 2022年 7月 22日 14:25

#15 Re: pandas和sql各自擅长的领域

帖子 wildthing »

cernivtsi 写了: 2025年 10月 18日 21:53

单条 512GB DDR5 量产,内存涨到TB级别,直接内嵌式DB,省掉了networking,page scan ...

in memory DB is still DB. The basic client/server architecture does not change just because the server is in memory.

DB uses data structures like B-Tree to organize indexed tables to allow fast look up.

DB also has other properties that are important for fault tolerance. ACID properties, for example, are not available in Pandas.
Transaction management is also important for massive parallel services.

DB is huge area. Don't underestimate its importance.

x2 图片
上次由 wildthing 在 2025年 10月 19日 09:08 修改。
司马光在《资治通鉴》中说日本人:'知小礼而无大义,拘小节而无大德。重末节而无廉耻,畏威而不怀德。强必盗寇,弱必卑伏'。
康熙皇帝在《康熙朝起居注》中这样评论日本人:“倭子国,最是反复无常之国。其人,甚卑贱,不知世上有恩谊,只一味慑于武威……故尔,不得对其有稍许好颜色。”

图片
头像
TheMatrix楼主
论坛支柱
论坛支柱
2024年度优秀版主
TheMatrix 的博客
帖子互动: 283
帖子: 13768
注册时间: 2022年 7月 26日 00:35

#16 Re: pandas和sql各自擅长的领域

帖子 TheMatrix楼主 »

wildthing 写了: 2025年 10月 18日 21:54

sql 如果出错,麻烦的很。不是在程序内部调试是个很痛苦的事情
所以微软有搞linq
pandas不过是继承R的dataframe搞得内存内部的数据库。
现在内存足够大,很多原来数据库装的东西可以调到内存直接处理。

搞统计分析的好多是程序盲。你让他们从数据库调东西会要他们的命。

“搞统计分析的好多是程序盲”,你是说他们不会写sql?还是不会写pandas?

pandas我也学了几次,每次都感觉和sql功能是重复的,所以我还是用的sql。

cernivtsi
知名作家
知名作家
帖子互动: 81
帖子: 825
注册时间: 2025年 1月 5日 03:03

#17 Re: pandas和sql各自擅长的领域

帖子 cernivtsi »

TheMatrix 写了: 2025年 10月 18日 22:00

“搞统计分析的好多是程序盲”,你是说他们不会写sql?还是不会写pandas?

pandas我也学了几次,每次都感觉和sql功能是重复的,所以我还是用的sql。

正确的,越来越没必要学pandas

用嵌入式DB,如DuckDB,已可替代pandas,不但适于快速原型 + 数据探索,在大数据 + 高性能分析更胜一筹

x1 图片
头像
hci(海螺子)
论坛支柱
论坛支柱
帖子互动: 534
帖子: 10413
注册时间: 2022年 7月 22日 15:29

#18 Re: pandas和sql各自擅长的领域

帖子 hci(海螺子) »

可内存还是很贵呀,云上面的VM也是高内存的贵很多。

cernivtsi 写了: 2025年 10月 18日 21:53

单条 512GB DDR5 量产,内存涨到TB级别,直接内嵌式DB,省掉了networking,page scan ...

cernivtsi
知名作家
知名作家
帖子互动: 81
帖子: 825
注册时间: 2025年 1月 5日 03:03

#19 Re: pandas和sql各自擅长的领域

帖子 cernivtsi »

hci 写了: 2025年 10月 18日 22:27

可内存还是很贵呀,云上面的VM也是高内存的贵很多。


股价暴涨,嘿嘿

头像
hci(海螺子)
论坛支柱
论坛支柱
帖子互动: 534
帖子: 10413
注册时间: 2022年 7月 22日 15:29

#20 Re: pandas和sql各自擅长的领域

帖子 hci(海螺子) »

你这图很高级呀,还是活的图。

cernivtsi 写了: 2025年 10月 18日 22:29


股价暴涨,嘿嘿

回复

回到 “葵花宝典(Programming)”