SQL в Pandas с Pandasql
Использование SQL в Pandas с помощью библиотеки Pandasql
Если вы можете добавить только одну навык – и неоспоримо самый важный – в свой арсенал данных, это SQL . В экосистеме анализа данных на языке Python, однако, pandas – мощная и популярная библиотека.
Но, если вы новичок в pandas, знакомство с функциями pandas – по группировке, агрегации, объединению и т. д. – может быть ошеломляющим. Гораздо проще запросить свои фреймы данных с помощью SQL. Библиотека pandasql позволяет делать именно это!
Итак, давайте научимся использовать библиотеку pandasql для выполнения SQL-запросов в фрейме данных pandas на примере набора данных.
- На сколько мы близки к ИИ общего интеллекта?
- Виталий Романченко, Генеральный директор и сооснователь компании Elai – Серия интервью
- 10 лучших ChatGPT предложений для разработки стратегии контента
Первые шаги с Pandasql
Прежде чем мы продолжим, давайте настроим нашу рабочую среду.
Установка pandasql
Если вы используете Google Colab, вы можете установить pandasql с помощью `pip` и выполнить код:
pip install pandasql
Если вы используете Python на своем локальном компьютере, убедитесь, что у вас уже установлены pandas и Seaborn в отдельной виртуальной среде для этого проекта. Вы можете использовать встроенный пакет venv для создания и управления виртуальными средами.
Я использую Python 3.11 в Ubuntu LTS 22.04. Поэтому следующая инструкция предназначена для Ubuntu (она также должна работать на Mac). Если вы работаете на компьютере с операционной системой Windows, следуйте этим инструкциям для создания и активации виртуальных сред.
Чтобы создать виртуальную среду (v1 здесь), выполните следующую команду в своем рабочем каталоге:
python3 -m venv v1
Затем активируйте виртуальное окружение:
source v1/bin/activate
Теперь установите pandas, seaborn и pandasql:
pip3 install pandas seaborn pandasql
Примечание : Если у вас еще не установлен `pip`, вы можете обновить системные пакеты и установить его, выполнив команду: apt install python3-pip
.
Функция `sqldf`
Чтобы выполнить SQL-запросы в фрейме данных pandas, вы можете импортировать и использовать sqldf
с следующим синтаксисом:
from pandasql import sqldf sqldf (query, globals ())
Здесь
-
query
представляет собой SQL-запрос, который вы хотите выполнить в фрейме данных pandas. Он должен быть строкой, содержащей допустимый SQL-запрос. -
globals ()
указывает глобальное пространство имен, в котором определены используемые в запросе фреймы данных.
Запрос фрейма данных pandas с помощью pandasql
Начнем с импорта необходимых пакетов и функции sqldf
из pandasql:
import pandas as pd import seaborn as sns from pandasql import sqldf
Поскольку мы будем выполнять несколько запросов в фрейме данных, мы можем определить функцию, чтобы мы могли вызывать ее, передавая запрос в качестве аргумента:
# Определим повторноиспользуемую функцию для выполнения SQL-запросовrun_query = lambda query: sqldf (query, globals ())
Для всех последующих примеров мы будем использовать функцию run_query
(которая использует функцию sqldf()
внутри) для выполнения SQL-запроса в dataframe tips_df
. Затем мы выведем полученный результат.
Загрузка набора данных
В рамках данного руководства мы будем использовать набор данных “tips”, встроенный в библиотеку Seaborn. Набор данных “tips” содержит информацию о чаевых в ресторане, включающую общую сумму счета, сумму чаевых, пол плательщика, день недели и другое.
Загрузим набор данных “tip” в dataframe tips_df
:
# Загрузка набора данных "tips" в pandas dataframetips_df = sns.load_dataset("tips")
Пример 1 – Выбор данных
Далее приведен наш первый запрос – простой оператор SELECT:
# Простой запрос на выборкуquery_1 = """SELECT *FROM tips_dfLIMIT 10;"""result_1 = run_query(query_1)print(result_1)
Как видно, этот запрос выбирает все столбцы из dataframe tips_df
и ограничивает вывод первыми 10 строками с помощью ключевого слова `LIMIT`. Это эквивалентно выполнению tips_df.head(10)
в pandas:
Пример 2 – Фильтрация на основе условия
Теперь давайте напишем запрос для фильтрации результатов на основе условий:
# Фильтрация на основе условияquery_2 = """SELECT *FROM tips_dfWHERE total_bill > 30 AND tip > 5;"""result_2 = run_query(query_2)print(result_2)
Этот запрос фильтрует dataframe tips_df
на основе условия, указанного в предложении WHERE. Он выбирает все столбцы из dataframe tips_df
, где значение столбца ‘total_bill’ больше 30 и значение столбца ‘tip’ больше 5.
Выполнение query_2
дает следующий результат:
Пример 3 – Группировка и агрегация
Давайте выполним следующий запрос, чтобы получить среднюю сумму счета, сгруппированную по дням:
# Группировка и агрегацияquery_3 = """SELECT day, AVG(total_bill) as avg_billFROM tips_dfGROUP BY day;"""result_3 = run_query(query_3)print(result_3)
Вот результат:
Мы видим, что средняя сумма счета в выходные немного выше.
Давайте рассмотрим еще один пример группировки и агрегаций. Рассмотрим следующий запрос:
query_4 = """SELECT day, COUNT(*) as num_transactions, AVG(total_bill) as avg_bill, MAX(tip) as max_tipFROM tips_dfGROUP BY day;"""result_4 = run_query(query_4)print(result_4)
Запрос query_4
группирует данные в dataframe tips_df
по столбцу ‘day’ и вычисляет следующие агрегатные функции для каждой группы:
num_transactions
: количество транзакций,avg_bill
: среднее значение столбца ‘total_bill’, иmax_tip
: максимальное значение столбца ‘tip’.
Как видно, мы получаем вышеуказанные значения, сгруппированные по дням:
Пример 4 – Подзапросы
Добавим пример запроса, который использует подзапрос:
# подзапросыquery_5 = """SELECT *FROM tips_dfWHERE total_bill > (SELECT AVG(total_bill) FROM tips_df);"""result_5 = run_query(query_5)print(result_5)
Здесь,
- Внутренний подзапрос вычисляет среднее значение столбца ‘total_bill’ из dataframe
tips_df
. - Затем внешний запрос выбирает все столбцы из dataframe
tips_df
, где ‘total_bill’ больше вычисленного среднего значения.
Запуск query_5
дает следующий результат:
Пример 5 – Объединение двух DataFrame
У нас есть только один dataframe. Чтобы выполнить простое объединение, давайте создадим другой dataframe следующим образом:
# Создаем еще один DataFrame для объединения с tips_dfother_data = pd.DataFrame({ 'day': ['Thur','Fri', 'Sat', 'Sun'], 'special_event': ['Throwback Thursday', 'Feel Good Friday', 'Social Saturday','Fun Sunday', ]})
Dataframe other_data
связывает каждый день со специальным событием.
Теперь выполним LEFT JOIN между dataframe tips_df
и dataframe other_data
по общему столбцу ‘day’:
query_6 = """SELECT t.*, o.special_eventFROM tips_df tLEFT JOIN other_data o ON t.day = o.day;"""result_6 = run_query(query_6)print(result_6)
Вот результат операции объединения:
Завершение и следующие шаги
В этом руководстве мы рассмотрели, как выполнять SQL-запросы на pandas-фреймворках с помощью pandasql. Хотя pandasql делает запросы к dataframe с использованием SQL очень простыми, есть некоторые ограничения.
Основное ограничение состоит в том, что pandasql может работать в несколько раз медленнее, чем нативный pandas. И что же следует делать? Если вам нужно выполнять анализ данных с помощью pandas, вы можете использовать pandasql для запросов dataframe при изучении pandas — и быстро продолжать. На более поздних этапах вы можете перейти на pandas или другую библиотеку, например Polars, когда вы будете чувствовать себя уверенно с pandas.
Для первых шагов в этом направлении попробуйте написать и запустить аналогичные запросы pandas для SQL, которые мы уже выполнили. Все примеры кода, использованные в этом руководстве, находятся на GitHub. Продолжайте программировать! Bala Priya C – разработчица и технический писатель из Индии. Ей нравится работать в области математики, программирования, науки о данных и создания контента. Ее интересы и экспертиза включают DevOps, науку о данных и обработку естественного языка. Она любит чтение, письмо, программирование и кофе! В настоящее время она работает над изучением и обменом своими знаниями с сообществом разработчиков, создавая учебники, руководства, мнения и многое другое.