DuckDB:使用DuckDB进行Python数据分析指南

Duck
你是一名熟悉SQL和Python的开发者吗?如果是这样,你可能想开始使用DuckDB——一个进程内OLAP数据库——来进行数据分析。

SQL是查询数据库的语言,是你数据工具箱中最重要的语言。所以当你切换到Python时,你可能会考虑使用pandas——从各种来源读取数据到数据框中并进行分析。

但是,如果能够使用SQL查询pandas数据框以及CSV和Parquet文件等数据源,岂不是更好?DuckDB让你可以做到这一点,还能做更多。在本教程中,我们将学习如何在Python中使用DuckDB来分析数据。让我们开始吧!

设置环境

首先,创建并激活一个虚拟环境:

$ python3 -m venv v1
$ source v1/bin/activate

接下来安装duckdb:

因为我们还将生成示例数据来使用,所以我们还需要NumPy和Pandas:

$ pip3 install numpy pandas

使用DuckDB查询数据

快速安装完成后,我们可以继续进行一些数据分析。

注意:与数据库交互时通常使用连接。你可以使用duckdb.connect()与内存数据库和持久存储一起工作。

• 使用duckdb.connect()连接到仅在会话期间存在的内存数据库。这适用于快速分析,特别是当你不需要长期存储结果时。

• 要在会话和查询之间持久化数据,请像这样传递文件路径给connect()函数:duckdb.connect('my_database.db')

但我们将会查询CSV文件,不需要连接对象。所以这只是一个提示,当你查询数据库时可以参考。

生成示例CSV文件

▶️你可以在这个GitHub仓库中找到本教程的代码。

我们将创建一个模拟销售数据集,包含几个csv文件,包括产品详细信息、价格、销售数量以及销售发生的地区。在你的项目文件夹中运行generate_csv.py来生成两个CSV文件:sales_data.csv和product_details.csv。

在DuckDB中使用CSV文件时,你可以将文件读入一个关系表:duckdb.read_csv(‘your_file.csv’),然后查询它。或者你可以直接与文件一起工作并像这样查询它们:

import duckdb

duckdb.sql("SELECT * FROM 'sales_data.csv' LIMIT 5").df()

你可以使用df()如示例中所示保存查询结果。

现在让我们运行一些(真正有帮助的)SQL查询来分析CSV文件中的数据。

示例查询1:按地区计算总销售额

为了了解哪个地区产生了最多的收入,我们可以计算每个地区的总销售额。你可以通过将每个产品的价格乘以销售数量,然后为每个地区求和来计算总销售额。

# 计算每个地区的总销售额(价格 * 销售数量)
query = """
SELECT Region, SUM(Price * Quantity_Sold) as Total_Sales
FROM 'sales_data.csv'
GROUP BY Region
ORDER BY Total_Sales DESC
"""
total_sales = duckdb.sql(query).df()

print("每个地区的总销售额:")
print(total_sales)

这个查询输出:

每个地区的总销售额:
  Region      Total_Sales
0   East  454590.49
1  South  426352.72
2   West  236804.52
3  North  161048.07

示例查询2:找出销售量最高的前5个产品

接下来,我们想要识别按销售数量计算的前5个畅销产品。这可以让我们了解哪些产品在所有地区的表现最好。

# 找出按销售数量计算的前5个畅销产品
query = """
SELECT Product_Name, SUM(Quantity_Sold) as Total_Quantity
FROM 'sales_data.csv'
GROUP BY Product_Name
ORDER BY Total_Quantity DESC
LIMIT 5
"""
top_products = duckdb.sql(query).df()

print("销售量最高的前5个产品:")
print(top_products)

这给出了销售量最高的前5个产品:

销售量最高的前5个产品:
  Product_Name  Total_Quantity
0   Product_42         99.0
1   Product_97         98.0
2   Product_90         96.0
3   Product_27         94.0
4   Product_54         94.0

示例查询3:按地区计算平均价格

我们还可以计算每个地区销售产品的平均价格,以识别地区之间的任何价格差异。

# 计算每个地区销售产品的平均价格
query = """
SELECT Region, AVG(Price) as Average_Price
FROM 'sales_data.csv'
GROUP BY Region
"""
avg_price_region = duckdb.sql(query).df()

print("每个地区的平均价格:")
print(avg_price_region)

这个查询计算每个地区销售产品的平均价格,并按地区分组返回结果:

每个地区的平均价格:
  Region      Average_Price
0  North  263.119167
1   East  288.035625
2   West  200.139000
3  South  254.894722

示例查询4:按地区计算销售总量

为了进一步分析数据,我们可以计算每个地区销售产品的总量。这有助于我们看到哪个地区在销售量方面最活跃。

# 计算每个地区销售产品的总量
query = """
SELECT Region, SUM(Quantity_Sold) as Total_Quantity
FROM 'sales_data.csv'
GROUP BY Region
ORDER BY Total_Quantity DESC
"""
total_quantity_region = duckdb.sql(query).df()

print("每个地区销售的总量:")
print(total_quantity_region)

这个查询计算每个地区的销售总量,并按降序排序结果,显示哪个地区销售的产品最多:

每个地区销售的总量:
  Region  Total_Quantity
0  South       1714.0
1   East       1577.0
2   West       1023.0
3  North        588.0

示例查询5:连接CSV文件

DuckDB提供了几个高级功能,使其在数据分析中非常多功能。例如,你可以轻松地连接多个CSV文件以进行更复杂的查询,或者查询存储在磁盘上的大型数据集,而无需将它们全部加载到内存中。

这个SQL JOIN查询通过匹配公共列:Product_ID的行,将两个CSV文件,sales_data.csv和product_details.csv组合起来。

query = """
SELECT s.Product_Name, s.Region, s.Price, p.Manufacturer
FROM 'sales_data.csv' s
JOIN 'product_details.csv' p
ON s.Product_ID = p.Product_ID
"""
joined_data = duckdb.sql(query).df()

print(joined_data.head())

这应该输出:

     Product_Name  Region   Price   Manufacturer
0   Product_1  North  283.08  Manufacturer_4
1   Product_2   East  325.94  Manufacturer_3
2   Product_3   West   39.54  Manufacturer_2
3   Product_4  South  248.82  Manufacturer_4
4   Product_5   East  453.62  Manufacturer_5

总结

在本教程中,我们查看了如何使用DuckDB进行Python数据分析。

我们使用了CSV文件。但你可以以相同的方式使用parquet和JSON文件以及关系数据库。所以,是的,DuckDB是分析Python中大型数据集的有用工具,也是你的Python数据分析工具箱中相当有用的补充。

我建议在你的下一个数据分析项目中使用DuckDB。编码愉快!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值