使用 DuckDB 在 Python 中进行数据分析的指南
了解如何使用 DuckDB 在 Python 中执行数据分析。
您是熟悉 SQL 和 Python 的开发人员吗?如果是这样,您可能需要开始使用 DuckDB(一种进程内 OLAP 数据库)进行数据分析。
SQL 是查询数据库的语言,并且是数据工具箱中最重要的语言。因此,当您切换到 Python 时,您可能会看到 pandas——将来自各种来源的数据读入数据帧并对其进行分析。
但是,使用 SQL 查询 pandas 数据帧以及 CSV 和 Parquet 文件等数据源不是很好吗? DuckDB 可以让您做到这一点以及更多。在本教程中,我们将学习如何在 Python 中使用 DuckDB 来分析数据。让我们开始吧!
设置环境
首先,创建并激活虚拟环境:
$ python3 -m venv v1
$ source v1/bin/activate
接下来安装duckdb:
$ pip3 install 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:按区域计算总销售额
要了解哪个地区产生的收入最多,我们可以计算每个地区的总销售额。您可以通过将每种产品的价格乘以销售数量并将每个区域的总销售额相加来计算总销售额。
# Calculate total sales (Price * Quantity_Sold) per region
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("Total sales per region:")
print(total_sales)
该查询输出:
Total sales per region:
Region Total_Sales
0 East 454590.49
1 South 426352.72
2 West 236804.52
3 North 161048.07
示例查询 2:查找前 5 个最畅销产品
接下来,我们要根据销售数量确定前 5 名最畅销的产品。这可以让我们深入了解哪些产品在所有地区表现最好。
# Find the top 5 best-selling products by quantity
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("Top 5 best-selling products:")
print(top_products)
这给出了销售额最高的前 5 个产品:
Top 5 best-selling products:
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:按区域计算平均价格
我们还可以计算每个地区销售的产品的平均价格,以识别地区之间的价格差异。
# Calculate the average price of products by region
query = """
SELECT Region, AVG(Price) as Average_Price
FROM 'sales_data.csv'
GROUP BY Region
"""
avg_price_region = duckdb.sql(query).df()
print("Average price per region:")
print(avg_price_region)
此查询计算每个区域销售的产品的平均价格并返回按区域分组的结果:
Average price per region:
Region Average_Price
0 North 263.119167
1 East 288.035625
2 West 200.139000
3 South 254.894722
示例查询 4:按地区销售的总数量
为了进一步分析数据,我们可以计算出每个地区销售的产品总量。这有助于我们了解哪些地区的销售活动数量最多。
# Calculate total quantity sold by region
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("Total quantity sold per region:")
print(total_quantity_region)
此查询计算每个区域的总销售量,并按降序对结果进行排序,显示哪个区域销售的产品最多:
Total quantity sold per region:
Region Total_Quantity
0 South 1714.0
1 East 1577.0
2 West 1023.0
3 North 588.0
示例查询 4:加入 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
总结
在本教程中,我们了解了如何通过 Python 使用 DuckDB 进行数据分析。
我们使用 CSV 文件。但您可以以相同的方式使用 parquet 和 JSON 文件以及关系数据库。所以,是的,DuckDB 是一个用 Python 分析大型数据集的有用工具,也是 Python 数据分析工具包的一个非常有用的补充。
我建议在你的下一个数据分析项目中使用 DuckDB。快乐编码!