
对于所有与数据科学和机器学习相关的任务来说,决定模型性能的最重要因素取决于我们的数据有多好。Python Pandas 和 SQL 是可以帮助高效提取和处理数据的强大工具。通过将这两种工具结合在一起,数据分析师甚至可以对大型数据集进行复杂的分析。在本文中,我们将探讨如何将 Python Pandas 与 SQL 结合起来,以提高数据分析的质量。
在一起使用 Pandas 和 SQL 之前。首先,我们将介绍 Pandas 和 SQL 的功能及其主要特点。
Pandas 是一个用 Python 编程语言编写的软件库,用于数据操作和分析。它提供对表格、数据结构和时间序列数据的操作。
SQL 是结构化查询语言(structured Query Language)的缩写,用于提取、管理和操作关系数据库。它通过整合实体和变量之间的关系来处理结构化数据。它允许插入、更新、删除和管理表中存储的数据。
将 Pandas 和 SQL 结合使用可使代码更具可读性,而且在某些情况下更易于实现。对于复杂的工作流程来说,SQL 查询比 Pandas 代码更清晰、更易读。此外,大多数关系数据都来自数据库,而 SQL 是处理关系数据的主要工具之一。这也是数据分析师和数据科学家等专业人士喜欢集成其功能的主要原因之一。
要将 SQL 查询与 Pandas 结合起来,需要在两者之间架起一座共同的桥梁,因此为了解决这个问题,“pandasql”应运而生。Pandasql 允许你直接在 Pandas 中运行 SQL 查询。这样,我们就可以无缝地使用 SQL 语法,而无需离开动态的 Pandas 环境。
将 Pandas 和 SQL 结合使用的之一步是将 pandasql 安装到我们的环境中。
pip install pandasql

安装完成后,我们就可以将 pandasql 导入代码,并用它在 Pandas DataFrame 上执行 SQL 查询。
安装完成后,我们就可以导入 pandasql 并开始探索它了。
import pandas as pd
import pandasql as psql
# Create a sample DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie'], 'Age': [25, 30, 35]}
df = pd.DataFrame(data)
# SQL query to select all data
query = "SELECT * FROM df"
result = psql.sqldf(query, locals())
result

让我们分解一下代码
导入所有库后,就可以使用 pandasql 进行数据分析了。下面将举例说明如何通过结合 Pandas 和 SQL 来增强数据分析。要做到这一点
# Required libraries import pandas as pd import pandasql as ps import plotly.express as px import ipywidgets as widgets # Load the dataset car_data = pd.read_csv("cars_datasets.csv") car_data.head()

让我们来分解代码
在本节中,我们将尝试通过探索列名、特征的数据类型以及数据是否存在空值等来熟悉数据。
# Display column names column_names = car_data.columns column_names """ Output: Index(['Unnamed: 0', 'price', 'brand', 'model', 'year', 'title_status', 'mileage', 'color', 'vin', 'lot', 'state', 'country', 'condition'], dtype='object') ""”
# Display dataset info car_data.info() """ Ouput: <class 'pandas.core.frame.DataFrame'> RangeIndex: 2499 entries, 0 to 2498 Data columns (total 13 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Unnamed: 0 2499 non-null int64 1 price 2499 non-null int64 2 brand 2499 non-null object 3 model 2499 non-null object 4 year 2499 non-null int64 5 title_status 2499 non-null object 6 mileage 2499 non-null float64 7 color 2499 non-null object 8 vin 2499 non-null object 9 lot 2499 non-null int64 10 state 2499 non-null object 11 country 2499 non-null object 12 condition 2499 non-null object dtypes: float64(1), int64(4), object(8) memory usage: 253.9+ KB """
# Check for null values car_data.isnull().sum() """Output: Unnamed: 0 0 price 0 brand 0 model 0 year 0 title_status 0 mileage 0 color 0 vin 0 lot 0 state 0 country 0 condition 0 dtype: int64 """
将数据集加载到工作流程后。现在,我们将开始执行数据分析。
现在,让我们尝试使用 pandasql 运行一些查询来分析上述数据集。
首先,让我们从整个数据集中找出前 10 名最昂贵的汽车。
def q(query):
return ps.sqldf(query, {'car_data': car_data})
q("""
SELECT brand, model, year, price
FROM car_data
ORDER BY price DESC
LIMIT 10
""")

让我们分解一下代码
在这里,我们将找到每个品牌汽车的平均价格。
def q(query):
return ps.sqldf(query, {'car_data': car_data})
q("""
SELECT brand, ROUND(AVG(price), 2) AS avg_price
FROM car_data
GROUP BY brand
ORDER BY avg_price DESC""")

让我们分解一下代码
让我们列出 2015 年后生产的汽车。
def q(query):
return ps.sqldf(query, {'car_data': car_data})
q("""
SELECT *
FROM car_data
WHERE year > 2015
ORDER BY year DESC
""")

让我们分解一下代码
现在我们来查找每个品牌生产的汽车总数。
def q(query):
return ps.sqldf(query, {'car_data': car_data})
q("""
SELECT brand, COUNT(*) as total_listed
FROM car_data
GROUP BY brand
ORDER BY total_listed DESC
LIMIT 5
""")

让我们分解一下代码
让我们看看如何根据条件对汽车进行分组。在这里,条件列显示了列表添加的时间或剩余时间。据此,我们可以对汽车进行分类,并得到它们的平均价格。
def q(query):
return ps.sqldf(query, {'car_data': car_data})
q("""
SELECT condition, ROUND(AVG(price), 2) AS avg_price, COUNT(*) as listings
FROM car_data
GROUP BY condition
ORDER BY avg_price DESC
""")

让我们分解一下代码
在这里,我们将找到每个品牌汽车的平均里程数和平均价格。
def q(query):
return ps.sqldf(query, {'car_data': car_data})
q("""
SELECT brand,
ROUND(AVG(mileage), 2) AS avg_mileage,
ROUND(AVG(price), 2) AS avg_price,
COUNT(*) AS total_listings
FROM car_data
GROUP BY brand
ORDER BY avg_price DESC
LIMIT 10
""")

让我们分解一下代码
现在,让我们根据计算得出的里程比(即各品牌汽车每英里的平均价格)对热门品牌进行排序。
def q(query):
return ps.sqldf(query, {'car_data': car_data})
q("""
SELECT brand,
ROUND(AVG(price/mileage), 4) AS price_per_mile,
COUNT(*) AS total
FROM car_data
WHERE mileage > 0
GROUP BY brand
ORDER BY price_per_mile DESC
LIMIT 10
""")

让我们分解一下代码
在这里,查询会计算每个品牌的每英里价格,然后显示每个品牌具有该特定每英里价格的汽车。按每英里价格降序排列。
在这里,我们将查找并绘制特定城市中每个品牌的汽车数量。
state_dropdown = widgets.Dropdown(
options=car_data['state'].unique().tolist(),
value=car_data['state'].unique()[0],
description='Select State:',
layout=widgets.Layout(width='50%')
)
def plot_avg_price_state(state_selected):
query = f"""
SELECT brand, AVG(price) AS avg_price
FROM car_data
WHERE state = '{state_selected}'
GROUP BY brand
ORDER BY avg_price DESC
"""
result = q(query)
fig = px.bar(result, x='brand', y='avg_price', color='brand',
title=f"Average Car Price in {state_selected}")
fig.show()
widgets.interact(plot_avg_price_state, state_selected=state_dropdown)

让我们分解一下代码
有关笔记本和此处使用的数据集,请访问
尽管 pandasql 提供了许多高效的功能和使用 Pandas 运行 SQL 查询的便捷 *** ,但它也有一些局限性。在本节中,我们将探讨这些局限性,并尝试找出何时该依赖传统的 Pandas 或 SQL,何时该使用 pandasql。
将 Pandas 和 SQL 结合使用可显著改善数据分析工作流程。利用 pandasql,可以在 DataFrames 中无缝运行 SQL 查询。这有助于那些熟悉 SQL 但又想在 Python 环境中工作的人。Pandas 和 SQL 的集成结合了两者的灵活性,为数据处理和分析开辟了新的可能性。有了它,人们可以提高应对各种数据挑战的能力。不过,在处理大型复杂数据集时,也要考虑到 pandasql 的局限性,并探索其他 *** 。
宝塔面板中的网站管理是非常重要的一部分,也是站长经常需要使用到的功能模块。网站管理,主要用于管理和创建WEB站点。如果您是宝塔面板的使用用户,应该对此模块有充分的了解,以便于您更高效地管理网站。 宝塔面板网站管理模块包括:添加新网站、修改默认页、设置默认站点、站点列表、站点的运行与停止、备份站点、...
每台连接到Internet的计算机都有一个Internet协议 (IP) 地址。但是,并非所有IP地址的外观或行为都相同。 如果您使用计算机网络或服务器,了解动态IP和静态IP之间的区别至关重要。通过详细了解每个协议,您可以选择最适合您需求的解决方案。 在本文中,我们将讨论静态和动态IP之间...
宝塔面板其中一个最为便捷的功能之一,无需SFTP或者FTP即可对服务器的文件内容进行上传、下载、编辑及删除等管理操作。 文件管理,用于管理该服务器上的文件内容。 文件的基础操作 文件的基础操作有哪些了,主要有这些方面:复制、粘贴、剪切、删除、重命名、压缩、刷新、新建文件、新建目录。...
宝塔面板提供丰富的软件以一键安装,这让服务器环境搭建提供不少的便利性,站长可以根据实际需求快速编译安装以实现不同的功能需求。 软件管理,主要是宝塔提供的一些面板扩展插件。 Nginx Nginx是一个高性能的HTTP和反向代理服务器,具有轻量级、占用内存小,并发能力强等优势。 w...
想成为一名网络开发人员或好奇工作的哪些子类型的薪水最高?Web开发是一个竞争激烈、多样化的行业,随着新语言和框架的出现而不断发展。 询问Web开发人员的薪水是一个难以解决的问题(尽管我们尝试)。有太多的因素需要考虑。 无论您是自由开发者还是有兴趣从事更传统的工作、喜欢前端或后端工作,或者想知...
Node.js和PHP是Web开发工作中常用的两种基本Web技术。两者都为服务器端开发做出了贡献,Node.js甚至同时服务于客户端和服务器端开发。 PHP已经为开发人员服务了近3年,现在它为78%的网络提供支持。相比之下,Node.js相对较新,但扩展速度非常快,由于其全栈开发能力而成为流行...