
你是一名熟悉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。编码愉快!
2800

被折叠的 条评论
为什么被折叠?



