分页: 1 / 5

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

发表于 : 2025年 10月 18日 10:40
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里就是几行代码的事。

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

发表于 : 2025年 10月 18日 16:33
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里就是几行代码的事。

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

发表于 : 2025年 10月 18日 16:43
nemo1936

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

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

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

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


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

发表于 : 2025年 10月 18日 16:49
LightFast
nemo1936 写了: 2025年 10月 18日 16:43

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

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

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

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

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


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

发表于 : 2025年 10月 18日 16:56
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


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

发表于 : 2025年 10月 18日 16:57
cernivtsi

有了DuckDB,不用再Pandas了


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

发表于 : 2025年 10月 18日 16:59
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


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

发表于 : 2025年 10月 18日 21:33
hci

为啥?

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

Client/Server SQL DB 已死 (for OLAP)


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

发表于 : 2025年 10月 18日 21:40
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里就是几行代码的事。

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


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

发表于 : 2025年 10月 18日 21:42
TheMatrix
SunnyA 写了: 2025年 10月 18日 21:40

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

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


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

发表于 : 2025年 10月 18日 21:46
SunnyA
TheMatrix 写了: 2025年 10月 18日 21:42

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

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


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

发表于 : 2025年 10月 18日 21:48
TheMatrix
SunnyA 写了: 2025年 10月 18日 21:46

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

哦。可以啊。

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


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

发表于 : 2025年 10月 18日 21:53
cernivtsi
hci 写了: 2025年 10月 18日 21:33

为啥?

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


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

发表于 : 2025年 10月 18日 21:54
wildthing
TheMatrix 写了: 2025年 10月 18日 21:48

哦。可以啊。

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

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

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


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

发表于 : 2025年 10月 18日 21:58
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.


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

发表于 : 2025年 10月 18日 22:00
TheMatrix
wildthing 写了: 2025年 10月 18日 21:54

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

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

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

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


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

发表于 : 2025年 10月 18日 22:10
cernivtsi
TheMatrix 写了: 2025年 10月 18日 22:00

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

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

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

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


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

发表于 : 2025年 10月 18日 22:27
hci

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

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

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


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

发表于 : 2025年 10月 18日 22:29
cernivtsi
hci 写了: 2025年 10月 18日 22:27

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


股价暴涨,嘿嘿


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

发表于 : 2025年 10月 18日 22:53
hci

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

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


股价暴涨,嘿嘿